// Path: erp-data/src/main/java/com/jukusoft/data/entity/Group.java
// public class Group implements JsonSerializable {
// 
//     //database row
//     protected JsonObject row = null;
// 
//     /**
//      * default constructor
//      *
//      * @param row database row of user
//      */
//     public Group (JsonObject row) {
//         if (row == null) {
//             throw new NullPointerException("row cannot be null.");
//         }
// 
//         if (!row.containsKey("groupID")) {
//             for (String colName : row.fieldNames()) {
//                 System.out.println("row coloum: " + colName);
//             }
// 
//             throw new IllegalArgumentException("row is invalide, no column groupID exists.");
//         }
// 
//         this.row = row;
//     }
// 
//     public long getGroupID () {
//         return this.row.getLong("groupID");
//     }
// 
//     public String getName () {
//         return this.row.getString("name");
//     }
// 
//     public String getDescription () {
//         return this.row.getString("description");
//     }
// 
//     public String getColorHex () {
//         return this.row.getString("color");
//     }
// 
//     public boolean isAutoJoin () {
//         return this.row.getInteger("auto_join") == 1;
//     }
// 
//     public boolean isActivated () {
//         return this.row.getInteger("activated") == 1;
//     }
// 
//     @Override
//     public JsonObject toJSON() {
//         return this.row;
//     }
// 
//     @Override
//     public String toString () {
//         return toJSON().encode();
//     }
// }
// 
// Path: erp-library/src/main/java/com.jukusoft/erp/lib/cache/CacheTypes.java
// public enum CacheTypes {
// 
//     /**
//     * cache entries on filesystem
//     */
//     FILE_CACHE,
// 
//     /**
//     * cache values on local memory cache
//     */
//     LOCAL_MEMORY_CACHE,
// 
//     /**
//     * cache values in distributed hazelcast cache
//     */
//     HAZELCAST_CACHE
// 
// }
// 
// Path: erp-library/src/main/java/com.jukusoft/erp/lib/cache/ICache.java
// public interface ICache {
// 
//     public void put (String key, JsonObject data);
// 
//     default void putArray (String key, JsonArray array) {
//         if (array == null) {
//             throw new NullPointerException("array cannot be null.");
//         }
// 
//         JsonObject obj = new JsonObject();
//         obj.put("array", array);
// 
//         put(key, obj);
//     }
// 
//     public void remove (String key);
// 
//     public void removeAll ();
// 
//     public boolean contains (String key);
// 
//     public JsonObject get (String key);
// 
//     default JsonArray getArray (String key) {
//         JsonObject obj = get(key);
// 
//         if (obj == null) {
//             return null;
//         }
// 
//         if (!obj.containsKey("array")) {
//             throw new IllegalStateException("cached object isnt an array.");
//         }
// 
//         return obj.getJsonArray("array");
//     }
// 
//     public void cleanUp ();
// 
// }
// 
// Path: erp-library/src/main/java/com.jukusoft/erp/lib/database/AbstractMySQLRepository.java
// public class AbstractMySQLRepository implements MySQLRepository {
// 
//     //instance of mysql database
//     private MySQLDatabase mySQLDatabase = null;
// 
//     @Override
//     public void init(Vertx vertx, MySQLDatabase database) {
//         this.mySQLDatabase = database;
//     }
// 
//     protected MySQLDatabase getMySQLDatabase () {
//         return this.mySQLDatabase;
//     }
// 
// }
// 
// Path: erp-library/src/main/java/com.jukusoft/erp/lib/utils/JsonUtils.java
// public class JsonUtils {
// 
//     public static JsonArray convertJsonObjectListToArray (List<JsonObject> rows) {
//         //create new json array
//         JsonArray array = new JsonArray();
// 
//         for (JsonObject row : rows) {
//             array.add(row);
//         }
// 
//         return array;
//     }
// 
// }


import com.jukusoft.data.entity.Group;
import com.jukusoft.erp.lib.cache.CacheTypes;
import com.jukusoft.erp.lib.cache.ICache;
import com.jukusoft.erp.lib.cache.InjectCache;
import com.jukusoft.erp.lib.database.AbstractMySQLRepository;
import com.jukusoft.erp.lib.utils.JsonUtils;
import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import java.util.List;
package com.jukusoft.data.repository;



public class MenuRepository extends AbstractMySQLRepository {

    @InjectCache(name = "menu-cache", type = CacheTypes.HAZELCAST_CACHE)
    protected ICache menuCache;

