dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #37766
[Branch ~dhis2-devs-core/dhis2/trunk] Rev 19288: Moved heavy deps out of support commons
------------------------------------------------------------
revno: 19288
committer: Halvdan Hoem Grelland <halvdanhg@xxxxxxxxx>
branch nick: dhis2
timestamp: Fri 2015-06-05 00:08:39 +0200
message:
Moved heavy deps out of support commons
removed:
dhis-2/dhis-support/dhis-support-commons/src/main/java/org/hisp/dhis/util/GeoUtils.java
dhis-2/dhis-support/dhis-support-commons/src/main/java/org/hisp/dhis/util/JRExportUtils.java
added:
dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/GeoUtils.java
dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/JRExportUtils.java
modified:
dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/DefaultOrganisationUnitService.java
dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/report/impl/DefaultReportService.java
dhis-2/dhis-support/dhis-support-commons/pom.xml
dhis-2/dhis-support/dhis-support-system/pom.xml
dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/filter/OrganisationUnitPolygonCoveringCoordinateFilter.java
dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/GeoUtilsTest.java
dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/SvgConversionController.java
--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk
Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/DefaultOrganisationUnitService.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/DefaultOrganisationUnitService.java 2015-06-01 19:49:10 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/DefaultOrganisationUnitService.java 2015-06-04 22:08:39 +0000
@@ -52,7 +52,7 @@
import org.hisp.dhis.system.filter.OrganisationUnitPolygonCoveringCoordinateFilter;
import org.hisp.dhis.commons.filter.Filter;
import org.hisp.dhis.util.FilterUtils;
-import org.hisp.dhis.util.GeoUtils;
+import org.hisp.dhis.system.util.GeoUtils;
import org.hisp.dhis.system.util.ValidationUtils;
import org.hisp.dhis.user.CurrentUserService;
import org.hisp.dhis.user.User;
=== modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/report/impl/DefaultReportService.java'
--- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/report/impl/DefaultReportService.java 2015-05-28 18:21:56 +0000
+++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/report/impl/DefaultReportService.java 2015-06-04 22:08:39 +0000
@@ -52,7 +52,7 @@
import org.hisp.dhis.util.Encoder;
import org.hisp.dhis.commons.filter.Filter;
import org.hisp.dhis.util.FilterUtils;
-import org.hisp.dhis.util.JRExportUtils;
+import org.hisp.dhis.system.util.JRExportUtils;
import org.hisp.dhis.util.StreamUtils;
import org.hisp.dhis.system.velocity.VelocityManager;
import org.springframework.jdbc.datasource.DataSourceUtils;
=== modified file 'dhis-2/dhis-support/dhis-support-commons/pom.xml'
--- dhis-2/dhis-support/dhis-support-commons/pom.xml 2015-05-30 15:33:12 +0000
+++ dhis-2/dhis-support/dhis-support-commons/pom.xml 2015-06-04 22:08:39 +0000
@@ -14,6 +14,14 @@
<packaging>jar</packaging>
<name>DHIS Support Commons</name>
+ <!--
+ DHIS Support Commons is intended to be a lightweight library with very few and
+ no heavy dependencies, as well as no internal dependencies (DHIS modules).
+ This includes not depending on the dhis-support-test package, meaning any unit
+ tests must be added to an external package (dhis-support-system is a reasonable
+ choice). Please be wary of this when adding new dependencies.
+ -->
+
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
@@ -32,22 +40,6 @@
<artifactId>commons-jexl</artifactId>
</dependency>
<dependency>
- <groupId>org.geotools</groupId>
- <artifactId>gt-referencing</artifactId>
- </dependency>
- <dependency>
- <groupId>org.geotools</groupId>
- <artifactId>gt-geojson</artifactId>
- </dependency>
- <dependency>
- <groupId>com.vividsolutions</groupId>
- <artifactId>jts</artifactId>
- </dependency>
- <dependency>
- <groupId>net.sf.jasperreports</groupId>
- <artifactId>jasperreports</artifactId>
- </dependency>
- <dependency>
<groupId>org.scijava</groupId>
<artifactId>jep</artifactId>
</dependency>
=== removed file 'dhis-2/dhis-support/dhis-support-commons/src/main/java/org/hisp/dhis/util/GeoUtils.java'
--- dhis-2/dhis-support/dhis-support-commons/src/main/java/org/hisp/dhis/util/GeoUtils.java 2015-05-28 18:00:11 +0000
+++ dhis-2/dhis-support/dhis-support-commons/src/main/java/org/hisp/dhis/util/GeoUtils.java 1970-01-01 00:00:00 +0000
@@ -1,245 +0,0 @@
-package org.hisp.dhis.util;
-
-/*
- * Copyright (c) 2004-2015, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import com.vividsolutions.jts.geom.MultiPolygon;
-import com.vividsolutions.jts.geom.Point;
-import com.vividsolutions.jts.geom.Polygon;
-import org.apache.commons.lang3.StringUtils;
-import org.geotools.geojson.geom.GeometryJSON;
-import org.geotools.referencing.GeodeticCalculator;
-
-import java.awt.geom.Point2D;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @author Lars Helge Overland
- */
-public class GeoUtils
-{
- private static final Pattern SVG_TEXT_PATTERN = Pattern.compile( "text=\"(.*?)\"", Pattern.DOTALL );
-
- private static final String SVG_FONT_REGEX = "(\\s+)font=\"(.*?)\"";
-
- private static final String FEATURETYPE_POLYGON = "Polygon";
-
- private static final String FEATURETYPE_MULTIPOLYGON = "MultiPolygon";
-
- /**
- * Returns boundaries of a box shape which centre is the point defined by the
- * given longitude and latitude. The distance between the center point and the
- * edges of the box is defined in meters by the given distance. Based on standard
- * EPSG:4326 long/lat projection. The result is an array of length 4 where
- * the values at each index are:
- *
- * <ul>
- * <li>Index 0: Maximum latitude (north edge of box shape).</li>
- * <li>Index 1: Maxium longitude (east edge of box shape).</li>
- * <li>Index 2: Minimum latitude (south edge of box shape).</li>
- * <li>Index 3: Minumum longitude (west edge of box shape).</li>
- * </ul>
- *
- * @param longitude the longitude.
- * @param latitude the latitude.
- * @param distance the distance in meters to each box edge.
- * @return an array of length 4.
- */
- public static double[] getBoxShape( double longitude, double latitude, double distance )
- {
- double[] box = new double[4];
-
- GeodeticCalculator calc = new GeodeticCalculator();
- calc.setStartingGeographicPoint( longitude, latitude );
-
- calc.setDirection( 0, distance );
- Point2D north = calc.getDestinationGeographicPoint();
-
- calc.setDirection( 90, distance );
- Point2D east = calc.getDestinationGeographicPoint();
-
- calc.setDirection( 180, distance );
- Point2D south = calc.getDestinationGeographicPoint();
-
- calc.setDirection( -90, distance );
- Point2D west = calc.getDestinationGeographicPoint();
-
- box[0] = north.getY();
- box[1] = east.getX();
- box[2] = south.getY();
- box[3] = west.getX();
-
- return box;
- }
-
- /**
- * Computes the distance between two points.
- *
- * @param from the origin point.
- * @param to the end point.
- * @return the orthodromic distance between the given points.
- */
- public static double getDistanceBetweenTwoPoints( Point2D from, Point2D to)
- {
- GeodeticCalculator calc = new GeodeticCalculator();
- calc.setStartingGeographicPoint( from );
- calc.setDestinationGeographicPoint( to);
-
- return calc.getOrthodromicDistance();
- }
-
- /**
- * Get GeometryJSON point.
- *
- * @param longitude the longitude.
- * @param latitude the latitude.
- * @return the GeoJSON representation of the given point.
- */
- public static Point getGeoJsonPoint( double longitude, double latitude )
- throws IOException
- {
- Point point = null;
-
- GeometryJSON gtjson = new GeometryJSON();
-
- point = gtjson.readPoint( new StringReader( "{\"type\":\"Point\", \"coordinates\":[" + longitude + ","
- + latitude + "]}" ) );
-
- return point;
- }
-
- /**
- * Check if GeometryJSON point created with this coordinate is valid.
- *
- * @param latitude the latitude.
- * @param longitude the longitude.
- * @return true if the point is valid or false.
- */
- public static boolean checkGeoJsonPointValid( double longitude, double latitude )
- {
- try
- {
- return getGeoJsonPoint( longitude, latitude ).isValid();
- }
- catch ( Exception ex )
- {
- return false;
- }
- }
-
- /**
- * Check if the point coordinate falls within the polygon/MultiPolygon Shape
- *
- * @param longitude the longitude.
- * @param latitude the latitude.
- * @param multiPolygonJson the GeoJSON coordinates of the MultiPolygon
- * @param featureType the featureType of the MultiPolygon.
- */
- public static boolean checkPointWithMultiPolygon( double longitude, double latitude,
- String multiPolygonJson, String featureType )
- {
- try
- {
- boolean contains = false;
-
- GeometryJSON gtjson = new GeometryJSON();
-
- Point point = getGeoJsonPoint( longitude, latitude );
-
- if ( point != null && point.isValid() )
- {
- if ( featureType.compareTo( FEATURETYPE_POLYGON ) == 0 )
- {
- Polygon polygon = gtjson.readPolygon( new StringReader(
- "{\"type\":\"Polygon\", \"coordinates\":" + multiPolygonJson + "}" ) );
-
- contains = polygon.contains( point );
- }
- else if ( featureType.compareTo( FEATURETYPE_MULTIPOLYGON ) == 0 )
- {
- MultiPolygon multiPolygon = gtjson.readMultiPolygon( new StringReader(
- "{\"type\":\"MultiPolygon\", \"coordinates\":" + multiPolygonJson + "}" ) );
-
- contains = multiPolygon.contains( point );
- }
- }
-
- return contains;
- }
- catch ( Exception ex )
- {
- return false;
- }
- }
-
- /**
- * Escapes the String encoded SVG.
- * @param svg the String encoded SVG.
- * @return the escaped representation.
- */
- public static final String replaceUnsafeSvgText( String svg )
- {
- if ( svg == null )
- {
- return null;
- }
-
- svg = replaceText( svg );
- svg = replaceFont( svg );
-
- return svg;
- }
-
- private static String replaceText( String svg )
- {
- StringBuffer sb = new StringBuffer();
-
- Matcher textMatcher = SVG_TEXT_PATTERN.matcher( svg );
-
- while ( textMatcher.find() )
- {
- String text = textMatcher.group( 1 );
-
- if ( text != null && !text.isEmpty() )
- {
- text = "text=\"" + text.replaceAll( "[<>&]", "" ) + "\"";
- textMatcher.appendReplacement( sb, text );
- }
- }
-
- return textMatcher.appendTail( sb ).toString();
- }
-
- private static String replaceFont( String svg )
- {
- return svg.replaceAll( SVG_FONT_REGEX, StringUtils.EMPTY );
- }
-}
=== removed file 'dhis-2/dhis-support/dhis-support-commons/src/main/java/org/hisp/dhis/util/JRExportUtils.java'
--- dhis-2/dhis-support/dhis-support-commons/src/main/java/org/hisp/dhis/util/JRExportUtils.java 2015-05-28 18:00:11 +0000
+++ dhis-2/dhis-support/dhis-support-commons/src/main/java/org/hisp/dhis/util/JRExportUtils.java 1970-01-01 00:00:00 +0000
@@ -1,128 +0,0 @@
-package org.hisp.dhis.util;
-
-/*
- * Copyright (c) 2004-2015, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import net.sf.jasperreports.engine.JRAbstractExporter;
-import net.sf.jasperreports.engine.JRException;
-import net.sf.jasperreports.engine.JRExporterParameter;
-import net.sf.jasperreports.engine.JasperPrint;
-import net.sf.jasperreports.engine.export.JRHtmlExporter;
-import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
-import net.sf.jasperreports.engine.export.JRPdfExporter;
-import net.sf.jasperreports.engine.export.JRXlsAbstractExporterParameter;
-import net.sf.jasperreports.engine.export.JRXlsExporter;
-
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Supports PDF, HMTL and XLS exports.
- *
- * @author Lars Helge Overland
- */
-public class JRExportUtils
-{
- public static final String TYPE_XLS = "xls";
- public static final String TYPE_PDF = "pdf";
- public static final String TYPE_HTML = "html";
-
- private static final Map<String, JRExportProvider> exporters = new HashMap<String, JRExportProvider>() {
- {
- put( TYPE_XLS, new JRXlsExportProvider() );
- put( TYPE_PDF, new JRPdfExportProvider() );
- put( TYPE_HTML, new JRHtmlExportProvider() );
- } };
-
- /**
- * Export the provided JasperPrint the format given by type.
- *
- * @param type the type to export to. XLS, PDF and HTML are supported.
- * @param out the OutputStream to export to.
- * @param jasperPrint the JasperPrint to export.
- * @throws JRException on export failure.
- */
- public static void export( String type, OutputStream out, JasperPrint jasperPrint )
- throws JRException
- {
- JRExportProvider provider = exporters.get( type );
-
- if ( provider != null )
- {
- JRAbstractExporter exporter = provider.provide();
-
- exporter.setParameter( JRExporterParameter.OUTPUT_STREAM, out );
- exporter.setParameter( JRExporterParameter.JASPER_PRINT, jasperPrint );
- exporter.exportReport();
- }
- }
-
- private interface JRExportProvider
- {
- JRAbstractExporter provide();
- }
-
- private static class JRXlsExportProvider implements JRExportProvider
- {
- @Override
- public JRAbstractExporter provide()
- {
- JRXlsExporter exporter = new JRXlsExporter();
- exporter.setParameter( JRXlsAbstractExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE );
- exporter.setParameter( JRXlsAbstractExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE );
- exporter.setParameter( JRXlsAbstractExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE );
- exporter.setParameter( JRXlsAbstractExporterParameter.IS_COLLAPSE_ROW_SPAN, Boolean.TRUE );
- exporter.setParameter( JRXlsAbstractExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE );
- return exporter;
- }
- }
-
- private static class JRPdfExportProvider implements JRExportProvider
- {
- @Override
- public JRAbstractExporter provide()
- {
- return new JRPdfExporter();
- }
- }
-
- private static class JRHtmlExportProvider implements JRExportProvider
- {
- @Override
- public JRAbstractExporter provide()
- {
- JRHtmlExporter exporter = new JRHtmlExporter();
- exporter.setParameter( JRHtmlExporterParameter.IMAGES_URI, "../jasperReports/img?image=" );
-
- return exporter;
- }
- }
-}
-
-
=== modified file 'dhis-2/dhis-support/dhis-support-system/pom.xml'
--- dhis-2/dhis-support/dhis-support-system/pom.xml 2015-05-30 15:29:37 +0000
+++ dhis-2/dhis-support/dhis-support-system/pom.xml 2015-06-04 22:08:39 +0000
@@ -60,14 +60,25 @@
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
+
+ <!-- Geotools -->
+
+ <dependency>
+ <groupId>org.geotools</groupId>
+ <artifactId>gt-referencing</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.geotools</groupId>
+ <artifactId>gt-geojson</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.vividsolutions</groupId>
+ <artifactId>jts</artifactId>
+ </dependency>
<!-- JasperReports -->
<dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-core</artifactId>
- </dependency>
- <dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
</dependency>
@@ -90,6 +101,10 @@
<!-- Other -->
<dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-core</artifactId>
+ </dependency>
+ <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
=== modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/filter/OrganisationUnitPolygonCoveringCoordinateFilter.java'
--- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/filter/OrganisationUnitPolygonCoveringCoordinateFilter.java 2015-05-28 18:21:56 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/filter/OrganisationUnitPolygonCoveringCoordinateFilter.java 2015-06-04 22:08:39 +0000
@@ -30,7 +30,7 @@
import org.hisp.dhis.organisationunit.OrganisationUnit;
import org.hisp.dhis.commons.filter.Filter;
-import org.hisp.dhis.util.GeoUtils;
+import org.hisp.dhis.system.util.GeoUtils;
public class OrganisationUnitPolygonCoveringCoordinateFilter
implements Filter<OrganisationUnit>
=== added file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/GeoUtils.java'
--- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/GeoUtils.java 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/GeoUtils.java 2015-06-04 22:08:39 +0000
@@ -0,0 +1,245 @@
+package org.hisp.dhis.system.util;
+
+/*
+ * Copyright (c) 2004-2015, University of Oslo
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of the HISP project nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import com.vividsolutions.jts.geom.MultiPolygon;
+import com.vividsolutions.jts.geom.Point;
+import com.vividsolutions.jts.geom.Polygon;
+import org.apache.commons.lang3.StringUtils;
+import org.geotools.geojson.geom.GeometryJSON;
+import org.geotools.referencing.GeodeticCalculator;
+
+import java.awt.geom.Point2D;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Lars Helge Overland
+ */
+public class GeoUtils
+{
+ private static final Pattern SVG_TEXT_PATTERN = Pattern.compile( "text=\"(.*?)\"", Pattern.DOTALL );
+
+ private static final String SVG_FONT_REGEX = "(\\s+)font=\"(.*?)\"";
+
+ private static final String FEATURETYPE_POLYGON = "Polygon";
+
+ private static final String FEATURETYPE_MULTIPOLYGON = "MultiPolygon";
+
+ /**
+ * Returns boundaries of a box shape which centre is the point defined by the
+ * given longitude and latitude. The distance between the center point and the
+ * edges of the box is defined in meters by the given distance. Based on standard
+ * EPSG:4326 long/lat projection. The result is an array of length 4 where
+ * the values at each index are:
+ *
+ * <ul>
+ * <li>Index 0: Maximum latitude (north edge of box shape).</li>
+ * <li>Index 1: Maxium longitude (east edge of box shape).</li>
+ * <li>Index 2: Minimum latitude (south edge of box shape).</li>
+ * <li>Index 3: Minumum longitude (west edge of box shape).</li>
+ * </ul>
+ *
+ * @param longitude the longitude.
+ * @param latitude the latitude.
+ * @param distance the distance in meters to each box edge.
+ * @return an array of length 4.
+ */
+ public static double[] getBoxShape( double longitude, double latitude, double distance )
+ {
+ double[] box = new double[4];
+
+ GeodeticCalculator calc = new GeodeticCalculator();
+ calc.setStartingGeographicPoint( longitude, latitude );
+
+ calc.setDirection( 0, distance );
+ Point2D north = calc.getDestinationGeographicPoint();
+
+ calc.setDirection( 90, distance );
+ Point2D east = calc.getDestinationGeographicPoint();
+
+ calc.setDirection( 180, distance );
+ Point2D south = calc.getDestinationGeographicPoint();
+
+ calc.setDirection( -90, distance );
+ Point2D west = calc.getDestinationGeographicPoint();
+
+ box[0] = north.getY();
+ box[1] = east.getX();
+ box[2] = south.getY();
+ box[3] = west.getX();
+
+ return box;
+ }
+
+ /**
+ * Computes the distance between two points.
+ *
+ * @param from the origin point.
+ * @param to the end point.
+ * @return the orthodromic distance between the given points.
+ */
+ public static double getDistanceBetweenTwoPoints( Point2D from, Point2D to)
+ {
+ GeodeticCalculator calc = new GeodeticCalculator();
+ calc.setStartingGeographicPoint( from );
+ calc.setDestinationGeographicPoint( to);
+
+ return calc.getOrthodromicDistance();
+ }
+
+ /**
+ * Get GeometryJSON point.
+ *
+ * @param longitude the longitude.
+ * @param latitude the latitude.
+ * @return the GeoJSON representation of the given point.
+ */
+ public static Point getGeoJsonPoint( double longitude, double latitude )
+ throws IOException
+ {
+ Point point = null;
+
+ GeometryJSON gtjson = new GeometryJSON();
+
+ point = gtjson.readPoint( new StringReader( "{\"type\":\"Point\", \"coordinates\":[" + longitude + ","
+ + latitude + "]}" ) );
+
+ return point;
+ }
+
+ /**
+ * Check if GeometryJSON point created with this coordinate is valid.
+ *
+ * @param latitude the latitude.
+ * @param longitude the longitude.
+ * @return true if the point is valid or false.
+ */
+ public static boolean checkGeoJsonPointValid( double longitude, double latitude )
+ {
+ try
+ {
+ return getGeoJsonPoint( longitude, latitude ).isValid();
+ }
+ catch ( Exception ex )
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Check if the point coordinate falls within the polygon/MultiPolygon Shape
+ *
+ * @param longitude the longitude.
+ * @param latitude the latitude.
+ * @param multiPolygonJson the GeoJSON coordinates of the MultiPolygon
+ * @param featureType the featureType of the MultiPolygon.
+ */
+ public static boolean checkPointWithMultiPolygon( double longitude, double latitude,
+ String multiPolygonJson, String featureType )
+ {
+ try
+ {
+ boolean contains = false;
+
+ GeometryJSON gtjson = new GeometryJSON();
+
+ Point point = getGeoJsonPoint( longitude, latitude );
+
+ if ( point != null && point.isValid() )
+ {
+ if ( featureType.compareTo( FEATURETYPE_POLYGON ) == 0 )
+ {
+ Polygon polygon = gtjson.readPolygon( new StringReader(
+ "{\"type\":\"Polygon\", \"coordinates\":" + multiPolygonJson + "}" ) );
+
+ contains = polygon.contains( point );
+ }
+ else if ( featureType.compareTo( FEATURETYPE_MULTIPOLYGON ) == 0 )
+ {
+ MultiPolygon multiPolygon = gtjson.readMultiPolygon( new StringReader(
+ "{\"type\":\"MultiPolygon\", \"coordinates\":" + multiPolygonJson + "}" ) );
+
+ contains = multiPolygon.contains( point );
+ }
+ }
+
+ return contains;
+ }
+ catch ( Exception ex )
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Escapes the String encoded SVG.
+ * @param svg the String encoded SVG.
+ * @return the escaped representation.
+ */
+ public static final String replaceUnsafeSvgText( String svg )
+ {
+ if ( svg == null )
+ {
+ return null;
+ }
+
+ svg = replaceText( svg );
+ svg = replaceFont( svg );
+
+ return svg;
+ }
+
+ private static String replaceText( String svg )
+ {
+ StringBuffer sb = new StringBuffer();
+
+ Matcher textMatcher = SVG_TEXT_PATTERN.matcher( svg );
+
+ while ( textMatcher.find() )
+ {
+ String text = textMatcher.group( 1 );
+
+ if ( text != null && !text.isEmpty() )
+ {
+ text = "text=\"" + text.replaceAll( "[<>&]", "" ) + "\"";
+ textMatcher.appendReplacement( sb, text );
+ }
+ }
+
+ return textMatcher.appendTail( sb ).toString();
+ }
+
+ private static String replaceFont( String svg )
+ {
+ return svg.replaceAll( SVG_FONT_REGEX, StringUtils.EMPTY );
+ }
+}
=== added file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/JRExportUtils.java'
--- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/JRExportUtils.java 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/JRExportUtils.java 2015-06-04 22:08:39 +0000
@@ -0,0 +1,128 @@
+package org.hisp.dhis.system.util;
+
+/*
+ * Copyright (c) 2004-2015, University of Oslo
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of the HISP project nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import net.sf.jasperreports.engine.JRAbstractExporter;
+import net.sf.jasperreports.engine.JRException;
+import net.sf.jasperreports.engine.JRExporterParameter;
+import net.sf.jasperreports.engine.JasperPrint;
+import net.sf.jasperreports.engine.export.JRHtmlExporter;
+import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
+import net.sf.jasperreports.engine.export.JRPdfExporter;
+import net.sf.jasperreports.engine.export.JRXlsAbstractExporterParameter;
+import net.sf.jasperreports.engine.export.JRXlsExporter;
+
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Supports PDF, HMTL and XLS exports.
+ *
+ * @author Lars Helge Overland
+ */
+public class JRExportUtils
+{
+ public static final String TYPE_XLS = "xls";
+ public static final String TYPE_PDF = "pdf";
+ public static final String TYPE_HTML = "html";
+
+ private static final Map<String, JRExportProvider> exporters = new HashMap<String, JRExportProvider>() {
+ {
+ put( TYPE_XLS, new JRXlsExportProvider() );
+ put( TYPE_PDF, new JRPdfExportProvider() );
+ put( TYPE_HTML, new JRHtmlExportProvider() );
+ } };
+
+ /**
+ * Export the provided JasperPrint the format given by type.
+ *
+ * @param type the type to export to. XLS, PDF and HTML are supported.
+ * @param out the OutputStream to export to.
+ * @param jasperPrint the JasperPrint to export.
+ * @throws JRException on export failure.
+ */
+ public static void export( String type, OutputStream out, JasperPrint jasperPrint )
+ throws JRException
+ {
+ JRExportProvider provider = exporters.get( type );
+
+ if ( provider != null )
+ {
+ JRAbstractExporter exporter = provider.provide();
+
+ exporter.setParameter( JRExporterParameter.OUTPUT_STREAM, out );
+ exporter.setParameter( JRExporterParameter.JASPER_PRINT, jasperPrint );
+ exporter.exportReport();
+ }
+ }
+
+ private interface JRExportProvider
+ {
+ JRAbstractExporter provide();
+ }
+
+ private static class JRXlsExportProvider implements JRExportProvider
+ {
+ @Override
+ public JRAbstractExporter provide()
+ {
+ JRXlsExporter exporter = new JRXlsExporter();
+ exporter.setParameter( JRXlsAbstractExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE );
+ exporter.setParameter( JRXlsAbstractExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE );
+ exporter.setParameter( JRXlsAbstractExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE );
+ exporter.setParameter( JRXlsAbstractExporterParameter.IS_COLLAPSE_ROW_SPAN, Boolean.TRUE );
+ exporter.setParameter( JRXlsAbstractExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE );
+ return exporter;
+ }
+ }
+
+ private static class JRPdfExportProvider implements JRExportProvider
+ {
+ @Override
+ public JRAbstractExporter provide()
+ {
+ return new JRPdfExporter();
+ }
+ }
+
+ private static class JRHtmlExportProvider implements JRExportProvider
+ {
+ @Override
+ public JRAbstractExporter provide()
+ {
+ JRHtmlExporter exporter = new JRHtmlExporter();
+ exporter.setParameter( JRHtmlExporterParameter.IMAGES_URI, "../jasperReports/img?image=" );
+
+ return exporter;
+ }
+ }
+}
+
+
=== modified file 'dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/GeoUtilsTest.java'
--- dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/GeoUtilsTest.java 2015-05-28 14:33:21 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/GeoUtilsTest.java 2015-06-04 22:08:39 +0000
@@ -28,8 +28,8 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import static org.hisp.dhis.util.GeoUtils.getBoxShape;
-import static org.hisp.dhis.util.GeoUtils.replaceUnsafeSvgText;
+import static org.hisp.dhis.system.util.GeoUtils.getBoxShape;
+import static org.hisp.dhis.system.util.GeoUtils.replaceUnsafeSvgText;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/SvgConversionController.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/SvgConversionController.java 2015-05-28 16:10:07 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/SvgConversionController.java 2015-06-04 22:08:39 +0000
@@ -49,7 +49,7 @@
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
-import static org.hisp.dhis.util.GeoUtils.replaceUnsafeSvgText;
+import static org.hisp.dhis.system.util.GeoUtils.replaceUnsafeSvgText;
@Controller
@RequestMapping