You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

196 lines
5.7 KiB

AppType=StandardJava
Build1=Default,b4j.webapi
File1=index.html
File2=main.html
FileGroup1=Default Group
FileGroup2=Default Group
Group=Default Group
Library1=byteconverter
Library2=jcore
Library3=jserver
Library4=json
Library5=jsql
Library6=javaobject
Module1=CorsFilter
Module2=DataUtils
Module3=DefaultHandler
Module4=HomeHandler
Module5=HttpsFilter
Module6=ProductHandler
Module7=Utility
Module8=WebUtils
NumberOfFiles=2
NumberOfLibraries=6
NumberOfModules=8
Version=9.1
@EndOfDesignText@
' Name: Web API Lite
' Description: Non-UI application (console / server application)
' Version: 1.08
#Region Project Attributes
#CommandLineArgs:
#MergeLibraries: True
#End Region
#Region AdditionalJar
' MySQL connector
'#AdditionalJar: mysql-connector-java-5.1.49-bin
' SQLite connector
#AdditionalJar: sqlite-jdbc-3.36.0.2
#End Region
Sub Process_Globals
Public const VERSION As Float = 1.08
Public srvr As Server
Public ROOT_PATH As String
Public ROOT_URL As String
Public SERVER_PORT As Int
Public SSL_PORT As Int
Public config As Map
Public queries As Map
Public Conn As Conn
Public Element As Element
Type Conn (DbName As String, DbType As String, DriverClass As String, JdbcUrl As String, User As String, Password As String, MaxPoolSize As Int)
Type Element (Root As Int, Parent As Int, Parent_Id As Int, Child As Int, Child_Id As Int, Max_Elements As Int)
End Sub
Sub AppStart (Args() As String)
config = Utility.ReadMapFile(File.DirApp, "config.ini")
If config.Get("DbType").As(String).EqualsIgnoreCase("mysql") Then
queries = Utility.ReadMapFile(File.DirApp, "queries-mysql.ini")
End If
If config.Get("DbType").As(String).EqualsIgnoreCase("sqlite") Then
queries = Utility.ReadMapFile(File.DirApp, "queries-sqlite.ini")
End If
ROOT_PATH = config.Get("ROOT_PATH")
ROOT_URL = config.Get("ROOT_URL")
SERVER_PORT = config.Get("ServerPort")
SSL_PORT = config.Get("SSLPort") : If IsNumber(SSL_PORT) = False Then SSL_PORT = 0
If SERVER_PORT = 0 Then
Log($"Server Port is not set!"$)
Log($"Application is terminated."$)
ExitApplication
End If
ROOT_URL = ROOT_URL & ":" & SERVER_PORT
srvr.Initialize("")
srvr.Port = SERVER_PORT
If SSL_PORT > 0 Then
ConfigureSSL(SSL_PORT)
ROOT_URL = config.Get("ROOT_URL") & ":" & SSL_PORT
End If
' Update ROOT URL
config.Put("ROOT_URL", ROOT_URL)
config.Put("VERSION", VERSION)
Conn.Initialize
Conn.DbName = config.Get("DbName")
Conn.DbType = config.Get("DbType")
Conn.DriverClass = config.Get("DriverClass")
Conn.JdbcUrl = config.Get("JdbcUrl")
If Conn.DbType.EqualsIgnoreCase("mysql") Then
Conn.User = config.Get("User")
Conn.Password = config.Get("Password")
Conn.MaxPoolSize = config.Get("MaxPoolSize")
End If
' Check if database exists
DataUtils.CreateDatabaseIfNotExist
Element.Initialize
If ROOT_PATH <> "/" Then ' If webroot is using subdirectory
srvr.AddHandler(ROOT_PATH, "HomeHandler", False)
Element.Root = 1
Element.Parent = 2
Element.Parent_Id = 3
Element.Child = 4
Element.Child_Id = 5
Element.Max_Elements = 6
Else
Element.Root = 0
Element.Parent = 1
Element.Parent_Id = 2
Element.Child = 3
Element.Child_Id = 4
Element.Max_Elements = 5
End If
srvr.StaticFilesFolder = File.Combine(File.DirApp, "www")
srvr.SetStaticFilesOptions(CreateMap("dirAllowed": False))
' Add a home page
srvr.AddHandler("", "HomeHandler", False)
' Add more handlers here
srvr.AddHandler(ROOT_PATH & "default/*", "DefaultHandler", False)
srvr.AddHandler(ROOT_PATH & "category/*", "ProductHandler", False)
' Add CrossOriginFilter
'ConfigureCORS("/*", "*", "*", "*")
'ConfigureCORS(ROOT_PATH & "category/*", "http://127.0.0.1:19800", "", "") ' test.html
ConfigureCORS(ROOT_PATH & "category/*", "*", "", "")
' Server starts
srvr.Start
Log($"Web API server (version = $1.2{VERSION}) is running on port ${srvr.Port}"$)
Log($"Open the following URL from your web browser"$)
Log(ROOT_URL & ROOT_PATH)
' Open a web browser and navigate to: http://127.0.0.1:19800/v1/
StartMessageLoop
End Sub
Public Sub OpenConnection (pool As ConnectionPool) As ConnectionPool
Try
pool.Initialize(Conn.DriverClass, Conn.JdbcUrl, Conn.User, Conn.Password)
Dim jo As JavaObject = pool
jo.RunMethod("setMaxPoolSize", Array(Conn.MaxPoolSize))
Catch
LogDebug(LastException)
End Try
Return pool
End Sub
Public Sub OpenSQLiteDB As SQL
Dim DB As SQL
DB.InitializeSQLite(File.DirApp, Conn.DbName, False)
Return DB
End Sub
#Region ConfigureSSL
Private Sub ConfigureSSL (SslPort As Int)
Dim KeyStoreDir As String = config.Get("SSL_KEYSTORE_DIR")
Dim KeyStoreFile As String = config.Get("SSL_KEYSTORE_FILE")
Dim KeyStorePassword As String = config.Get("SSL_KEYSTORE_PASSWORD")
Dim ssl As SslConfiguration
ssl.Initialize
ssl.SetKeyStorePath(KeyStoreDir, KeyStoreFile)
ssl.KeyStorePassword = KeyStorePassword
'ssl.KeyManagerPassword = ""
srvr.SetSslConfiguration(ssl, SslPort)
'add filter to redirect all traffic from http to https (optional)
srvr.AddFilter("/*", "HttpsFilter", False)
End Sub
#End Region
#Region ConfigureCORS
' allowedOrigins = "*" or "http://google.com"
' allowedMethods = "*" or "GET,POST,HEAD"
' allowedHeaders = "*" or "X-Requested-With,Content-Type,Accept,Origin"
Private Sub ConfigureCORS (Path As String, allowedOrigins As String, allowedMethods As String, allowedHeaders As String)
' Reference: https://www.b4x.com/android/forum/threads/jetty-cross-origin-filter-to-be-added-to-jserver-library.85641/
Dim cors As CorsFilter
cors.Initialize(Path, CreateMap("allowedOrigins": allowedOrigins, _
"allowedMethods": allowedMethods, _
"allowedHeaders": allowedHeaders, _
"allowCredentials": "true", _
"preflightMaxAge": 1800, _
"chainPreflight": "false"))
cors.AddToServer(srvr)
End Sub
#End Region