    public void listMenusByMenuID (int menuID, Handler<AsyncResult<JsonArray>> handler) {
        //check, if cache is available
        if (this.menuCache == null) {
            throw new NullPointerException("menu cache cannot be null.");
        }

        if (menuID <= 0) {
            throw new IllegalArgumentException("menuID has to be greater than 0. Current value: " + menuID);
        }

        //check, if menu entries are in cache
        if (this.menuCache.contains("menu-" + menuID)) {
            handler.handle(Future.succeededFuture(this.menuCache.getArray("menu-" + menuID)));
            return;
        }

        //read menus from database
        getMySQLDatabase().listRows("SELECT * FROM `{prefix}menu` WHERE `menuID` = '" + menuID + "' ORDER BY `order`; ", res -> {
            if (!res.succeeded()) {
                handler.handle(Future.failedFuture(res.cause()));
                return;
            }

            //get rows
            List<JsonObject> rows = res.result();

            //convert list to json array
// Path: erp-data/src/main/java/com/jukusoft/data/entity/Group.java
// public class Group implements JsonSerializable {
// 
//     //database row
//     protected JsonObject row = null;
// 
//     /**
//      * default constructor
//      *
//      * @param row database row of user
//      */
//     public Group (JsonObject row) {
//         if (row == null) {
//             throw new NullPointerException("row cannot be null.");
//         }
// 
//         if (!row.containsKey("groupID")) {
//             for (String colName : row.fieldNames()) {
//                 System.out.println("row coloum: " + colName);
//             }
// 
//             throw new IllegalArgumentException("row is invalide, no column groupID exists.");
//         }
// 
//         this.row = row;
//     }
// 
//     public long getGroupID () {
//         return this.row.getLong("groupID");
//     }
// 
//     public String getName () {
//         return this.row.getString("name");
//     }
// 
//     public String getDescription () {
//         return this.row.getString("description");
//     }
// 
//     public String getColorHex () {
//         return this.row.getString("color");
//     }
// 
//     public boolean isAutoJoin () {
//         return this.row.getInteger("auto_join") == 1;
//     }
// 
//     public boolean isActivated () {
//         return this.row.getInteger("activated") == 1;
//     }
// 
//     @Override
//     public JsonObject toJSON() {
//         return this.row;
//     }
// 
//     @Override
//     public String toString () {
//         return toJSON().encode();
//     }
// }
// 
// Path: erp-library/src/main/java/com.jukusoft/erp/lib/cache/CacheTypes.java
// public enum CacheTypes {
// 
//     /**
//     * cache entries on filesystem
//     */
//     FILE_CACHE,
// 
//     /**
//     * cache values on local memory cache
//     */
//     LOCAL_MEMORY_CACHE,
// 
//     /**
//     * cache values in distributed hazelcast cache
//     */
//     HAZELCAST_CACHE
// 
// }
// 
// Path: erp-library/src/main/java/com.jukusoft/erp/lib/cache/ICache.java
// public interface ICache {
// 
//     public void put (String key, JsonObject data);
// 
//     default void putArray (String key, JsonArray array) {
//         if (array == null) {
//             throw new NullPointerException("array cannot be null.");
//         }
// 
//         JsonObject obj = new JsonObject();
//         obj.put("array", array);
// 
//         put(key, obj);
//     }
// 
//     public void remove (String key);
// 
//     public void removeAll ();
// 
//     public boolean contains (String key);
// 
//     public JsonObject get (String key);
// 
//     default JsonArray getArray (String key) {
//         JsonObject obj = get(key);
// 
//         if (obj == null) {
//             return null;
//         }
// 
//         if (!obj.containsKey("array")) {
//             throw new IllegalStateException("cached object isnt an array.");
//         }
// 
//         return obj.getJsonArray("array");
//     }
// 
//     public void cleanUp ();
// 
// }
// 
// Path: erp-library/src/main/java/com.jukusoft/erp/lib/database/AbstractMySQLRepository.java
// public class AbstractMySQLRepository implements MySQLRepository {
// 
//     //instance of mysql database
//     private MySQLDatabase mySQLDatabase = null;
// 
//     @Override
//     public void init(Vertx vertx, MySQLDatabase database) {
//         this.mySQLDatabase = database;
//     }
// 
//     protected MySQLDatabase getMySQLDatabase () {
//         return this.mySQLDatabase;
//     }
// 
// }
// 
// Path: erp-library/src/main/java/com.jukusoft/erp/lib/utils/JsonUtils.java
// public class JsonUtils {
// 
//     public static JsonArray convertJsonObjectListToArray (List<JsonObject> rows) {
//         //create new json array
//         JsonArray array = new JsonArray();
// 
//         for (JsonObject row : rows) {
//             array.add(row);
//         }
// 
//         return array;
//     }
// 
// }


// Path: erp-data/src/main/java/com/jukusoft/data/repository/MenuRepository.java
import com.jukusoft.data.entity.Group;
import com.jukusoft.erp.lib.cache.CacheTypes;
import com.jukusoft.erp.lib.cache.ICache;
import com.jukusoft.erp.lib.cache.InjectCache;
import com.jukusoft.erp.lib.database.AbstractMySQLRepository;
import com.jukusoft.erp.lib.utils.JsonUtils;
import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import java.util.List;

package com.jukusoft.data.repository;



public class MenuRepository extends AbstractMySQLRepository {

    @InjectCache(name = "menu-cache", type = CacheTypes.HAZELCAST_CACHE)
    protected ICache menuCache;

    public void listMenusByMenuID (int menuID, Handler<AsyncResult<JsonArray>> handler) {
        //check, if cache is available
        if (this.menuCache == null) {
            throw new NullPointerException("menu cache cannot be null.");
        }

        if (menuID <= 0) {
            throw new IllegalArgumentException("menuID has to be greater than 0. Current value: " + menuID);
        }

        //check, if menu entries are in cache
        if (this.menuCache.contains("menu-" + menuID)) {
            handler.handle(Future.succeededFuture(this.menuCache.getArray("menu-" + menuID)));
            return;
        }

        //read menus from database
        getMySQLDatabase().listRows("SELECT * FROM `{prefix}menu` WHERE `menuID` = '" + menuID + "' ORDER BY `order`; ", res -> {
            if (!res.succeeded()) {
                handler.handle(Future.failedFuture(res.cause()));
                return;
            }

            //get rows
            List<JsonObject> rows = res.result();

            //convert list to json array
            JsonArray rowsArray = JsonUtils.convertJsonObjectListToArray(rows);