Merge pull request #313 from afischerdev/migrate-to-gradle

Migrate to gradle Part 2

This should run out of the box.
But for Android you need a file 'local.properties' which is exclude in .gitignore
See also new README

I've tested it on a Window10 system and an Ubuntu under Windows - w/o Android
This commit is contained in:
afischerdev 2021-06-29 13:19:43 +02:00 committed by GitHub
commit 1066700c01
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 334 additions and 225 deletions

View file

@ -46,21 +46,26 @@ A full documentation on how to set this up is available at
### Build and Install
To compile BRouter (including the BRouter Android app), use
To compile BRouter (including the BRouter Android app), add a file 'local.properties' to main folder with your Android path (Windows sample)
```
mvn clean install -Dandroid.sdk.path=<your-sdk-path>
sdk.dir=D\:\\Android\\android-sdk
```
and use
```
gradlew clean build
```
If you only want to compile BRouter and the server part (skipping the Android
app), use
```
mvn clean install -pl '!brouter-routing-app'
gradlew clean build -x :brouter-routing-app:build
```
You can use `-Dmaven.javadoc.skip=true` to skip the JavaDoc processing and
`-DskipTests` to skip running the unitary tests.
### Get the required segments (data) files

View file

@ -4,4 +4,5 @@ plugins {
dependencies {
implementation project(':brouter-util')
testImplementation 'junit:junit:4.13.1'
}

View file

@ -8,5 +8,6 @@ dependencies {
implementation project(':brouter-util')
implementation project(':brouter-expressions')
implementation project(':brouter-codec')
testImplementation 'junit:junit:4.13.1'
}

View file

@ -711,6 +711,15 @@ public final class OsmTrack
public List<String> iternity;
public void writeJson( String filename ) throws Exception
{
BufferedWriter bw = new BufferedWriter( new FileWriter( filename ) );
bw.write( formatAsGeoJson() );
bw.close();
}
public String formatAsGeoJson()
{
int turnInstructionMode = voiceHints != null ? voiceHints.turnInstructionMode : 0;

View file

@ -5,4 +5,5 @@ plugins {
dependencies {
implementation project(':brouter-util')
implementation project(':brouter-codec')
testImplementation 'junit:junit:4.13.1'
}

View file

@ -14,7 +14,7 @@ public class EncodeDecodeTest
{
URL testpurl = this.getClass().getResource( "/dummy.txt" );
File workingDir = new File(testpurl.getFile()).getParentFile();
File profileDir = new File( workingDir, "/../../../misc/profiles2" );
File profileDir = new File( workingDir, "/../../../../misc/profiles2" );
File lookupFile = new File( profileDir, "lookups.dat" );
// read lookup.dat + trekking.brf

View file

@ -2,15 +2,25 @@ plugins {
id 'application'
}
version = '1.6.1'
application {
// Gradles 'application' plugin requires one main class; since we have multiple ones, just specify
// one of them, since the applications won't be run from gradle anyways.
mainClassName = 'btools.mapcreator.PosUnifier'
mainClass.set('btools.mapcreator.PosUnifier')
jar {
manifest {
attributes "Main-Class": getMainClass()
}
}
}
dependencies {
implementation project(':brouter-util')
implementation project(':brouter-codec')
implementation project(':brouter-util')
implementation project(':brouter-expressions')
implementation('junit:junit:4.13')
testImplementation('junit:junit:4.13.1')
}

View file

@ -17,7 +17,7 @@ public class MapcreatorTest
Assert.assertTrue( "test-osm-map dreieich.osm not found", mapurl != null );
File mapFile = new File(mapurl.getFile());
File workingDir = mapFile.getParentFile();
File profileDir = new File( workingDir, "/../../../misc/profiles2" );
File profileDir = new File( workingDir, "/../../../../misc/profiles2" );
File tmpdir = new File( workingDir, "tmp" );
tmpdir.mkdir();

View file

@ -3,7 +3,6 @@ plugins {
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':brouter-util')
implementation project(':brouter-codec')
implementation project(':brouter-expressions')

View file

@ -3,32 +3,78 @@ plugins {
}
android {
compileSdkVersion 29
compileSdkVersion 30
defaultConfig {
applicationId "btools.routingapp"
minSdkVersion 10
targetSdkVersion 29
minSdkVersion 19
targetSdkVersion 30
versionCode 41
versionName "1.6.1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
setProperty("archivesBaseName","BRouterApp." + defaultConfig.versionName)
//testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
if(project.hasProperty("RELEASE_STORE_FILE")) {
signingConfigs {
// this uses a file ~/.gradle/gradle.properties
// with content:
// RELEASE_STORE_FILE={path to your keystore}
// RELEASE_STORE_PASSWORD=*****
// RELEASE_KEY_ALIAS=*****
// RELEASE_KEY_PASSWORD=*****
//
release {
// enable signingConfig in buildTypes to get a signed apk file
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
// Optional, specify signing versions used
v1SigningEnabled true
v2SigningEnabled true
}
}
}
buildTypes {
release {
minifyEnabled false
debuggable false
if(project.hasProperty("RELEASE_STORE_FILE")) {
signingConfig signingConfigs.release
}
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
debuggable true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
lintOptions {
disable 'InvalidPackage'
checkReleaseBuilds false //added this line to the build.gradle under the /android/app/build.gradle
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation project(':brouter-mapaccess')
implementation project(':brouter-core')
implementation project(':brouter-expressions')
implementation project(':brouter-util')
}

View file

@ -1,195 +1,230 @@
package btools.routingapp;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import btools.router.OsmNodeNamed;
import btools.router.OsmPathElement;
import btools.router.OsmTrack;
import btools.router.RoutingContext;
import btools.router.RoutingEngine;
public class BRouterWorker
{
public String baseDir;
public String segmentDir;
public String profileName;
public String profilePath;
public String rawTrackPath;
public List<OsmNodeNamed> waypoints;
public List<OsmNodeNamed> nogoList;
public String getTrackFromParams(Bundle params)
{
String pathToFileResult = params.getString("pathToFileResult");
if (pathToFileResult != null)
{
File f = new File (pathToFileResult);
File dir = f.getParentFile();
if (!dir.exists() || !dir.canWrite()){
return "file folder does not exists or can not be written!";
}
}
long maxRunningTime = 60000;
String sMaxRunningTime = params.getString( "maxRunningTime" );
if ( sMaxRunningTime != null )
{
maxRunningTime = Integer.parseInt( sMaxRunningTime ) * 1000;
}
RoutingContext rc = new RoutingContext();
rc.rawTrackPath = rawTrackPath;
rc.localFunction = profilePath;
String tiFormat = params.getString( "turnInstructionFormat" );
if ( tiFormat != null )
{
if ( "osmand".equalsIgnoreCase( tiFormat ) )
{
rc.turnInstructionMode = 3;
}
else if ( "locus".equalsIgnoreCase( tiFormat ) )
{
rc.turnInstructionMode = 2;
}
}
if ( params.containsKey( "direction" ) )
{
rc.startDirection = Integer.valueOf( params.getInt( "direction" ) );
}
readNogos( params ); // add interface provided nogos
RoutingContext.prepareNogoPoints( nogoList );
rc.nogopoints = nogoList;
waypoints = readPositions(params);
try
{
writeTimeoutData( rc );
}
catch( Exception e ) {}
RoutingEngine cr = new RoutingEngine( null, null, segmentDir, waypoints, rc );
cr.quite = true;
cr.doRun( maxRunningTime );
// store new reference track if any
// (can exist for timed-out search)
if ( cr.getFoundRawTrack() != null )
{
try
{
cr.getFoundRawTrack().writeBinary( rawTrackPath );
}
catch( Exception e ) {}
}
if ( cr.getErrorMessage() != null )
{
return cr.getErrorMessage();
}
String format = params.getString("trackFormat");
boolean writeKml = format != null && "kml".equals( format );
OsmTrack track = cr.getFoundTrack();
if ( track != null )
{
if ( pathToFileResult == null )
{
if ( writeKml ) return track.formatAsKml();
return track.formatAsGpx();
}
try
{
if ( writeKml ) track.writeKml(pathToFileResult);
else track.writeGpx(pathToFileResult);
}
catch( Exception e )
{
return "error writing file: " + e;
}
}
return null;
}
private List<OsmNodeNamed> readPositions( Bundle params )
{
List<OsmNodeNamed> wplist = new ArrayList<OsmNodeNamed>();
double[] lats = params.getDoubleArray("lats");
double[] lons = params.getDoubleArray("lons");
if (lats == null || lats.length < 2 || lons == null || lons.length < 2)
{
throw new IllegalArgumentException( "we need two lat/lon points at least!" );
}
for( int i=0; i<lats.length && i<lons.length; i++ )
{
OsmNodeNamed n = new OsmNodeNamed();
n.name = "via" + i;
n.ilon = (int)( ( lons[i] + 180. ) *1000000. + 0.5);
n.ilat = (int)( ( lats[i] + 90. ) *1000000. + 0.5);
wplist.add( n );
}
wplist.get(0).name = "from";
wplist.get(wplist.size()-1).name = "to";
return wplist;
}
private void readNogos( Bundle params )
{
double[] lats = params.getDoubleArray("nogoLats");
double[] lons = params.getDoubleArray("nogoLons");
double[] radi = params.getDoubleArray("nogoRadi");
if ( lats == null || lons == null || radi == null ) return;
for( int i=0; i<lats.length && i<lons.length && i<radi.length; i++ )
{
OsmNodeNamed n = new OsmNodeNamed();
n.name = "nogo" + (int)radi[i];
n.ilon = (int)( ( lons[i] + 180. ) *1000000. + 0.5);
n.ilat = (int)( ( lats[i] + 90. ) *1000000. + 0.5);
n.isNogo = true;
n.nogoWeight = Double.NaN;
AppLogger.log( "added interface provided nogo: " + n );
nogoList.add( n );
}
}
private void writeTimeoutData( RoutingContext rc ) throws Exception
{
String timeoutFile = baseDir + "/brouter/modes/timeoutdata.txt";
BufferedWriter bw = new BufferedWriter( new FileWriter( timeoutFile ) );
bw.write( profileName );
bw.write( "\n" );
bw.write( rc.rawTrackPath );
bw.write( "\n" );
writeWPList( bw, waypoints );
writeWPList( bw, nogoList );
bw.close();
}
private void writeWPList( BufferedWriter bw, List<OsmNodeNamed> wps ) throws Exception
{
bw.write( wps.size() + "\n" );
for( OsmNodeNamed wp : wps )
{
bw.write( wp.toString() );
bw.write( "\n" );
}
}
}
package btools.routingapp;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;
import android.os.Bundle;
import btools.router.OsmNodeNamed;
import btools.router.OsmPathElement;
import btools.router.OsmTrack;
import btools.router.RoutingContext;
import btools.router.RoutingEngine;
public class BRouterWorker
{
private static final int OUTPUT_FORMAT_GPX = 0;
private static final int OUTPUT_FORMAT_KML = 1;
private static final int OUTPUT_FORMAT_JSON = 2;
public String baseDir;
public String segmentDir;
public String profileName;
public String profilePath;
public String rawTrackPath;
public List<OsmNodeNamed> waypoints;
public List<OsmNodeNamed> nogoList;
public String getTrackFromParams(Bundle params)
{
String pathToFileResult = params.getString("pathToFileResult");
if (pathToFileResult != null)
{
File f = new File (pathToFileResult);
File dir = f.getParentFile();
if (!dir.exists() || !dir.canWrite()){
return "file folder does not exists or can not be written!";
}
}
long maxRunningTime = 60000;
String sMaxRunningTime = params.getString( "maxRunningTime" );
if ( sMaxRunningTime != null )
{
maxRunningTime = Integer.parseInt( sMaxRunningTime ) * 1000;
}
RoutingContext rc = new RoutingContext();
rc.rawTrackPath = rawTrackPath;
rc.localFunction = profilePath;
String tiFormat = params.getString( "turnInstructionFormat" );
if ( tiFormat != null )
{
if ( "osmand".equalsIgnoreCase( tiFormat ) )
{
rc.turnInstructionMode = 3;
}
else if ( "locus".equalsIgnoreCase( tiFormat ) )
{
rc.turnInstructionMode = 2;
}
}
if ( params.containsKey( "direction" ) )
{
rc.startDirection = Integer.valueOf( params.getInt( "direction" ) );
}
if (params.containsKey( "extraParams" )) { // add user params
String extraParams = params.getString("extraParams");
if (rc.keyValues == null) rc.keyValues = new HashMap<String,String>();
StringTokenizer tk = new StringTokenizer( extraParams, "?&" );
while( tk.hasMoreTokens() ) {
String t = tk.nextToken();
StringTokenizer tk2 = new StringTokenizer( t, "=" );
if ( tk2.hasMoreTokens() ) {
String key = tk2.nextToken();
if ( tk2.hasMoreTokens() ) {
String value = tk2.nextToken();
rc.keyValues.put( key, value );
}
}
}
}
readNogos( params ); // add interface provided nogos
RoutingContext.prepareNogoPoints( nogoList );
rc.nogopoints = nogoList;
waypoints = readPositions(params);
try
{
writeTimeoutData( rc );
}
catch( Exception e ) {}
RoutingEngine cr = new RoutingEngine( null, null, segmentDir, waypoints, rc );
cr.quite = true;
cr.doRun( maxRunningTime );
// store new reference track if any
// (can exist for timed-out search)
if ( cr.getFoundRawTrack() != null )
{
try
{
cr.getFoundRawTrack().writeBinary( rawTrackPath );
}
catch( Exception e ) {}
}
if ( cr.getErrorMessage() != null )
{
return cr.getErrorMessage();
}
String format = params.getString("trackFormat");
int writeFromat = OUTPUT_FORMAT_GPX;
if (format != null) {
if ("kml".equals(format)) writeFromat = OUTPUT_FORMAT_KML;
if ("json".equals(format)) writeFromat = OUTPUT_FORMAT_JSON;
}
OsmTrack track = cr.getFoundTrack();
if ( track != null )
{
if ( pathToFileResult == null )
{
switch ( writeFromat ) {
case OUTPUT_FORMAT_GPX: return track.formatAsGpx();
case OUTPUT_FORMAT_KML: return track.formatAsKml();
case OUTPUT_FORMAT_JSON: return track.formatAsGeoJson();
default: return track.formatAsGpx();
}
}
try
{
switch ( writeFromat ) {
case OUTPUT_FORMAT_GPX: track.writeGpx(pathToFileResult); break;
case OUTPUT_FORMAT_KML: track.writeKml(pathToFileResult); break;
case OUTPUT_FORMAT_JSON: track.writeJson(pathToFileResult); break;
default: track.writeGpx(pathToFileResult); break;
}
}
catch( Exception e )
{
return "error writing file: " + e;
}
}
return null;
}
private List<OsmNodeNamed> readPositions( Bundle params )
{
List<OsmNodeNamed> wplist = new ArrayList<OsmNodeNamed>();
double[] lats = params.getDoubleArray("lats");
double[] lons = params.getDoubleArray("lons");
if (lats == null || lats.length < 2 || lons == null || lons.length < 2)
{
throw new IllegalArgumentException( "we need two lat/lon points at least!" );
}
for( int i=0; i<lats.length && i<lons.length; i++ )
{
OsmNodeNamed n = new OsmNodeNamed();
n.name = "via" + i;
n.ilon = (int)( ( lons[i] + 180. ) *1000000. + 0.5);
n.ilat = (int)( ( lats[i] + 90. ) *1000000. + 0.5);
wplist.add( n );
}
wplist.get(0).name = "from";
wplist.get(wplist.size()-1).name = "to";
return wplist;
}
private void readNogos( Bundle params )
{
double[] lats = params.getDoubleArray("nogoLats");
double[] lons = params.getDoubleArray("nogoLons");
double[] radi = params.getDoubleArray("nogoRadi");
if ( lats == null || lons == null || radi == null ) return;
for( int i=0; i<lats.length && i<lons.length && i<radi.length; i++ )
{
OsmNodeNamed n = new OsmNodeNamed();
n.name = "nogo" + (int)radi[i];
n.ilon = (int)( ( lons[i] + 180. ) *1000000. + 0.5);
n.ilat = (int)( ( lats[i] + 90. ) *1000000. + 0.5);
n.isNogo = true;
n.nogoWeight = Double.NaN;
AppLogger.log( "added interface provided nogo: " + n );
nogoList.add( n );
}
}
private void writeTimeoutData( RoutingContext rc ) throws Exception
{
String timeoutFile = baseDir + "/brouter/modes/timeoutdata.txt";
BufferedWriter bw = new BufferedWriter( new FileWriter( timeoutFile ) );
bw.write( profileName );
bw.write( "\n" );
bw.write( rc.rawTrackPath );
bw.write( "\n" );
writeWPList( bw, waypoints );
writeWPList( bw, nogoList );
bw.close();
}
private void writeWPList( BufferedWriter bw, List<OsmNodeNamed> wps ) throws Exception
{
bw.write( wps.size() + "\n" );
for( OsmNodeNamed wp : wps )
{
bw.write( wp.toString() );
bw.write( "\n" );
}
}
}

View file

@ -2,19 +2,23 @@ plugins {
id 'application'
}
version = '1.6.1'
application {
mainClassName = 'btools.server.BRouter'
mainClass.set('btools.server.BRouter')
jar {
manifest {
attributes "Main-Class": "$mainClassName"
attributes "Main-Class": getMainClass()
}
}
}
dependencies {
implementation('junit:junit:4.13')
testImplementation 'junit:junit:4.13.1'
implementation project(':brouter-util')
implementation project(':brouter-core')
implementation project(':brouter-mapaccess')
}

View file

@ -20,7 +20,7 @@ public class IntegrityCheckTest
File resultfile = new File( resulturl.getFile() );
workingDir = resultfile.getParentFile();
File segmentDir = new File( workingDir, "/../../../brouter-map-creator/target/test-classes/tmp/segments" );
File segmentDir = new File( workingDir, "/../../../../brouter-map-creator/build/resources/test/tmp/segments" );
File[] files = segmentDir.listFiles();
for ( File f : files )

View file

@ -61,13 +61,13 @@ public class RouterTest
wplist.add( n );
RoutingContext rctx = new RoutingContext();
rctx.localFunction = wd + "/../../../misc/profiles2/trekking.brf";
rctx.localFunction = wd + "/../../../../misc/profiles2/trekking.brf";
// c.setAlternativeIdx( 1 );
RoutingEngine re = new RoutingEngine(
wd + "/" + trackname,
wd + "/" + trackname,
wd + "/../../../brouter-map-creator/target/test-classes/tmp/segments", wplist, rctx );
wd + "/../../../../brouter-map-creator/build/resources/test/tmp/segments", wplist, rctx );
re.doRun( 0 );
return re.getErrorMessage();

View file

@ -3,5 +3,5 @@ plugins {
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation('junit:junit:4.13.1')
}

View file

@ -3,12 +3,11 @@
buildscript {
repositories {
mavenCentral()
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath 'com.android.tools.build:gradle:4.1.3'
// NOTE: Do not place your application dependencies here; they belong
@ -18,9 +17,8 @@ buildscript {
allprojects {
repositories {
mavenCentral()
google()
jcenter()
}
}

View file

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-all.zip