Changes

Jump to navigation Jump to search
4,315 bytes added ,  15:03, 12 March 2018
no edit summary
It is possible to create an Android port of BaseX.
Therefore the present tutorial outlines the creation of a BaseX Android library, which can be used in any other application project.
For the creation of the library the IDE Android Studio[http://developer.android.com/sdk/installing/studio.html] is used, but the steps are more or less equal in using the Eclipse IDE Eclipse.
----
<br>
In the empty android package a new Java class needs to be created, this class is used to create the necessary BaseX files and communicate with BaseX. This class needs the data directory of the application for storing the corresponding BaseX files. This files should be stored in the apps /data/data/.. folder which is only accessible from the application.
This information is only available inside the applications context and not inside a library project, therefore it is neccessary necessary to pass this information to this class at the constructor call.
The following source code shows a minimal example for a BaseX class.
'''Example:'''
<pre class="brush:java">
public class BaseXDatabase {
<pre class="brush:java">
BaseXDatabase baseXDatabase = new BaseXDatabase(getApplicationInfo().dataDir);
</pre>
At the moment it is not possible to use the BaseX library, therefore more adjustments have to be done in the BaseX code.<br>
First it is necessary to add an additional constructor to the Context class to create the BaseX files in the right directory and adjust the default constructor of it.
The following code shows the changes inside the Context.java file:
<pre class="brush:java">
public Context(String data_dir) {
this(true, (Prop.HOME = data_dir + "/"), (Prop.USERHOME = data_dir + "/"));
File dir = new File(Prop.HOME, "basex/data");
if(!dir.exists()) {
if(!dir.mkdir()) {
android.util.Log.i("BASEX", "CREATING BASEX DIRECTORIES");
}
}
}
 
private Context(final boolean file, String home, String userhome) {
this(new MainProp(file));
}
</pre>
As shown in the adjustment above, it is necessary to set the two variables 'Prop.HOME' and Prop.USERHOME' during the constructor call. In the BaseX code those variables are final, which need also be changed in order to set them during the call.<br>
The reason for this change is that the in BaseX used System.getProperty(user.dir) returns an empty string in Android[http://developer.android.com/reference/java/lang/System.html#getProperty(java.lang.String)].
 
----
The next adjustment, which needs to be done, is to remove not supported packages inside the BaseX code.
Therefore the package 'org.basex.query.util.crypto' need to be removed, because it uses external packages which are not supported by Android.
The class which uses these files can be found inside the FNCrypto.java file in the 'query.func' package. This file needs to be deleted as well as its usage inside the Function.java file, which can also be found inside the 'query.func' package.
The following lines need to be removed:
<pre class="brush:java">
/** XQuery function. */
_CRYPTO_HMAC(FNCrypto.class, "hmac(message,key,algorithm[,encoding])",
arg(STR, STR, STR, STR_ZO), STR),
/** XQuery function. */
_CRYPTO_ENCRYPT(FNCrypto.class, "encrypt(input,encryption,key,algorithm)",
arg(STR, STR, STR, STR), STR),
/** XQuery function. */
_CRYPTO_DECRYPT(FNCrypto.class, "decrypt(input,type,key,algorithm)",
arg(STR, STR, STR, STR), STR),
/** XQuery function. */
_CRYPTO_GENERATE_SIGNATURE(FNCrypto.class, "generate-signature" +
"(input,canonicalization,digest,signature,prefix,type[,item1][,item2])",
arg(NOD, STR, STR, STR, STR, STR, ITEM_ZO, ITEM_ZO), NOD),
/** XQuery function. */
_CRYPTO_VALIDATE_SIGNATURE(FNCrypto.class, "validate-signature(node)", arg(NOD), BLN),
 
URIS.put(FNCrypto.class, CRYPTOURI);
</pre>
The result of this adjustment is, that it is now possible to use BaseX as an Android library, with the lack of support of the following XQuery functions:<br>
*hmac(string,string,string[,string])
*encrypt(string,string,string,string)
*decrypt(string,string,string,string)
*generate-signature(node,string,string,string,string,string[,item][,item])
*validate-signature(node)
 
----
 
== Using the BaseX Android Library ==
To use the BaseX library the above created BaseXDatabase class can be extended with additional methods which are delegating requests to the BaseX database and return the results.<br>
An example of this can be seen in the following code:
<pre class="brush:java">
public String executeXQuery(String query) throws IOException {
if(basexContext != null)
return new XQuery(query).execute(basexContext);
else
Log.e("BaseXDatabase", "No context");
return "";
}
</pre>
This methods of the BaseXDatabase class can now be used in every Android application which includes the created BaseX Android library.<br>
It is possible to create a .jar, or an .aar[http://tools.android.com/tech-docs/new-build-system/aar-format] file out of the BaseX library, by just building the source code.
This file need to be copied inside the lib folder of the Android project which wants to use the library. Additionally the build file of the application needs to be adjusted to use the library.<br>
Using Gradle, the Android build system, it can be done by adding the following line to the gradle build file. This tells the build system that every library, inside the libs folder, is being compiled into the projects file.
<pre class="brush:java">
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}
</pre>
Bureaucrats, editor, reviewer, Administrators
13,550

edits

Navigation menu