├── .gitignore ├── Library ├── .gitignore ├── build.gradle.kts └── src │ └── main │ └── java │ └── com │ └── jummania │ ├── DataManager.java │ ├── DataManagerFactory.java │ ├── DataManagerImpl.java │ ├── converter │ └── GsonConverter.java │ └── model │ ├── MetaData.java │ ├── PaginatedData.java │ └── Pagination.java ├── README.md ├── build.gradle.kts ├── docs └── javadoc │ ├── allclasses-index.html │ ├── allpackages-index.html │ ├── com │ └── jummania │ │ ├── DataManager.Converter.html │ │ ├── DataManager.DataObserver.html │ │ ├── DataManager.html │ │ ├── DataManagerFactory.html │ │ ├── converter │ │ ├── GsonConverter.html │ │ ├── package-summary.html │ │ └── package-tree.html │ │ ├── model │ │ ├── MetaData.html │ │ ├── PaginatedData.html │ │ ├── Pagination.html │ │ ├── package-summary.html │ │ └── package-tree.html │ │ ├── package-summary.html │ │ └── package-tree.html │ ├── element-list │ ├── help-doc.html │ ├── index-all.html │ ├── index.html │ ├── jquery-ui.overrides.css │ ├── legal │ ├── ASSEMBLY_EXCEPTION │ ├── jquery.md │ └── jqueryUI.md │ ├── member-search-index.js │ ├── module-search-index.js │ ├── overview-summary.html │ ├── overview-tree.html │ ├── package-search-index.js │ ├── resources │ ├── glass.png │ └── x.png │ ├── script-dir │ ├── jquery-3.7.1.min.js │ ├── jquery-ui.min.css │ └── jquery-ui.min.js │ ├── script.js │ ├── search.js │ ├── stylesheet.css │ ├── tag-search-index.js │ └── type-search-index.js ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── jitpack.yml └── settings.gradle.kts /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /Library/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /Library/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("java-library") 3 | id("maven-publish") 4 | } 5 | 6 | java { 7 | sourceCompatibility = JavaVersion.VERSION_1_8 8 | targetCompatibility = JavaVersion.VERSION_1_8 9 | toolchain { 10 | languageVersion = JavaLanguageVersion.of(17) 11 | } 12 | } 13 | 14 | dependencies { 15 | implementation("com.google.code.gson:gson:2.13.2") 16 | } 17 | 18 | 19 | publishing { 20 | publications { 21 | create("mavenJava") { 22 | from(components["java"]) 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /Library/src/main/java/com/jummania/DataManagerFactory.java: -------------------------------------------------------------------------------- 1 | package com.jummania; 2 | 3 | import com.jummania.converter.GsonConverter; 4 | 5 | import java.io.File; 6 | 7 | /** 8 | * Factory class for creating and managing a singleton instance of DataManager. 9 | *

10 | * This class follows the Singleton design pattern to ensure that only one instance 11 | * of DataManager is created and provides global access to it. 12 | *

13 | * It is thread-safe and provides methods to create and retrieve the DataManager instance. 14 | *

15 | * Created by Jummania on 20, November, 2024. 16 | * Email: sharifuddinjumman@gmail.com 17 | * Dhaka, Bangladesh. 18 | */ 19 | public class DataManagerFactory { 20 | 21 | // The singleton instance of DataManager 22 | private static DataManager dataManager; 23 | 24 | // Private constructor to prevent instantiation of the factory 25 | private DataManagerFactory() { 26 | } 27 | 28 | 29 | /** 30 | * Creates and returns the singleton instance of DataManager. 31 | * If the DataManager instance does not exist, it is created with the provided filesDir. 32 | * This method is synchronized to ensure thread safety during instance creation. 33 | * 34 | * @param filesDir The directory where data is to be stored. 35 | * @return The singleton instance of DataManager. 36 | */ 37 | public static synchronized DataManager create(File filesDir) { 38 | // If the instance does not exist, create a new one 39 | if (dataManager == null) { 40 | dataManager = new DataManagerImpl(filesDir, new GsonConverter()); 41 | } 42 | return dataManager; 43 | } 44 | 45 | 46 | /** 47 | * Creates and returns the singleton instance of DataManager with a specified converter. 48 | * If the DataManager instance does not exist, it is created with the provided filesDir and converter. 49 | * This method is synchronized to ensure thread safety during instance creation. 50 | * 51 | * @param filesDir The directory where data is to be stored. 52 | * @param converter The converter to be used for data serialization/deserialization. 53 | * @return The singleton instance of DataManager. 54 | */ 55 | public static synchronized DataManager create(File filesDir, DataManager.Converter converter) { 56 | // If the instance does not exist, create a new one 57 | if (dataManager == null) { 58 | dataManager = new DataManagerImpl(filesDir, converter); 59 | } 60 | return dataManager; 61 | } 62 | 63 | /** 64 | * Retrieves the singleton instance of DataManager. 65 | * If the instance is not yet created, this method throws an IllegalStateException. 66 | * 67 | * @return The singleton instance of DataManager. 68 | * @throws IllegalStateException If the DataManager instance is not yet created. 69 | */ 70 | public static DataManager getInstance() { 71 | // Check if DataManager is initialized; if not, throw an exception 72 | if (dataManager == null) { 73 | throw new IllegalStateException("DataManagerFactory is not created. Call create(getFilesDir()) first."); 74 | } 75 | return dataManager; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /Library/src/main/java/com/jummania/DataManagerImpl.java: -------------------------------------------------------------------------------- 1 | package com.jummania; 2 | 3 | import com.google.gson.JsonIOException; 4 | import com.google.gson.JsonSyntaxException; 5 | import com.google.gson.reflect.TypeToken; 6 | import com.jummania.model.MetaData; 7 | import com.jummania.model.PaginatedData; 8 | import com.jummania.model.Pagination; 9 | 10 | import java.io.BufferedInputStream; 11 | import java.io.BufferedReader; 12 | import java.io.BufferedWriter; 13 | import java.io.File; 14 | import java.io.FileInputStream; 15 | import java.io.FileNotFoundException; 16 | import java.io.FileOutputStream; 17 | import java.io.IOException; 18 | import java.io.InputStreamReader; 19 | import java.io.OutputStreamWriter; 20 | import java.io.Reader; 21 | import java.lang.reflect.Type; 22 | import java.nio.charset.StandardCharsets; 23 | import java.nio.file.Files; 24 | import java.nio.file.Path; 25 | import java.nio.file.StandardCopyOption; 26 | import java.util.ArrayList; 27 | import java.util.Collections; 28 | import java.util.List; 29 | import java.util.concurrent.ConcurrentHashMap; 30 | import java.util.concurrent.locks.ReadWriteLock; 31 | import java.util.concurrent.locks.ReentrantReadWriteLock; 32 | import java.util.function.Predicate; 33 | 34 | /** 35 | * Implementation of the {@link DataManager} interface. 36 | *

37 | * This class provides concrete logic for managing key-value data, including methods for: 38 | * - Saving and retrieving primitive types and objects 39 | * - JSON serialization/deserialization 40 | * - Managing lists with pagination 41 | * - Observing data changes 42 | *

43 | * Typically used for local storage solutions such as SharedPreferences, file-based storage, or custom memory caches. 44 | *

45 | * Created by Jummania on 20, November, 2024. 46 | * Email: sharifuddinjumman@gmail.com 47 | * Dhaka, Bangladesh. 48 | */ 49 | class DataManagerImpl implements DataManager { 50 | 51 | // Converter instance for serializing and deserializing data 52 | private final Converter converter; 53 | 54 | // Directory where the data will be stored 55 | private final File filesDir; 56 | private final int defaultCharBufferSize = 16 * 1024; 57 | private final ConcurrentHashMap lockMap = new ConcurrentHashMap<>(); 58 | 59 | // Listener to notify data changes 60 | private DataObserver dataObserver; 61 | 62 | 63 | /** 64 | * Constructor for initializing the DataManagerImpl. 65 | * Ensures that the specified directory exists or is created. 66 | * 67 | * @param filesDir The directory where data is stored. 68 | * @param converter The converter for serialization/deserialization. 69 | * @throws IllegalArgumentException If the provided filesDir or converter is null. 70 | */ 71 | DataManagerImpl(File filesDir, Converter converter) { 72 | // Ensure the filesDir argument is not null 73 | if (filesDir == null) { 74 | throw new IllegalArgumentException("The 'filesDir' argument cannot be null."); 75 | } 76 | if (converter == null) { 77 | throw new IllegalArgumentException("The 'converter' argument cannot be null."); 78 | } 79 | 80 | // Initialize the filesDir with a subdirectory called "DataManager" 81 | this.filesDir = new File(filesDir, "DataManager"); 82 | 83 | // Initialize the converter for object serialization 84 | this.converter = converter; 85 | 86 | // Check if the directory exists, and create it if necessary 87 | if (!this.filesDir.exists()) { 88 | if (!this.filesDir.mkdirs()) { 89 | System.err.println("Failed to create folder: " + this.filesDir.getAbsolutePath()); 90 | } 91 | } 92 | } 93 | 94 | 95 | @Override 96 | public void saveObject(String key, Object value, Type typeOfSrc) { 97 | 98 | // Validate inputs: Ensure the key is not null 99 | if (key == null) { 100 | throw new IllegalArgumentException("Key cannot be null"); 101 | } 102 | 103 | // If the value is null, remove the corresponding entry and return 104 | if (value == null) { 105 | remove(key); 106 | return; 107 | } 108 | 109 | // Write the string to the file using BufferedWriter for efficiency 110 | try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(getFile(key)), StandardCharsets.UTF_8), defaultCharBufferSize)) { 111 | 112 | // Write the value to the file 113 | if (value instanceof String) writer.write((String) value); 114 | else toJson(value, typeOfSrc, writer); 115 | 116 | // Notify the listener about data changes, if applicable 117 | if (dataObserver != null) { 118 | dataObserver.onDataChange(key); 119 | } 120 | 121 | } catch (Exception e) { 122 | notifyError(new IOException("Error saving data for key: '" + key + "'. Error: " + e.getMessage(), e)); 123 | } 124 | } 125 | 126 | 127 | @Override 128 | public T getObject(String key, Type type) { 129 | 130 | try (Reader reader = getReader(key)) { 131 | return fromReader(reader, type); 132 | } catch (FileNotFoundException e) { 133 | notifyError(new IOException("Failed to open file for key '" + key + "': " + e.getMessage(), e)); 134 | } catch (IOException | JsonIOException e) { 135 | notifyError(new IOException("Error reading file for key '" + key + "': " + e.getMessage(), e)); 136 | } catch (Exception e) { 137 | notifyError(new JsonSyntaxException("Error deserializing JSON for key '" + key + "': " + e.getMessage(), e)); 138 | } 139 | 140 | // Return null if an error occurs 141 | return null; 142 | } 143 | 144 | 145 | @Override 146 | public String getRawString(String key) { 147 | 148 | try (BufferedReader bufferedReader = new BufferedReader(getReader(key))) { 149 | StringBuilder sb = new StringBuilder(); 150 | String line; 151 | while ((line = bufferedReader.readLine()) != null) { 152 | sb.append(line); 153 | } 154 | return sb.toString(); 155 | } catch (FileNotFoundException e) { 156 | notifyError(new IOException("Failed to open file for key '" + key + "': " + e.getMessage(), e)); 157 | } catch (Exception e) { 158 | notifyError(new IOException("Error reading file for key '" + key + "': " + e.getMessage(), e)); 159 | } 160 | return null; 161 | } 162 | 163 | 164 | @Override 165 | public List getFullList(String key, Class eClass, boolean reverse) { 166 | 167 | ReadWriteLock lock = getLock(key); 168 | lock.readLock().lock(); 169 | 170 | try { 171 | MetaData metaData = getMetaData(key); 172 | 173 | List dataList = new ArrayList<>(); 174 | 175 | // If metadata not found, return empty list early 176 | if (metaData == null) { 177 | return dataList; 178 | } 179 | 180 | final int totalPages = metaData.getTotalPages(); 181 | if (totalPages <= 0) { 182 | return dataList; 183 | } 184 | 185 | // Prepare result list and the List type token 186 | dataList = new ArrayList<>(Math.max(0, metaData.getItemCount())); 187 | 188 | // Ensure consistent key formatting 189 | key += "."; 190 | 191 | int start = reverse ? totalPages : 1, end = reverse ? 1 : totalPages, step = reverse ? -1 : 1; 192 | List batch; 193 | Type listType = getParameterized(List.class, eClass); 194 | 195 | for (int i = start; reverse ? i >= end : i <= end; i += step) { 196 | batch = getObject(key + i, listType); 197 | if (batch == null) break; 198 | dataList.addAll(batch); 199 | } 200 | 201 | return dataList; 202 | } finally { 203 | lock.readLock().unlock(); 204 | } 205 | } 206 | 207 | 208 | @Override 209 | public PaginatedData getPagedList(String key, Class eClass, int page, boolean reverse) { 210 | 211 | ReadWriteLock lock = getLock(key); 212 | lock.readLock().lock(); 213 | 214 | try { 215 | MetaData metaData = getMetaData(key); 216 | if (metaData == null) { 217 | return getEmptyPaginateData(page, 0); 218 | } 219 | 220 | int totalPages = metaData.getTotalPages(); 221 | 222 | // If reverse: flip the page index (1 => N, 2 => N-1, etc.) 223 | int targetPage = reverse ? (totalPages - page + 1) : page; 224 | if (targetPage < 1 || targetPage > totalPages) { 225 | return getEmptyPaginateData(page, totalPages); 226 | } 227 | 228 | Type listType = getParameterized(List.class, eClass); 229 | List pageData = getObject(key + "." + targetPage, listType); 230 | if (pageData == null) pageData = Collections.emptyList(); 231 | 232 | // Previous/Next still follow the user's requested page (not the flipped index) 233 | Integer previousPage = (page > 1) ? page - 1 : null; 234 | Integer nextPage = (page < totalPages) ? page + 1 : null; 235 | 236 | Pagination pagination = new Pagination(previousPage, page, nextPage, totalPages); 237 | return new PaginatedData<>(pageData, pagination); 238 | } finally { 239 | lock.readLock().unlock(); 240 | } 241 | } 242 | 243 | 244 | @Override 245 | public void saveList(String key, List list, int listSizeLimit, int maxBatchSize) { 246 | 247 | ReadWriteLock lock = getLock(key); 248 | lock.writeLock().lock(); 249 | 250 | try { 251 | // If the list becomes empty after removal, delete the key from storage 252 | if (list != null) { 253 | 254 | listSizeLimit = Math.min(list.size(), listSizeLimit); 255 | 256 | if (listSizeLimit == 0) { 257 | remove(key); 258 | return; 259 | } 260 | 261 | // Ensure the batch size is at least 1 262 | int batchSizeLimit = Math.max(Math.min(listSizeLimit, maxBatchSize), 1); 263 | int pos = 0; 264 | 265 | key += "."; 266 | 267 | Class listClass = list.getClass(); 268 | 269 | // Split the list into smaller batches and store each one 270 | for (int i = 0; i < listSizeLimit; i += batchSizeLimit) { 271 | List batch = list.subList(i, Math.min(i + batchSizeLimit, listSizeLimit)); 272 | saveObject(key + ++pos, batch, listClass); // Store each batch with a unique key 273 | } 274 | 275 | // Save metadata about the paginated list 276 | saveObject(key + "meta", MetaData.toMeta(pos, listSizeLimit, maxBatchSize)); 277 | 278 | } else { 279 | remove(key); 280 | } 281 | } finally { 282 | lock.writeLock().unlock(); 283 | } 284 | } 285 | 286 | 287 | @Override 288 | public void appendToList(String key, E element, Class eClass, int listSizeLimit, int maxBatchSize, boolean addFirst, Predicate preventDuplication) { 289 | 290 | ReadWriteLock lock = getLock(key); 291 | lock.writeLock().lock(); 292 | 293 | try { 294 | if (element == null) return; 295 | 296 | MetaData metaData = getMetaData(key); 297 | if (metaData == null) { 298 | // Create a new list if none exists 299 | saveList(key, Collections.singletonList(element), listSizeLimit, maxBatchSize); 300 | return; 301 | } 302 | 303 | int totalPage = metaData.getTotalPages(); 304 | int itemCount = metaData.getItemCount(); 305 | maxBatchSize = metaData.getMaxBatchSize(); 306 | 307 | key += "."; 308 | 309 | // If list exceeds the size limit, shift files to remove the oldest batch 310 | if (itemCount >= listSizeLimit) { 311 | Path rootPath = filesDir.toPath(); 312 | for (int i = 2; i <= totalPage; i++) { 313 | Path oldPath = rootPath.resolve(key + i); 314 | Path newPath = rootPath.resolve(key + (i - 1)); 315 | try { 316 | Files.move(oldPath, newPath, StandardCopyOption.REPLACE_EXISTING); 317 | } catch (IOException e) { 318 | break; 319 | } 320 | } 321 | --totalPage; 322 | itemCount -= maxBatchSize; // Approximation (actual size may vary) 323 | } 324 | 325 | // Load the last batch 326 | String fileKey = key + totalPage; 327 | Type listType = getParameterized(List.class, eClass); 328 | List lastPage = getObject(fileKey, listType); 329 | if (lastPage == null) lastPage = new ArrayList<>(1); 330 | 331 | // Remove an existing matching item if predicate is provided 332 | if (preventDuplication != null) { 333 | boolean removed = removeFirstMatch(lastPage, preventDuplication); 334 | if (!removed) { 335 | List removedList; 336 | for (int i = totalPage - 1; i > 0; --i) { 337 | fileKey = key + i; 338 | removedList = getObject(fileKey, listType); 339 | if (removedList == null) break; 340 | removed = removeFirstMatch(removedList, preventDuplication); 341 | if (removed) { 342 | saveObject(fileKey, removedList, listType); 343 | break; 344 | } 345 | } 346 | } 347 | if (removed) --itemCount; 348 | } 349 | 350 | // If the last batch is full, create a new page 351 | if (lastPage.size() >= maxBatchSize) { 352 | ++totalPage; 353 | lastPage = new ArrayList<>(1); 354 | } 355 | 356 | // Add the new element to the current batch and update metadata 357 | if (addFirst) lastPage.add(0, element); 358 | else lastPage.add(element); 359 | 360 | saveObject(key + totalPage, lastPage, listType); 361 | saveObject(key + "meta", MetaData.toMeta(totalPage, itemCount + 1, maxBatchSize)); 362 | } finally { 363 | lock.writeLock().unlock(); 364 | } 365 | } 366 | 367 | @Override 368 | public boolean removeFromList(String key, Class eClass, Predicate itemToRemove) { 369 | 370 | ReadWriteLock lock = getLock(key); 371 | lock.writeLock().lock(); 372 | 373 | try { 374 | if (itemToRemove == null) return false; 375 | 376 | MetaData metaData = getMetaData(key); 377 | if (metaData == null) return false; 378 | 379 | int totalPage = metaData.getTotalPages(), itemCount = metaData.getItemCount(), maxBatchSize = metaData.getMaxBatchSize(); 380 | 381 | Type listType = getParameterized(List.class, eClass); 382 | 383 | key += "."; 384 | 385 | boolean removed; 386 | List removedList; 387 | for (int i = totalPage; i > 0; --i) { 388 | key = key + i; 389 | removedList = getObject(key, listType); 390 | if (removedList == null) return false; 391 | removed = removeFirstMatch(removedList, itemToRemove); 392 | if (removed) { 393 | saveObject(key, removedList, listType); 394 | saveObject(key + "meta", MetaData.toMeta(totalPage, itemCount - 1, maxBatchSize)); 395 | return true; 396 | } 397 | } 398 | 399 | return false; 400 | } finally { 401 | lock.writeLock().unlock(); 402 | } 403 | } 404 | 405 | 406 | @Override 407 | public T fromJson(String value, Class tClass) { 408 | return converter.fromJson(value, tClass); 409 | } 410 | 411 | 412 | @Override 413 | public T fromReader(Reader json, Type typeOfT) { 414 | return converter.fromReader(json, typeOfT); 415 | } 416 | 417 | 418 | @Override 419 | public String toJson(Object object) { 420 | return converter.toJson(object); 421 | } 422 | 423 | @Override 424 | public void toJson(Object src, Type typeOfSrc, Appendable writer) { 425 | converter.toJson(src, typeOfSrc, writer); 426 | } 427 | 428 | 429 | @Override 430 | public Type getParameterized(Type rawType, Type... typeArguments) { 431 | return TypeToken.getParameterized(rawType, typeArguments).getType(); 432 | } 433 | 434 | 435 | public void remove(String key) { 436 | 437 | remove(getFile(key + "." + "meta")); 438 | 439 | // Remove the base file 440 | remove(getFile(key)); 441 | 442 | // Notify the listener about data changes, if applicable 443 | if (dataObserver != null) { 444 | dataObserver.onDataChange(key); 445 | } 446 | } 447 | 448 | 449 | @Override 450 | public void clear() { 451 | // Ensure the directory exists before attempting to list files 452 | if (filesDir != null && filesDir.exists()) { 453 | File[] files = filesDir.listFiles(); // List all files in the directory 454 | 455 | // Check if there are any files to delete 456 | if (files != null) { 457 | // Loop through each file and remove it 458 | for (File file : files) { 459 | remove(file); // Call the remove method for each file 460 | } 461 | } 462 | } else { 463 | // If the directory does not exist, log the error 464 | notifyError(new IOException("Folder does not exist")); 465 | } 466 | } 467 | 468 | 469 | @Override 470 | public boolean contains(String key) { 471 | // Check if the file corresponding to the provided key exists in the data directory 472 | return getFile(key).exists(); 473 | } 474 | 475 | 476 | @Override 477 | public void addDataObserver(DataObserver listener) { 478 | // Set the provided listener to be notified of data changes 479 | dataObserver = listener; 480 | } 481 | 482 | 483 | @Override 484 | public void removeDataObserver() { 485 | // Set the listener to null, effectively unregistering it 486 | dataObserver = null; 487 | } 488 | 489 | 490 | private Reader getReader(String key) throws FileNotFoundException { 491 | if (key == null) { 492 | throw new IllegalArgumentException("Key cannot be null"); 493 | } 494 | return new InputStreamReader(new BufferedInputStream(new FileInputStream(getFile(key)), defaultCharBufferSize)); 495 | } 496 | 497 | 498 | private boolean remove(File file) { 499 | return file != null && file.delete(); 500 | } 501 | 502 | 503 | private File getFile(String key) { 504 | // Return the File object located in the directory with the provided key 505 | return new File(filesDir, key); 506 | } 507 | 508 | 509 | private MetaData getMetaData(String key) { 510 | return getObject(key + ".meta", MetaData.class); 511 | } 512 | 513 | 514 | private void notifyError(Throwable error) { 515 | if (dataObserver != null) { 516 | dataObserver.onError(error); 517 | } 518 | } 519 | 520 | 521 | private PaginatedData getEmptyPaginateData(int currentPage, int totalPages) { 522 | return new PaginatedData<>(Collections.emptyList(), new Pagination(null, currentPage, null, totalPages)); 523 | } 524 | 525 | 526 | private boolean removeFirstMatch(List list, Predicate filter) { 527 | if (list == null || filter == null) return false; 528 | for (int i = list.size() - 1; i >= 0; --i) { 529 | if (filter.test(list.get(i))) { 530 | list.remove(i); 531 | return true; // removed 1 element 532 | } 533 | } 534 | return false; // nothing removed 535 | } 536 | 537 | private ReadWriteLock getLock(String key) { 538 | return lockMap.computeIfAbsent(key, k -> new ReentrantReadWriteLock()); 539 | } 540 | 541 | } 542 | -------------------------------------------------------------------------------- /Library/src/main/java/com/jummania/converter/GsonConverter.java: -------------------------------------------------------------------------------- 1 | package com.jummania.converter; 2 | 3 | import com.google.gson.Gson; 4 | import com.jummania.DataManager; 5 | 6 | import java.io.Reader; 7 | import java.lang.reflect.Type; 8 | 9 | /** 10 | * GsonConverter is an implementation of the Converter interface 11 | * that utilizes the Gson library for converting Java objects 12 | * to JSON format and vice versa. 13 | * 14 | *

This class provides methods to serialize Java objects to JSON strings 15 | * and to deserialize JSON strings back into Java objects using the Gson library.

16 | *

17 | * Created by Jummania on 08, December, 2024. 18 | * Email: sharifuddinjumman@gmail.com 19 | * Dhaka, Bangladesh. 20 | */ 21 | public class GsonConverter implements DataManager.Converter { 22 | private final Gson gson; 23 | 24 | 25 | /** 26 | * Default constructor that initializes the Gson instance. 27 | */ 28 | public GsonConverter() { 29 | gson = new Gson(); 30 | } 31 | 32 | 33 | /** 34 | * Constructor that accepts a custom Gson instance. 35 | * 36 | * @param gson the Gson instance to be used for conversions 37 | */ 38 | public GsonConverter(Gson gson) { 39 | this.gson = gson; 40 | } 41 | 42 | 43 | @Override 44 | public String toJson(T data) { 45 | return gson.toJson(data); 46 | } 47 | 48 | 49 | @Override 50 | public void toJson(Object src, Type typeOfSrc, Appendable writer) { 51 | gson.toJson(src, typeOfSrc, writer); 52 | } 53 | 54 | 55 | @Override 56 | public T fromJson(String json, Class tClass) { 57 | return gson.fromJson(json, tClass); 58 | } 59 | 60 | 61 | @Override 62 | public T fromReader(Reader json, Type typeOfT) { 63 | return gson.fromJson(json, typeOfT); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Library/src/main/java/com/jummania/model/MetaData.java: -------------------------------------------------------------------------------- 1 | package com.jummania.model; 2 | 3 | 4 | /** 5 | * Represents metadata for a paginated list. 6 | *

7 | * This class stores information about a list that is split into pages: 8 | *

13 | *

14 | * It also provides a utility method {@link #toMeta(int, int, int)} to generate 15 | * a JSON string representation of the metadata. 16 | */ 17 | public class MetaData { 18 | private final int totalPages; 19 | private final int itemCount; 20 | private final int maxBatchSize; 21 | 22 | /** 23 | * Constructs a new MetaData object. 24 | * 25 | * @param totalPages the total number of pages 26 | * @param itemCount the total number of items across all pages 27 | * @param maxBatchSize the maximum number of items per page 28 | */ 29 | public MetaData(int totalPages, int itemCount, int maxBatchSize) { 30 | this.totalPages = totalPages; 31 | this.itemCount = itemCount; 32 | this.maxBatchSize = maxBatchSize; 33 | } 34 | 35 | /** 36 | * Generates a JSON string representing the metadata. 37 | * 38 | * @param totalPages the total number of pages 39 | * @param itemCount the total number of items 40 | * @param maxBatchSize the maximum number of items per page 41 | * @return a JSON string representing the metadata 42 | */ 43 | public static String toMeta(int totalPages, int itemCount, int maxBatchSize) { 44 | return "{\"totalPages\":" + totalPages + ",\"itemCount\":" + itemCount + ",\"maxBatchSize\":" + maxBatchSize + "}"; 45 | } 46 | 47 | /** 48 | * Returns the total number of pages. 49 | * 50 | * @return the total pages 51 | */ 52 | public int getTotalPages() { 53 | return totalPages; 54 | } 55 | 56 | /** 57 | * Returns the total number of items across all pages. 58 | * 59 | * @return the item count 60 | */ 61 | public int getItemCount() { 62 | return itemCount; 63 | } 64 | 65 | /** 66 | * Returns the maximum number of items allowed per page. 67 | * 68 | * @return the max array size 69 | */ 70 | public int getMaxBatchSize() { 71 | return maxBatchSize; 72 | } 73 | } -------------------------------------------------------------------------------- /Library/src/main/java/com/jummania/model/PaginatedData.java: -------------------------------------------------------------------------------- 1 | package com.jummania.model; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * A generic class representing a paginated data set. 7 | * This class holds a list of data items and pagination information. 8 | *

9 | * Created by Jummania on 8, May, 2025. 10 | * Email: sharifuddinjumman@gmail.com 11 | * Dhaka, Bangladesh. 12 | * 13 | * @param the type of data items in the list 14 | */ 15 | public class PaginatedData { 16 | public List data; 17 | public Pagination pagination; 18 | 19 | 20 | /** 21 | * Constructs a PaginatedData object with the specified data and pagination information. 22 | * 23 | * @param data the list of data items for the current page 24 | * @param pagination the pagination information (e.g., current page, total pages) 25 | */ 26 | public PaginatedData(List data, Pagination pagination) { 27 | this.data = data; 28 | this.pagination = pagination; 29 | } 30 | 31 | 32 | /** 33 | * Returns a string representation of the PaginatedData object. 34 | * The string contains the data and pagination details. 35 | * 36 | * @return a string representing the PaginatedData object 37 | */ 38 | @Override 39 | public String toString() { 40 | return String.format("PaginatedData{data = %s, pagination = %s}", data, pagination); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Library/src/main/java/com/jummania/model/Pagination.java: -------------------------------------------------------------------------------- 1 | package com.jummania.model; 2 | 3 | /** 4 | * A class representing pagination information. 5 | * This class holds details about the current page, previous page, next page, and total pages. 6 | *

7 | * Created by Jummania on 8, May, 2025. 8 | * Email: sharifuddinjumman@gmail.com 9 | * Dhaka, Bangladesh. 10 | */ 11 | public class Pagination { 12 | public Integer previousPage; 13 | public int currentPage; 14 | public Integer nextPage; 15 | public int totalPages; 16 | 17 | 18 | /** 19 | * Constructs a Pagination object with the specified page information. 20 | * 21 | * @param previousPage the previous page number, or {@code null} if there is no previous page 22 | * @param currentPage the current page number 23 | * @param nextPage the next page number, or {@code null} if there is no next page 24 | * @param totalPages the total number of pages 25 | */ 26 | public Pagination(Integer previousPage, int currentPage, Integer nextPage, int totalPages) { 27 | this.previousPage = previousPage; 28 | this.currentPage = currentPage; 29 | this.nextPage = nextPage; 30 | this.totalPages = totalPages; 31 | } 32 | 33 | 34 | /** 35 | * Returns a string representation of the Pagination object. 36 | * The string contains the pagination details: previous page, current page, next page, and total pages. 37 | * 38 | * @return a string representing the Pagination object 39 | */ 40 | @Override 41 | public String toString() { 42 | return String.format("Pagination{previousPage = %s, currentPage = %d, nextPage = %s, totalPages = %d}", previousPage, currentPage, nextPage, totalPages); 43 | } 44 | } 45 | 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DataManager Library 2 | 3 | ![Build Status](https://img.shields.io/badge/build-passing-brightgreen) 4 | [![](https://jitpack.io/v/Jumman04/DataManager.svg)](https://jitpack.io/#Jumman04/DataManager) 5 | ![License](https://img.shields.io/badge/license-MIT-lightgrey) 6 | 7 | A simple, efficient, and flexible data management library for Java and Android. 8 | Easily store, retrieve, and manipulate data using JSON serialization with support for type safety, 9 | pagination, and file-based persistence. 10 | 11 | ## Features 12 | 13 | - **JSON Serialization/Deserialization**: Easily convert objects to and from JSON format. 14 | - **File-based Data Storage**: Store objects, strings, integers, booleans, lists, and more in local 15 | storage. 16 | - **Batch Data Handling**: Efficiently save and load lists in batches to optimize memory usage. 17 | - **On Data Change Listener**: Listen to changes in data to update your app in real time. 18 | - **Type-Safe Operations**: Work with strongly-typed objects and use generics for flexibility. 19 | - **Customizable Converter**: **NEW in version 2.8!** You can choose from the following built-in 20 | converters: 21 | - **GsonConverter**: Uses the Google Gson library for serialization and deserialization. 22 | 23 | You can also create your own converter by implementing the `DataManager.Converter` interface, 24 | allowing for even greater flexibility in handling data. 25 | 26 | --- 27 | 28 | ## Installation 29 | 30 | To include this library in your project, simply clone this repository and build the project, or you 31 | can manually add the source code to your project. 32 | 33 | Follow these steps to integrate the **DataManager** library into your project: 34 | 35 | ### Step 1: Add the JitPack Repository 36 | 37 | Add the JitPack repository to your root `settings.gradle` file: 38 | 39 | ```groovy 40 | dependencyResolutionManagement { 41 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 42 | repositories { 43 | mavenCentral() 44 | maven { url 'https://jitpack.io' } 45 | } 46 | } 47 | ``` 48 | 49 | ### Step 2: Add the Dependency 50 | 51 | Add the following dependency to your module-level `build.gradle` file: 52 | 53 | ```groovy 54 | implementation 'com.github.Jumman04:DataManager:3.0' 55 | ``` 56 | 57 | --- 58 | 59 | ## Usage 60 | 61 | ### 1. Initializing the DataManager 62 | 63 | You can initialize the DataManager with a custom converter: 64 | 65 | ```java 66 | DataManager dataManager = DataManagerFactory.create(getFilesDir(), new GsonConverter()); 67 | ``` 68 | 69 | ### 2. Storing Data 70 | 71 | Store simple data types or complex objects: 72 | 73 | ```java 74 | dataManager.putString("user_name","John Doe"); 75 | dataManager. 76 | 77 | putInt("user_age",30); 78 | ``` 79 | 80 | Store a list of objects: 81 | 82 | ```java 83 | List fruits = Arrays.asList("Apple", "Banana", "Cherry"); 84 | dataManager. 85 | 86 | putList("fruits",fruits); 87 | ``` 88 | 89 | ### 3. Retrieving Data 90 | 91 | Retrieve data with a specified key: 92 | 93 | ```java 94 | String userName = dataManager.getString("user_name", "Default Name"); 95 | int userAge = dataManager.getInt("user_age", 0); 96 | ``` 97 | 98 | Retrieve a list of data: 99 | 100 | ```java 101 | // Retrieve the full list of fruits (not recommended for very large datasets) 102 | List fruitsFull = dataManager.getFullList("fruits", String.class); 103 | 104 | // Retrieve a paginated list of fruits (page 1) 105 | PaginatedData fruitsPage = dataManager.getPagedList("fruits", String.class, 1); 106 | 107 | ``` 108 | 109 | ### 4. Data Change Listener 110 | 111 | You can register a listener to detect when data changes: 112 | 113 | ```java 114 | dataManager.addDataObserver(new DataObserver() { 115 | @Override 116 | public void onDataChange (String key){ 117 | // Handle data change for the specific key 118 | } 119 | 120 | @Override 121 | public void onError (Throwable error){ 122 | // Handle error if necessary 123 | System.err.println("Error occurred for key '" + key + "': " + error.getMessage()); 124 | } 125 | }); 126 | ``` 127 | 128 | ### 5. Creating a Custom Converter 129 | 130 | To create your own converter, implement the `DataManager.Converter` interface as follows: 131 | 132 | ```java 133 | public class MyCustomConverter implements DataManager.Converter { 134 | @Override 135 | public String toJson(T data) { 136 | return // Implement serialization logic 137 | } 138 | 139 | @Override 140 | public T fromJson(String json, Type typeOfT) { 141 | return // Implement deserialization logic 142 | } 143 | 144 | @Override 145 | public T fromReader(Reader json, Type typeOfT) { 146 | return // Implement deserialization logic from a Reader 147 | } 148 | } 149 | ``` 150 | 151 | You can then use your custom converter when initializing the `DataManager`: 152 | 153 | ```java 154 | DataManager dataManager = DataManagerFactory.create(getFilesDir(), new MyCustomConverter()); 155 | ``` 156 | 157 | ## Methods Overview 158 | 159 | | Return Type | Method Name | Description | 160 | |---------------|--------------------------------------------------------------------------------|-----------------------------------------------------------------------------| 161 | | `String` | `getRawString(String key)` | Retrieves the raw JSON string associated with the key. | 162 | | `` | `getObject(String key, Type type)` | Retrieves an object of the specified type. | 163 | | ` List` | `getFullList(String key, Type type)` | Retrieves the full list of objects (⚠️ not recommended for large datasets). | 164 | | `` | `PaginatedData getPagedList(String key, Type type, int page)` | Retrieves a paginated subset of the list. | 165 | | `String` | `getString(String key)` | Retrieves a String value or `null` if not found. | 166 | | `String` | `getString(String key, String defValue)` | Retrieves a String value with a fallback default. | 167 | | `int` | `getInt(String key)` | Retrieves an int value or 0 if not found. | 168 | | `int` | `getInt(String key, int defValue)` | Retrieves an int value with a fallback default. | 169 | | `long` | `getLong(String key)` | Retrieves a long value or 0L if not found. | 170 | | `long` | `getLong(String key, long defValue)` | Retrieves a long value with a fallback default. | 171 | | `float` | `getFloat(String key)` | Retrieves a float value or 0.0f if not found. | 172 | | `float` | `getFloat(String key, float defValue)` | Retrieves a float value with a fallback default. | 173 | | `boolean` | `getBoolean(String key)` | Retrieves a boolean value or `false` if not found. | 174 | | `boolean` | `getBoolean(String key, boolean defValue)` | Retrieves a boolean value with a fallback default. | 175 | | `` | `fromJson(String value, Type typeOfT)` | Converts a JSON string to an object of the specified type. | 176 | | `` | `fromReader(Reader json, Type typeOfT)` | Converts JSON from a `Reader` to an object of the specified type. | 177 | | `String` | `toJson(Object object)` | Converts an object to a JSON string. | 178 | | `Type` | `getParameterized(Type rawType, Type... typeArguments)` | Constructs a parameterized generic type. | 179 | | `void` | `saveString(String key, String value)` | Saves a String value. | 180 | | `void` | `saveInt(String key, int value)` | Saves an int value. | 181 | | `void` | `saveLong(String key, long value)` | Saves a long value. | 182 | | `void` | `saveFloat(String key, float value)` | Saves a float value. | 183 | | `void` | `saveBoolean(String key, boolean value)` | Saves a boolean value. | 184 | | `void` | `saveObject(String key, Object value)` | Saves an object. | 185 | | `` | `saveList(String key, List value)` | Saves a full list. | 186 | | `` | `saveList(String key, List value, int maxArraySize)` | Saves a list with a maximum size (for paging). | 187 | | `void` | `appendToList(String key, Object element)` | Appends an element to the end of the list. | 188 | | `void` | `appendToList(String key, Object element, boolean removeDuplicate)` | Appends an element, optionally removing duplicates. | 189 | | `void` | `appendToList(String key, int index, Object element)` | Inserts an element at a specific index. | 190 | | `void` | `appendToList(String key, int index, Object element, boolean removeDuplicate)` | Inserts at index with optional duplicate removal. | 191 | | `void` | `removeFromList(String key, int index)` | Removes an element at a specific index from the list. | 192 | | `void` | `remove(String key)` | Removes the item associated with the key. | 193 | | `void` | `clear()` | Clears all stored data. | 194 | | `boolean` | `contains(String key)` | Checks if a key exists in storage. | 195 | | `void` | `addDataObserver(DataObserver observer)` | Registers a data observer for change notifications. | 196 | | `void` | `removeDataObserver(DataObserver observer)` | Unregisters a data observer. | 197 | 198 | For more methods, refer to 199 | the [documentation](https://jumman04.github.io/DataManager/doc/index.html). 200 | 201 | ## Contributing 202 | 203 | We welcome contributions from the community! If you'd like to contribute, please fork the 204 | repository, make your changes, and submit a pull request. 205 | 206 | ## License 207 | 208 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. 209 | 210 | ## Support 211 | 212 | For any issues, please open an issue on GitHub, and we will get back to you as soon as possible. 213 | 214 | --- 215 | 216 | Created with ❤️ by [Jummania](https://github.com/yourusername) 217 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | plugins { 3 | id("com.android.library") version "8.7.2" apply false 4 | } -------------------------------------------------------------------------------- /docs/javadoc/allclasses-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | All Classes and Interfaces (Library API) 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 25 |

JavaScript is disabled on your browser.
27 | 28 |
29 | 53 |
54 |
55 |
56 |

All Classes and Interfaces

57 |
58 |
59 |
60 | 66 | 72 | 78 |
79 |
81 |
82 |
Class
83 |
Description
84 | 87 |
88 |
Interface for managing data operations such as 89 | saving, retrieving, and deleting key-value data, 90 | including support for JSON serialization, pagination, and list 91 | management. 92 |
93 |
94 | 97 |
98 |
Interface for converting between Java objects and 99 | JSON representations. 100 |
101 |
102 | 105 |
106 |   107 |
108 | 111 |
112 |
Factory class for creating and managing a singleton 113 | instance of DataManager. 114 |
115 |
116 | 119 |
120 |
GsonConverter is an implementation of the Converter 121 | interface 122 | that utilizes the Gson library for converting Java objects 123 | to JSON format and vice versa. 124 |
125 |
126 |
127 | MetaData
129 |
130 |
Represents metadata for a paginated list.
131 |
132 |
133 | PaginatedData<E> 137 |
138 |
139 |
A generic class representing a paginated data set. 140 |
141 |
142 |
143 | Pagination
145 |
146 |
A class representing pagination information.
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 | 155 | 156 | -------------------------------------------------------------------------------- /docs/javadoc/allpackages-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | All Packages (Library API) 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

All Packages

53 |
54 |
Package Summary
55 |
56 |
Package
57 |
Description
58 | 60 |
 
61 | 64 |
 
65 | 67 |
 
68 |
69 |
70 |
71 |
72 | 73 | 74 | -------------------------------------------------------------------------------- /docs/javadoc/com/jummania/DataManager.DataObserver.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | DataManager.DataObserver (Library API) 6 | 7 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 26 | 29 |
30 | 69 |
70 |
71 | 72 |
73 |
Package com.jummania
75 |

Interface 76 | DataManager.DataObserver

77 |
78 |
79 |
80 |
Enclosing interface:
81 |
DataManager 82 |
83 |
84 |
85 |
public static interface DataManager.DataObserver
88 |
89 |
90 |
    91 | 92 |
  • 93 |
    94 |

    Method Summary

    95 |
    96 |
    98 | 105 | 112 | 119 |
    120 |
    122 |
    123 |
    Modifier and Type
    124 |
    Method
    125 |
    Description
    126 |
    127 | void
    128 |
    129 | onDataChange 131 | 132 | (String key) 135 |
    136 |
    137 |
    Called when the data associated with 138 | a specific key has changed. 139 |
    140 |
    141 |
    142 | void
    143 |
    144 | onError 146 | 147 | (Throwable error) 150 |
    151 |
    152 |
    Called when an error occurs while 153 | processing data. 154 |
    155 |
    156 |
    157 |
    158 |
    159 |
    160 |
  • 161 |
162 |
163 |
164 |
    165 | 166 |
  • 167 |
    168 |

    Method Details

    169 |
      170 |
    • 171 |
      172 |

      onDataChange

      173 |
      void onDataChange 176 | 177 | (String key) 181 |
      182 |
      Called when the data associated with a 183 | specific key has changed. 184 |
      185 |
      186 |
      Parameters:
      187 |
      key - The key whose associated data has 188 | changed. 189 |
      190 |
      191 |
      192 |
    • 193 |
    • 194 |
      195 |

      onError

      196 |
      void onError 199 | 200 | (Throwable error) 204 |
      205 |
      Called when an error occurs while 206 | processing data. 207 |
      208 |
      209 |
      Parameters:
      210 |
      error - The exception or error 211 | encountered. 212 |
      213 |
      214 |
      215 |
    • 216 |
    217 |
    218 |
  • 219 |
220 |
221 | 222 |
223 |
224 |
225 | 226 | 227 | -------------------------------------------------------------------------------- /docs/javadoc/com/jummania/converter/package-summary.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.jummania.converter (Library API) 6 | 7 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 22 | 25 |
26 | 59 |
60 |
61 |
62 |

Package 63 | com.jummania.converter

64 |
65 |
66 |
package com.jummania.converter
68 |
69 |
    70 |
  • 71 | 85 |
  • 86 |
  • 87 |
    88 |
    Classes
    89 |
    90 |
    Class
    91 |
    Description
    92 |
    93 | GsonConverter 95 |
    96 |
    97 |
    GsonConverter is an implementation of the 98 | Converter interface 99 | that utilizes the Gson library for converting Java objects 100 | to JSON format and vice versa. 101 |
    102 |
    103 |
    104 |
    105 |
  • 106 |
107 |
108 |
109 |
110 |
111 | 112 | 113 | -------------------------------------------------------------------------------- /docs/javadoc/com/jummania/converter/package-tree.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.jummania.converter Class Hierarchy (Library API) 6 | 7 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 22 | 25 |
26 | 50 |
51 |
52 |
53 |

Hierarchy For Package com.jummania.converter

54 | Package Hierarchies: 55 | 58 |
59 |
60 |

Class Hierarchy

61 | 76 |
77 |
78 |
79 |
80 | 81 | 82 | -------------------------------------------------------------------------------- /docs/javadoc/com/jummania/model/package-summary.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.jummania.model (Library API) 6 | 7 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 22 | 25 |
26 | 59 |
60 |
61 |
62 |

Package com.jummania.model

63 |
64 |
65 |
package com.jummania.model
67 |
68 |
    69 |
  • 70 | 84 |
  • 85 |
  • 86 |
    87 |
    Classes
    88 |
    89 |
    Class
    90 |
    Description
    91 |
    92 | MetaData 93 |
    94 |
    95 |
    Represents metadata for a paginated list. 96 |
    97 |
    98 |
    99 | PaginatedData<E> 101 |
    102 |
    103 |
    A generic class representing a paginated data 104 | set. 105 |
    106 |
    107 |
    108 | Pagination 109 |
    110 |
    111 |
    A class representing pagination 112 | information. 113 |
    114 |
    115 |
    116 |
    117 |
  • 118 |
119 |
120 |
121 |
122 |
123 | 124 | 125 | -------------------------------------------------------------------------------- /docs/javadoc/com/jummania/model/package-tree.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.jummania.model Class Hierarchy (Library API) 6 | 7 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 22 | 25 |
26 | 50 |
51 |
52 |
53 |

Hierarchy For Package com.jummania.model

54 | Package Hierarchies: 55 | 58 |
59 |
60 |

Class Hierarchy

61 | 82 |
83 |
84 |
85 |
86 | 87 | 88 | -------------------------------------------------------------------------------- /docs/javadoc/com/jummania/package-summary.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.jummania (Library API) 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 25 | 28 |
29 | 62 |
63 |
64 |
65 |

Package com.jummania

66 |
67 |
68 |
package com.jummania 69 |
70 |
71 |
    72 |
  • 73 | 88 |
  • 89 |
  • 90 |
    91 |
    92 | 98 | 104 | 110 |
    111 |
    113 |
    114 |
    Class
    115 |
    Description
    116 | 119 |
    120 |
    Interface for managing data operations 121 | such as saving, retrieving, and deleting key-value data, 122 | including support for JSON serialization, pagination, 123 | and list management. 124 |
    125 |
    126 |
    127 | DataManager.Converter 129 |
    130 |
    131 |
    Interface for converting between Java 132 | objects and JSON representations. 133 |
    134 |
    135 | 139 |
    140 |   141 |
    142 |
    143 | DataManagerFactory 145 |
    146 |
    147 |
    Factory class for creating and managing a 148 | singleton instance of DataManager. 149 |
    150 |
    151 |
    152 |
    153 |
    154 |
  • 155 |
156 |
157 |
158 |
159 |
160 | 161 | 162 | -------------------------------------------------------------------------------- /docs/javadoc/com/jummania/package-tree.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.jummania Class Hierarchy (Library API) 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Hierarchy For Package com.jummania

53 | Package Hierarchies: 54 | 57 |
58 |
59 |

Class Hierarchy

60 | 73 |
74 |
75 |

Interface Hierarchy

76 | 90 |
91 |
92 |
93 |
94 | 95 | 96 | -------------------------------------------------------------------------------- /docs/javadoc/element-list: -------------------------------------------------------------------------------- 1 | com.jummania 2 | com.jummania.converter 3 | com.jummania.model 4 | -------------------------------------------------------------------------------- /docs/javadoc/help-doc.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | API Help (Library API) 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 21 | 24 |
25 | 56 |
57 |
58 |

JavaDoc Help

59 | 78 |
79 |
80 |

Navigation

81 | Starting from the Overview page, you can browse the 82 | documentation using the links in each page, and in the navigation bar at the top of 83 | each page. The Index and Search box allow you to 84 | navigate to specific declarations and summary pages, including: All Packages, All 86 | Classes and Interfaces 87 | 102 |
103 |
104 |
105 |

Kinds of Pages

106 | The following sections describe the different kinds of pages in this collection. 107 |
108 |

Overview

109 |

The Overview page is the front page of this API 110 | document and provides a list of all packages with a summary for each. This 111 | page can also contain an overall description of the set of packages.

112 |
113 |
114 |

Package

115 |

Each package has a page that contains a list of its classes and interfaces, 116 | with a summary for each. These pages may contain the following 117 | categories:

118 |
    119 |
  • Interfaces
  • 120 |
  • Classes
  • 121 |
  • Enum Classes
  • 122 |
  • Exceptions
  • 123 |
  • Errors
  • 124 |
  • Annotation Interfaces
  • 125 |
126 |
127 |
128 |

Class or Interface

129 |

Each class, interface, nested class and nested interface has its own separate 130 | page. Each of these pages has three sections consisting of a declaration and 131 | description, member summary tables, and detailed member descriptions. 132 | Entries in each of these sections are omitted if they are empty or not 133 | applicable.

134 |
    135 |
  • Class Inheritance Diagram
  • 136 |
  • Direct Subclasses
  • 137 |
  • All Known Subinterfaces
  • 138 |
  • All Known Implementing Classes
  • 139 |
  • Class or Interface Declaration
  • 140 |
  • Class or Interface Description
  • 141 |
142 |
143 |
    144 |
  • Nested Class Summary
  • 145 |
  • Enum Constant Summary
  • 146 |
  • Field Summary
  • 147 |
  • Property Summary
  • 148 |
  • Constructor Summary
  • 149 |
  • Method Summary
  • 150 |
  • Required Element Summary
  • 151 |
  • Optional Element Summary
  • 152 |
153 |
154 |
    155 |
  • Enum Constant Details
  • 156 |
  • Field Details
  • 157 |
  • Property Details
  • 158 |
  • Constructor Details
  • 159 |
  • Method Details
  • 160 |
  • Element Details
  • 161 |
162 |

Note: Annotation interfaces have required and 163 | optional elements, but not methods. Only enum classes have enum constants. 164 | The components of a record class are displayed as part of the declaration of 165 | the record class. Properties are a feature of JavaFX.

166 |

The summary entries are alphabetical, while the detailed descriptions are in 167 | the order they appear in the source code. This preserves the logical 168 | groupings established by the programmer.

169 |
170 |
171 |

Other Files

172 |

Packages and modules may contain pages with additional information related to 173 | the declarations nearby.

174 |
175 |
176 |

Tree (Class Hierarchy)

177 |

There is a Class Hierarchy page for all 178 | packages, plus a hierarchy for each package. Each hierarchy page contains a 179 | list of classes and a list of interfaces. Classes are organized by 180 | inheritance structure starting with java.lang.Object. 181 | Interfaces do not inherit from java.lang.Object.

182 |
    183 |
  • When viewing the Overview page, clicking on TREE displays the hierarchy 184 | for all packages. 185 |
  • 186 |
  • When viewing a particular package, class or interface page, clicking on 187 | TREE displays the hierarchy for only that package. 188 |
  • 189 |
190 |
191 |
192 |

All Packages

193 |

The All Packages page contains an 194 | alphabetic index of all packages contained in the documentation.

195 |
196 |
197 |

All Classes and Interfaces

198 |

The All Classes and Interfaces page 199 | contains an alphabetic index of all classes and interfaces contained in the 200 | documentation, including annotation interfaces, enum classes, and record 201 | classes.

202 |
203 |
204 |

Index

205 |

The Index contains an alphabetic index of all 206 | classes, interfaces, constructors, methods, and fields in the documentation, 207 | as well as summary pages such as All 208 | Packages, All Classes and 209 | Interfaces.

210 |
211 |
212 |
213 | This help file applies to API documentation generated by the standard doclet. 214 |
215 |
216 |
217 | 218 | 219 | -------------------------------------------------------------------------------- /docs/javadoc/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Overview (Library API) 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Library API

53 |
54 |
55 |
Packages
56 |
57 |
Package
58 |
Description
59 | 61 |
62 |   63 |
64 | 67 |
68 |   69 |
70 |
71 | com.jummania.model 72 |
73 |
74 |   75 |
76 |
77 |
78 |
79 |
80 |
81 | 82 | 83 | -------------------------------------------------------------------------------- /docs/javadoc/jquery-ui.overrides.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 | * 5 | * This code is free software; you can redistribute it and/or modify it 6 | * under the terms of the GNU General Public License version 2 only, as 7 | * published by the Free Software Foundation. Oracle designates this 8 | * particular file as subject to the "Classpath" exception as provided 9 | * by Oracle in the LICENSE file that accompanied this code. 10 | * 11 | * This code is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 | * version 2 for more details (a copy is included in the LICENSE file that 15 | * accompanied this code). 16 | * 17 | * You should have received a copy of the GNU General Public License version 18 | * 2 along with this work; if not, write to the Free Software Foundation, 19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 | * 21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 | * or visit www.oracle.com if you need additional information or have any 23 | * questions. 24 | */ 25 | 26 | .ui-state-active, 27 | .ui-widget-content .ui-state-active, 28 | .ui-widget-header .ui-state-active, 29 | a.ui-button:active, 30 | .ui-button:active, 31 | .ui-button.ui-state-active:hover { 32 | /* Overrides the color of selection used in jQuery UI */ 33 | background: #F8981D; 34 | border: 1px solid #F8981D; 35 | } 36 | -------------------------------------------------------------------------------- /docs/javadoc/legal/ASSEMBLY_EXCEPTION: -------------------------------------------------------------------------------- 1 | 2 | OPENJDK ASSEMBLY EXCEPTION 3 | 4 | The OpenJDK source code made available by Oracle America, Inc. (Oracle) at 5 | openjdk.java.net ("OpenJDK Code") is distributed under the terms of the GNU 6 | General Public License version 2 7 | only ("GPL2"), with the following clarification and special exception. 8 | 9 | Linking this OpenJDK Code statically or dynamically with other code 10 | is making a combined work based on this library. Thus, the terms 11 | and conditions of GPL2 cover the whole combination. 12 | 13 | As a special exception, Oracle gives you permission to link this 14 | OpenJDK Code with certain code licensed by Oracle as indicated at 15 | http://openjdk.java.net/legal/exception-modules-2007-05-08.html 16 | ("Designated Exception Modules") to produce an executable, 17 | regardless of the license terms of the Designated Exception Modules, 18 | and to copy and distribute the resulting executable under GPL2, 19 | provided that the Designated Exception Modules continue to be 20 | governed by the licenses under which they were offered by Oracle. 21 | 22 | As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code 23 | to build an executable that includes those portions of necessary code that 24 | Oracle could not provide under GPL2 (or that Oracle has provided under GPL2 25 | with the Classpath exception). If you modify or add to the OpenJDK code, 26 | that new GPL2 code may still be combined with Designated Exception Modules 27 | if the new code is made subject to this exception by its copyright holder. 28 | -------------------------------------------------------------------------------- /docs/javadoc/legal/jquery.md: -------------------------------------------------------------------------------- 1 | ## jQuery v3.7.1 2 | 3 | ### jQuery License 4 | ``` 5 | jQuery v 3.7.1 6 | Copyright OpenJS Foundation and other contributors, https://openjsf.org/ 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining 9 | a copy of this software and associated documentation files (the 10 | "Software"), to deal in the Software without restriction, including 11 | without limitation the rights to use, copy, modify, merge, publish, 12 | distribute, sublicense, and/or sell copies of the Software, and to 13 | permit persons to whom the Software is furnished to do so, subject to 14 | the following conditions: 15 | 16 | The above copyright notice and this permission notice shall be 17 | included in all copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 23 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 24 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 25 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 | ``` 27 | -------------------------------------------------------------------------------- /docs/javadoc/legal/jqueryUI.md: -------------------------------------------------------------------------------- 1 | ## jQuery UI v1.13.2 2 | 3 | ### jQuery UI License 4 | ``` 5 | Copyright jQuery Foundation and other contributors, https://jquery.org/ 6 | 7 | This software consists of voluntary contributions made by many 8 | individuals. For exact contribution history, see the revision history 9 | available at https://github.com/jquery/jquery-ui 10 | 11 | The following license applies to all parts of this software except as 12 | documented below: 13 | 14 | ==== 15 | 16 | Permission is hereby granted, free of charge, to any person obtaining 17 | a copy of this software and associated documentation files (the 18 | "Software"), to deal in the Software without restriction, including 19 | without limitation the rights to use, copy, modify, merge, publish, 20 | distribute, sublicense, and/or sell copies of the Software, and to 21 | permit persons to whom the Software is furnished to do so, subject to 22 | the following conditions: 23 | 24 | The above copyright notice and this permission notice shall be 25 | included in all copies or substantial portions of the Software. 26 | 27 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 28 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 29 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 30 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 31 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 32 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 33 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 34 | 35 | ==== 36 | 37 | Copyright and related rights for sample code are waived via CC0. Sample 38 | code is defined as all source code contained within the demos directory. 39 | 40 | CC0: http://creativecommons.org/publicdomain/zero/1.0/ 41 | 42 | ==== 43 | 44 | All files located in the node_modules and external directories are 45 | externally maintained libraries used by this software which have their 46 | own licenses; we recommend you read them, as their terms may differ from 47 | the terms above. 48 | 49 | ``` 50 | -------------------------------------------------------------------------------- /docs/javadoc/member-search-index.js: -------------------------------------------------------------------------------- 1 | memberSearchIndex = [{"p":"com.jummania","c":"DataManager","l":"addDataObserver(DataManager.DataObserver)","u":"addDataObserver(com.jummania.DataManager.DataObserver)"},{"p":"com.jummania","c":"DataManager","l":"appendToList(String, E, Class)","u":"appendToList(java.lang.String,E,java.lang.Class)"},{"p":"com.jummania","c":"DataManager","l":"appendToList(String, E, Class, int, int, Predicate)","u":"appendToList(java.lang.String,E,java.lang.Class,int,int,java.util.function.Predicate)"},{"p":"com.jummania","c":"DataManager","l":"clear()"},{"p":"com.jummania","c":"DataManager","l":"contains(String)","u":"contains(java.lang.String)"},{"p":"com.jummania","c":"DataManagerFactory","l":"create(File)","u":"create(java.io.File)"},{"p":"com.jummania","c":"DataManagerFactory","l":"create(File, DataManager.Converter)","u":"create(java.io.File,com.jummania.DataManager.Converter)"},{"p":"com.jummania.model","c":"Pagination","l":"currentPage"},{"p":"com.jummania.model","c":"PaginatedData","l":"data"},{"p":"com.jummania.converter","c":"GsonConverter","l":"fromJson(String, Class)","u":"fromJson(java.lang.String,java.lang.Class)"},{"p":"com.jummania","c":"DataManager.Converter","l":"fromJson(String, Class)","u":"fromJson(java.lang.String,java.lang.Class)"},{"p":"com.jummania","c":"DataManager","l":"fromJson(String, Class)","u":"fromJson(java.lang.String,java.lang.Class)"},{"p":"com.jummania.converter","c":"GsonConverter","l":"fromReader(Reader, Type)","u":"fromReader(java.io.Reader,java.lang.reflect.Type)"},{"p":"com.jummania","c":"DataManager.Converter","l":"fromReader(Reader, Type)","u":"fromReader(java.io.Reader,java.lang.reflect.Type)"},{"p":"com.jummania","c":"DataManager","l":"fromReader(Reader, Type)","u":"fromReader(java.io.Reader,java.lang.reflect.Type)"},{"p":"com.jummania","c":"DataManager","l":"getBoolean(String)","u":"getBoolean(java.lang.String)"},{"p":"com.jummania","c":"DataManager","l":"getBoolean(String, boolean)","u":"getBoolean(java.lang.String,boolean)"},{"p":"com.jummania","c":"DataManagerFactory","l":"getDataManager()"},{"p":"com.jummania","c":"DataManager","l":"getFloat(String)","u":"getFloat(java.lang.String)"},{"p":"com.jummania","c":"DataManager","l":"getFloat(String, float)","u":"getFloat(java.lang.String,float)"},{"p":"com.jummania","c":"DataManager","l":"getFullList(String, Class)","u":"getFullList(java.lang.String,java.lang.Class)"},{"p":"com.jummania","c":"DataManager","l":"getInt(String)","u":"getInt(java.lang.String)"},{"p":"com.jummania","c":"DataManager","l":"getInt(String, int)","u":"getInt(java.lang.String,int)"},{"p":"com.jummania.model","c":"MetaData","l":"getItemCount()"},{"p":"com.jummania","c":"DataManager","l":"getLong(String)","u":"getLong(java.lang.String)"},{"p":"com.jummania","c":"DataManager","l":"getLong(String, long)","u":"getLong(java.lang.String,long)"},{"p":"com.jummania.model","c":"MetaData","l":"getMaxBatchSize()"},{"p":"com.jummania","c":"DataManager","l":"getObject(String, Type)","u":"getObject(java.lang.String,java.lang.reflect.Type)"},{"p":"com.jummania","c":"DataManager","l":"getPagedList(String, Class, int)","u":"getPagedList(java.lang.String,java.lang.Class,int)"},{"p":"com.jummania","c":"DataManager","l":"getPagedList(String, Class, int, boolean)","u":"getPagedList(java.lang.String,java.lang.Class,int,boolean)"},{"p":"com.jummania","c":"DataManager","l":"getParameterized(Type, Type...)","u":"getParameterized(java.lang.reflect.Type,java.lang.reflect.Type...)"},{"p":"com.jummania","c":"DataManager","l":"getRawString(String)","u":"getRawString(java.lang.String)"},{"p":"com.jummania","c":"DataManager","l":"getString(String)","u":"getString(java.lang.String)"},{"p":"com.jummania","c":"DataManager","l":"getString(String, String)","u":"getString(java.lang.String,java.lang.String)"},{"p":"com.jummania.model","c":"MetaData","l":"getTotalPages()"},{"p":"com.jummania.converter","c":"GsonConverter","l":"GsonConverter()","u":"%3Cinit%3E()"},{"p":"com.jummania.converter","c":"GsonConverter","l":"GsonConverter(Gson)","u":"%3Cinit%3E(com.google.gson.Gson)"},{"p":"com.jummania.model","c":"MetaData","l":"MetaData(int, int, int)","u":"%3Cinit%3E(int,int,int)"},{"p":"com.jummania.model","c":"Pagination","l":"nextPage"},{"p":"com.jummania","c":"DataManager.DataObserver","l":"onDataChange(String)","u":"onDataChange(java.lang.String)"},{"p":"com.jummania","c":"DataManager.DataObserver","l":"onError(Throwable)","u":"onError(java.lang.Throwable)"},{"p":"com.jummania.model","c":"PaginatedData","l":"PaginatedData(List, Pagination)","u":"%3Cinit%3E(java.util.List,com.jummania.model.Pagination)"},{"p":"com.jummania.model","c":"PaginatedData","l":"pagination"},{"p":"com.jummania.model","c":"Pagination","l":"Pagination(Integer, int, Integer, int)","u":"%3Cinit%3E(java.lang.Integer,int,java.lang.Integer,int)"},{"p":"com.jummania.model","c":"Pagination","l":"previousPage"},{"p":"com.jummania","c":"DataManager","l":"remove(String)","u":"remove(java.lang.String)"},{"p":"com.jummania","c":"DataManager","l":"removeDataObserver()"},{"p":"com.jummania","c":"DataManager","l":"saveBoolean(String, boolean)","u":"saveBoolean(java.lang.String,boolean)"},{"p":"com.jummania","c":"DataManager","l":"saveFloat(String, float)","u":"saveFloat(java.lang.String,float)"},{"p":"com.jummania","c":"DataManager","l":"saveInt(String, int)","u":"saveInt(java.lang.String,int)"},{"p":"com.jummania","c":"DataManager","l":"saveList(String, List)","u":"saveList(java.lang.String,java.util.List)"},{"p":"com.jummania","c":"DataManager","l":"saveList(String, List, int, int)","u":"saveList(java.lang.String,java.util.List,int,int)"},{"p":"com.jummania","c":"DataManager","l":"saveLong(String, long)","u":"saveLong(java.lang.String,long)"},{"p":"com.jummania","c":"DataManager","l":"saveObject(String, Object)","u":"saveObject(java.lang.String,java.lang.Object)"},{"p":"com.jummania","c":"DataManager","l":"saveObject(String, Object, Type)","u":"saveObject(java.lang.String,java.lang.Object,java.lang.reflect.Type)"},{"p":"com.jummania","c":"DataManager","l":"toJson(Object)","u":"toJson(java.lang.Object)"},{"p":"com.jummania.converter","c":"GsonConverter","l":"toJson(Object, Type, Appendable)","u":"toJson(java.lang.Object,java.lang.reflect.Type,java.lang.Appendable)"},{"p":"com.jummania","c":"DataManager.Converter","l":"toJson(Object, Type, Appendable)","u":"toJson(java.lang.Object,java.lang.reflect.Type,java.lang.Appendable)"},{"p":"com.jummania","c":"DataManager","l":"toJson(Object, Type, Appendable)","u":"toJson(java.lang.Object,java.lang.reflect.Type,java.lang.Appendable)"},{"p":"com.jummania.converter","c":"GsonConverter","l":"toJson(T)"},{"p":"com.jummania","c":"DataManager.Converter","l":"toJson(T)"},{"p":"com.jummania.model","c":"MetaData","l":"toMeta(int, int, int)","u":"toMeta(int,int,int)"},{"p":"com.jummania.model","c":"PaginatedData","l":"toString()"},{"p":"com.jummania.model","c":"Pagination","l":"toString()"},{"p":"com.jummania.model","c":"Pagination","l":"totalPages"}];updateSearchResults(); -------------------------------------------------------------------------------- /docs/javadoc/module-search-index.js: -------------------------------------------------------------------------------- 1 | moduleSearchIndex = [];updateSearchResults(); -------------------------------------------------------------------------------- /docs/javadoc/overview-summary.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Library API 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 18 |
19 | 22 |

index.html

23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /docs/javadoc/overview-tree.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Class Hierarchy (Library API) 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 21 | 24 |
25 | 49 |
50 |
51 |
52 |

Hierarchy For All Packages

53 | Package Hierarchies: 54 | 61 |
62 |
63 |

Class Hierarchy

64 | 94 |
95 |
96 |

Interface Hierarchy

97 | 109 |
110 |
111 |
112 |
113 | 114 | 115 | -------------------------------------------------------------------------------- /docs/javadoc/package-search-index.js: -------------------------------------------------------------------------------- 1 | packageSearchIndex = [{"l":"All Packages","u":"allpackages-index.html"},{"l":"com.jummania"},{"l":"com.jummania.converter"},{"l":"com.jummania.model"}];updateSearchResults(); -------------------------------------------------------------------------------- /docs/javadoc/resources/glass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jumman04/DataManager/a43d31f313e390faa63c9c57efd92b9a470819d1/docs/javadoc/resources/glass.png -------------------------------------------------------------------------------- /docs/javadoc/resources/x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jumman04/DataManager/a43d31f313e390faa63c9c57efd92b9a470819d1/docs/javadoc/resources/x.png -------------------------------------------------------------------------------- /docs/javadoc/script-dir/jquery-ui.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.13.2 - 2023-02-27 2 | * http://jqueryui.com 3 | * Includes: core.css, autocomplete.css, menu.css 4 | * Copyright jQuery Foundation and other contributors; Licensed MIT */ 5 | 6 | .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;-ms-filter:"alpha(opacity=0)"}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0} -------------------------------------------------------------------------------- /docs/javadoc/script.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 | * 5 | * This code is free software; you can redistribute it and/or modify it 6 | * under the terms of the GNU General Public License version 2 only, as 7 | * published by the Free Software Foundation. Oracle designates this 8 | * particular file as subject to the "Classpath" exception as provided 9 | * by Oracle in the LICENSE file that accompanied this code. 10 | * 11 | * This code is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 | * version 2 for more details (a copy is included in the LICENSE file that 15 | * accompanied this code). 16 | * 17 | * You should have received a copy of the GNU General Public License version 18 | * 2 along with this work; if not, write to the Free Software Foundation, 19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 | * 21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 | * or visit www.oracle.com if you need additional information or have any 23 | * questions. 24 | */ 25 | 26 | var moduleSearchIndex; 27 | var packageSearchIndex; 28 | var typeSearchIndex; 29 | var memberSearchIndex; 30 | var tagSearchIndex; 31 | function loadScripts(doc, tag) { 32 | createElem(doc, tag, 'search.js'); 33 | 34 | createElem(doc, tag, 'module-search-index.js'); 35 | createElem(doc, tag, 'package-search-index.js'); 36 | createElem(doc, tag, 'type-search-index.js'); 37 | createElem(doc, tag, 'member-search-index.js'); 38 | createElem(doc, tag, 'tag-search-index.js'); 39 | } 40 | 41 | function createElem(doc, tag, path) { 42 | var script = doc.createElement(tag); 43 | var scriptElement = doc.getElementsByTagName(tag)[0]; 44 | script.src = pathtoroot + path; 45 | scriptElement.parentNode.insertBefore(script, scriptElement); 46 | } 47 | 48 | function show(tableId, selected, columns) { 49 | if (tableId !== selected) { 50 | document.querySelectorAll('div.' + tableId + ':not(.' + selected + ')') 51 | .forEach(function(elem) { 52 | elem.style.display = 'none'; 53 | }); 54 | } 55 | document.querySelectorAll('div.' + selected) 56 | .forEach(function(elem, index) { 57 | elem.style.display = ''; 58 | var isEvenRow = index % (columns * 2) < columns; 59 | elem.classList.remove(isEvenRow ? oddRowColor : evenRowColor); 60 | elem.classList.add(isEvenRow ? evenRowColor : oddRowColor); 61 | }); 62 | updateTabs(tableId, selected); 63 | } 64 | 65 | function updateTabs(tableId, selected) { 66 | document.getElementById(tableId + '.tabpanel') 67 | .setAttribute('aria-labelledby', selected); 68 | document.querySelectorAll('button[id^="' + tableId + '"]') 69 | .forEach(function(tab, index) { 70 | if (selected === tab.id || (tableId === selected && index === 0)) { 71 | tab.className = activeTableTab; 72 | tab.setAttribute('aria-selected', true); 73 | tab.setAttribute('tabindex',0); 74 | } else { 75 | tab.className = tableTab; 76 | tab.setAttribute('aria-selected', false); 77 | tab.setAttribute('tabindex',-1); 78 | } 79 | }); 80 | } 81 | 82 | function switchTab(e) { 83 | var selected = document.querySelector('[aria-selected=true]'); 84 | if (selected) { 85 | if ((e.keyCode === 37 || e.keyCode === 38) && selected.previousSibling) { 86 | // left or up arrow key pressed: move focus to previous tab 87 | selected.previousSibling.click(); 88 | selected.previousSibling.focus(); 89 | e.preventDefault(); 90 | } else if ((e.keyCode === 39 || e.keyCode === 40) && selected.nextSibling) { 91 | // right or down arrow key pressed: move focus to next tab 92 | selected.nextSibling.click(); 93 | selected.nextSibling.focus(); 94 | e.preventDefault(); 95 | } 96 | } 97 | } 98 | 99 | var updateSearchResults = function() {}; 100 | 101 | function indexFilesLoaded() { 102 | return moduleSearchIndex 103 | && packageSearchIndex 104 | && typeSearchIndex 105 | && memberSearchIndex 106 | && tagSearchIndex; 107 | } 108 | 109 | // Workaround for scroll position not being included in browser history (8249133) 110 | document.addEventListener("DOMContentLoaded", function(e) { 111 | var contentDiv = document.querySelector("div.flex-content"); 112 | window.addEventListener("popstate", function(e) { 113 | if (e.state !== null) { 114 | contentDiv.scrollTop = e.state; 115 | } 116 | }); 117 | window.addEventListener("hashchange", function(e) { 118 | history.replaceState(contentDiv.scrollTop, document.title); 119 | }); 120 | contentDiv.addEventListener("scroll", function(e) { 121 | var timeoutID; 122 | if (!timeoutID) { 123 | timeoutID = setTimeout(function() { 124 | history.replaceState(contentDiv.scrollTop, document.title); 125 | timeoutID = null; 126 | }, 100); 127 | } 128 | }); 129 | if (!location.hash) { 130 | history.replaceState(contentDiv.scrollTop, document.title); 131 | } 132 | }); 133 | -------------------------------------------------------------------------------- /docs/javadoc/search.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 | * 5 | * This code is free software; you can redistribute it and/or modify it 6 | * under the terms of the GNU General Public License version 2 only, as 7 | * published by the Free Software Foundation. Oracle designates this 8 | * particular file as subject to the "Classpath" exception as provided 9 | * by Oracle in the LICENSE file that accompanied this code. 10 | * 11 | * This code is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 | * version 2 for more details (a copy is included in the LICENSE file that 15 | * accompanied this code). 16 | * 17 | * You should have received a copy of the GNU General Public License version 18 | * 2 along with this work; if not, write to the Free Software Foundation, 19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 | * 21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 | * or visit www.oracle.com if you need additional information or have any 23 | * questions. 24 | */ 25 | 26 | var noResult = {l: "No results found"}; 27 | var loading = {l: "Loading search index..."}; 28 | var catModules = "Modules"; 29 | var catPackages = "Packages"; 30 | var catTypes = "Classes and Interfaces"; 31 | var catMembers = "Members"; 32 | var catSearchTags = "Search Tags"; 33 | var highlight = "$&"; 34 | var searchPattern = ""; 35 | var fallbackPattern = ""; 36 | var RANKING_THRESHOLD = 2; 37 | var NO_MATCH = 0xffff; 38 | var MIN_RESULTS = 3; 39 | var MAX_RESULTS = 500; 40 | var UNNAMED = ""; 41 | function escapeHtml(str) { 42 | return str.replace(//g, ">"); 43 | } 44 | function getHighlightedText(item, matcher, fallbackMatcher) { 45 | var escapedItem = escapeHtml(item); 46 | var highlighted = escapedItem.replace(matcher, highlight); 47 | if (highlighted === escapedItem) { 48 | highlighted = escapedItem.replace(fallbackMatcher, highlight) 49 | } 50 | return highlighted; 51 | } 52 | function getURLPrefix(ui) { 53 | var urlPrefix=""; 54 | var slash = "/"; 55 | if (ui.item.category === catModules) { 56 | return ui.item.l + slash; 57 | } else if (ui.item.category === catPackages && ui.item.m) { 58 | return ui.item.m + slash; 59 | } else if (ui.item.category === catTypes || ui.item.category === catMembers) { 60 | if (ui.item.m) { 61 | urlPrefix = ui.item.m + slash; 62 | } else { 63 | $.each(packageSearchIndex, function(index, item) { 64 | if (item.m && ui.item.p === item.l) { 65 | urlPrefix = item.m + slash; 66 | } 67 | }); 68 | } 69 | } 70 | return urlPrefix; 71 | } 72 | function createSearchPattern(term) { 73 | var pattern = ""; 74 | var isWordToken = false; 75 | term.replace(/,\s*/g, ", ").trim().split(/\s+/).forEach(function(w, index) { 76 | if (index > 0) { 77 | // whitespace between identifiers is significant 78 | pattern += (isWordToken && /^\w/.test(w)) ? "\\s+" : "\\s*"; 79 | } 80 | var tokens = w.split(/(?=[A-Z,.()<>[\/])/); 81 | for (var i = 0; i < tokens.length; i++) { 82 | var s = tokens[i]; 83 | if (s === "") { 84 | continue; 85 | } 86 | pattern += $.ui.autocomplete.escapeRegex(s); 87 | isWordToken = /\w$/.test(s); 88 | if (isWordToken) { 89 | pattern += "([a-z0-9_$<>\\[\\]]*?)"; 90 | } 91 | } 92 | }); 93 | return pattern; 94 | } 95 | function createMatcher(pattern, flags) { 96 | var isCamelCase = /[A-Z]/.test(pattern); 97 | return new RegExp(pattern, flags + (isCamelCase ? "" : "i")); 98 | } 99 | var watermark = 'Search'; 100 | $(function() { 101 | var search = $("#search-input"); 102 | var reset = $("#reset-button"); 103 | search.val(''); 104 | search.prop("disabled", false); 105 | reset.prop("disabled", false); 106 | search.val(watermark).addClass('watermark'); 107 | search.blur(function() { 108 | if ($(this).val().length === 0) { 109 | $(this).val(watermark).addClass('watermark'); 110 | } 111 | }); 112 | search.on('click keydown paste', function() { 113 | if ($(this).val() === watermark) { 114 | $(this).val('').removeClass('watermark'); 115 | } 116 | }); 117 | reset.click(function() { 118 | search.val('').focus(); 119 | }); 120 | search.focus()[0].setSelectionRange(0, 0); 121 | }); 122 | $.widget("custom.catcomplete", $.ui.autocomplete, { 123 | _create: function() { 124 | this._super(); 125 | this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)"); 126 | }, 127 | _renderMenu: function(ul, items) { 128 | var rMenu = this; 129 | var currentCategory = ""; 130 | rMenu.menu.bindings = $(); 131 | $.each(items, function(index, item) { 132 | var li; 133 | if (item.category && item.category !== currentCategory) { 134 | ul.append("
  • " + item.category + "
  • "); 135 | currentCategory = item.category; 136 | } 137 | li = rMenu._renderItemData(ul, item); 138 | if (item.category) { 139 | li.attr("aria-label", item.category + " : " + item.l); 140 | li.attr("class", "result-item"); 141 | } else { 142 | li.attr("aria-label", item.l); 143 | li.attr("class", "result-item"); 144 | } 145 | }); 146 | }, 147 | _renderItem: function(ul, item) { 148 | var label = ""; 149 | var matcher = createMatcher(escapeHtml(searchPattern), "g"); 150 | var fallbackMatcher = new RegExp(fallbackPattern, "gi") 151 | if (item.category === catModules) { 152 | label = getHighlightedText(item.l, matcher, fallbackMatcher); 153 | } else if (item.category === catPackages) { 154 | label = getHighlightedText(item.l, matcher, fallbackMatcher); 155 | } else if (item.category === catTypes) { 156 | label = (item.p && item.p !== UNNAMED) 157 | ? getHighlightedText(item.p + "." + item.l, matcher, fallbackMatcher) 158 | : getHighlightedText(item.l, matcher, fallbackMatcher); 159 | } else if (item.category === catMembers) { 160 | label = (item.p && item.p !== UNNAMED) 161 | ? getHighlightedText(item.p + "." + item.c + "." + item.l, matcher, fallbackMatcher) 162 | : getHighlightedText(item.c + "." + item.l, matcher, fallbackMatcher); 163 | } else if (item.category === catSearchTags) { 164 | label = getHighlightedText(item.l, matcher, fallbackMatcher); 165 | } else { 166 | label = item.l; 167 | } 168 | var li = $("
  • ").appendTo(ul); 169 | var div = $("
    ").appendTo(li); 170 | if (item.category === catSearchTags && item.h) { 171 | if (item.d) { 172 | div.html(label + " (" + item.h + ")
    " 173 | + item.d + "
    "); 174 | } else { 175 | div.html(label + " (" + item.h + ")"); 176 | } 177 | } else { 178 | if (item.m) { 179 | div.html(item.m + "/" + label); 180 | } else { 181 | div.html(label); 182 | } 183 | } 184 | return li; 185 | } 186 | }); 187 | function rankMatch(match, category) { 188 | if (!match) { 189 | return NO_MATCH; 190 | } 191 | var index = match.index; 192 | var input = match.input; 193 | var leftBoundaryMatch = 2; 194 | var periferalMatch = 0; 195 | // make sure match is anchored on a left word boundary 196 | if (index === 0 || /\W/.test(input[index - 1]) || "_" === input[index]) { 197 | leftBoundaryMatch = 0; 198 | } else if ("_" === input[index - 1] || (input[index] === input[index].toUpperCase() && !/^[A-Z0-9_$]+$/.test(input))) { 199 | leftBoundaryMatch = 1; 200 | } 201 | var matchEnd = index + match[0].length; 202 | var leftParen = input.indexOf("("); 203 | var endOfName = leftParen > -1 ? leftParen : input.length; 204 | // exclude peripheral matches 205 | if (category !== catModules && category !== catSearchTags) { 206 | var delim = category === catPackages ? "/" : "."; 207 | if (leftParen > -1 && leftParen < index) { 208 | periferalMatch += 2; 209 | } else if (input.lastIndexOf(delim, endOfName) >= matchEnd) { 210 | periferalMatch += 2; 211 | } 212 | } 213 | var delta = match[0].length === endOfName ? 0 : 1; // rank full match higher than partial match 214 | for (var i = 1; i < match.length; i++) { 215 | // lower ranking if parts of the name are missing 216 | if (match[i]) 217 | delta += match[i].length; 218 | } 219 | if (category === catTypes) { 220 | // lower ranking if a type name contains unmatched camel-case parts 221 | if (/[A-Z]/.test(input.substring(matchEnd))) 222 | delta += 5; 223 | if (/[A-Z]/.test(input.substring(0, index))) 224 | delta += 5; 225 | } 226 | return leftBoundaryMatch + periferalMatch + (delta / 200); 227 | 228 | } 229 | function doSearch(request, response) { 230 | var result = []; 231 | searchPattern = createSearchPattern(request.term); 232 | fallbackPattern = createSearchPattern(request.term.toLowerCase()); 233 | if (searchPattern === "") { 234 | return this.close(); 235 | } 236 | var camelCaseMatcher = createMatcher(searchPattern, ""); 237 | var fallbackMatcher = new RegExp(fallbackPattern, "i"); 238 | 239 | function searchIndexWithMatcher(indexArray, matcher, category, nameFunc) { 240 | if (indexArray) { 241 | var newResults = []; 242 | $.each(indexArray, function (i, item) { 243 | item.category = category; 244 | var ranking = rankMatch(matcher.exec(nameFunc(item)), category); 245 | if (ranking < RANKING_THRESHOLD) { 246 | newResults.push({ranking: ranking, item: item}); 247 | } 248 | return newResults.length <= MAX_RESULTS; 249 | }); 250 | return newResults.sort(function(e1, e2) { 251 | return e1.ranking - e2.ranking; 252 | }).map(function(e) { 253 | return e.item; 254 | }); 255 | } 256 | return []; 257 | } 258 | function searchIndex(indexArray, category, nameFunc) { 259 | var primaryResults = searchIndexWithMatcher(indexArray, camelCaseMatcher, category, nameFunc); 260 | result = result.concat(primaryResults); 261 | if (primaryResults.length <= MIN_RESULTS && !camelCaseMatcher.ignoreCase) { 262 | var secondaryResults = searchIndexWithMatcher(indexArray, fallbackMatcher, category, nameFunc); 263 | result = result.concat(secondaryResults.filter(function (item) { 264 | return primaryResults.indexOf(item) === -1; 265 | })); 266 | } 267 | } 268 | 269 | searchIndex(moduleSearchIndex, catModules, function(item) { return item.l; }); 270 | searchIndex(packageSearchIndex, catPackages, function(item) { 271 | return (item.m && request.term.indexOf("/") > -1) 272 | ? (item.m + "/" + item.l) : item.l; 273 | }); 274 | searchIndex(typeSearchIndex, catTypes, function(item) { 275 | return request.term.indexOf(".") > -1 ? item.p + "." + item.l : item.l; 276 | }); 277 | searchIndex(memberSearchIndex, catMembers, function(item) { 278 | return request.term.indexOf(".") > -1 279 | ? item.p + "." + item.c + "." + item.l : item.l; 280 | }); 281 | searchIndex(tagSearchIndex, catSearchTags, function(item) { return item.l; }); 282 | 283 | if (!indexFilesLoaded()) { 284 | updateSearchResults = function() { 285 | doSearch(request, response); 286 | } 287 | result.unshift(loading); 288 | } else { 289 | updateSearchResults = function() {}; 290 | } 291 | response(result); 292 | } 293 | $(function() { 294 | $("#search-input").catcomplete({ 295 | minLength: 1, 296 | delay: 300, 297 | source: doSearch, 298 | response: function(event, ui) { 299 | if (!ui.content.length) { 300 | ui.content.push(noResult); 301 | } else { 302 | $("#search-input").empty(); 303 | } 304 | }, 305 | autoFocus: true, 306 | focus: function(event, ui) { 307 | return false; 308 | }, 309 | position: { 310 | collision: "flip" 311 | }, 312 | select: function(event, ui) { 313 | if (ui.item.category) { 314 | var url = getURLPrefix(ui); 315 | if (ui.item.category === catModules) { 316 | url += "module-summary.html"; 317 | } else if (ui.item.category === catPackages) { 318 | if (ui.item.u) { 319 | url = ui.item.u; 320 | } else { 321 | url += ui.item.l.replace(/\./g, '/') + "/package-summary.html"; 322 | } 323 | } else if (ui.item.category === catTypes) { 324 | if (ui.item.u) { 325 | url = ui.item.u; 326 | } else if (ui.item.p === UNNAMED) { 327 | url += ui.item.l + ".html"; 328 | } else { 329 | url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.l + ".html"; 330 | } 331 | } else if (ui.item.category === catMembers) { 332 | if (ui.item.p === UNNAMED) { 333 | url += ui.item.c + ".html" + "#"; 334 | } else { 335 | url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.c + ".html" + "#"; 336 | } 337 | if (ui.item.u) { 338 | url += ui.item.u; 339 | } else { 340 | url += ui.item.l; 341 | } 342 | } else if (ui.item.category === catSearchTags) { 343 | url += ui.item.u; 344 | } 345 | if (top !== window) { 346 | parent.classFrame.location = pathtoroot + url; 347 | } else { 348 | window.location.href = pathtoroot + url; 349 | } 350 | $("#search-input").focus(); 351 | } 352 | } 353 | }); 354 | }); 355 | -------------------------------------------------------------------------------- /docs/javadoc/stylesheet.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Javadoc style sheet 3 | */ 4 | 5 | @import url('resources/fonts/dejavu.css'); 6 | 7 | /* 8 | * Styles for individual HTML elements. 9 | * 10 | * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular 11 | * HTML element throughout the page. 12 | */ 13 | 14 | body { 15 | background-color:#ffffff; 16 | color:#353833; 17 | font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; 18 | font-size:14px; 19 | margin:0; 20 | padding:0; 21 | height:100%; 22 | width:100%; 23 | } 24 | iframe { 25 | margin:0; 26 | padding:0; 27 | height:100%; 28 | width:100%; 29 | overflow-y:scroll; 30 | border:none; 31 | } 32 | a:link, a:visited { 33 | text-decoration:none; 34 | color:#4A6782; 35 | } 36 | a[href]:hover, a[href]:focus { 37 | text-decoration:none; 38 | color:#bb7a2a; 39 | } 40 | a[name] { 41 | color:#353833; 42 | } 43 | pre { 44 | font-family:'DejaVu Sans Mono', monospace; 45 | font-size:14px; 46 | } 47 | h1 { 48 | font-size:20px; 49 | } 50 | h2 { 51 | font-size:18px; 52 | } 53 | h3 { 54 | font-size:16px; 55 | } 56 | h4 { 57 | font-size:15px; 58 | } 59 | h5 { 60 | font-size:14px; 61 | } 62 | h6 { 63 | font-size:13px; 64 | } 65 | ul { 66 | list-style-type:disc; 67 | } 68 | code, tt { 69 | font-family:'DejaVu Sans Mono', monospace; 70 | } 71 | :not(h1, h2, h3, h4, h5, h6) > code, 72 | :not(h1, h2, h3, h4, h5, h6) > tt { 73 | font-size:14px; 74 | padding-top:4px; 75 | margin-top:8px; 76 | line-height:1.4em; 77 | } 78 | dt code { 79 | font-family:'DejaVu Sans Mono', monospace; 80 | font-size:14px; 81 | padding-top:4px; 82 | } 83 | .summary-table dt code { 84 | font-family:'DejaVu Sans Mono', monospace; 85 | font-size:14px; 86 | vertical-align:top; 87 | padding-top:4px; 88 | } 89 | sup { 90 | font-size:8px; 91 | } 92 | button { 93 | font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; 94 | font-size: 14px; 95 | } 96 | /* 97 | * Styles for HTML generated by javadoc. 98 | * 99 | * These are style classes that are used by the standard doclet to generate HTML documentation. 100 | */ 101 | 102 | /* 103 | * Styles for document title and copyright. 104 | */ 105 | .clear { 106 | clear:both; 107 | height:0; 108 | overflow:hidden; 109 | } 110 | .about-language { 111 | float:right; 112 | padding:0 21px 8px 8px; 113 | font-size:11px; 114 | margin-top:-9px; 115 | height:2.9em; 116 | } 117 | .legal-copy { 118 | margin-left:.5em; 119 | } 120 | .tab { 121 | background-color:#0066FF; 122 | color:#ffffff; 123 | padding:8px; 124 | width:5em; 125 | font-weight:bold; 126 | } 127 | /* 128 | * Styles for navigation bar. 129 | */ 130 | @media screen { 131 | .flex-box { 132 | position:fixed; 133 | display:flex; 134 | flex-direction:column; 135 | height: 100%; 136 | width: 100%; 137 | } 138 | .flex-header { 139 | flex: 0 0 auto; 140 | } 141 | .flex-content { 142 | flex: 1 1 auto; 143 | overflow-y: auto; 144 | } 145 | } 146 | .top-nav { 147 | background-color:#4D7A97; 148 | color:#FFFFFF; 149 | float:left; 150 | padding:0; 151 | width:100%; 152 | clear:right; 153 | min-height:2.8em; 154 | padding-top:10px; 155 | overflow:hidden; 156 | font-size:12px; 157 | } 158 | .sub-nav { 159 | background-color:#dee3e9; 160 | float:left; 161 | width:100%; 162 | overflow:hidden; 163 | font-size:12px; 164 | } 165 | .sub-nav div { 166 | clear:left; 167 | float:left; 168 | padding:0 0 5px 6px; 169 | text-transform:uppercase; 170 | } 171 | .sub-nav .nav-list { 172 | padding-top:5px; 173 | } 174 | ul.nav-list { 175 | display:block; 176 | margin:0 25px 0 0; 177 | padding:0; 178 | } 179 | ul.sub-nav-list { 180 | float:left; 181 | margin:0 25px 0 0; 182 | padding:0; 183 | } 184 | ul.nav-list li { 185 | list-style:none; 186 | float:left; 187 | padding: 5px 6px; 188 | text-transform:uppercase; 189 | } 190 | .sub-nav .nav-list-search { 191 | float:right; 192 | margin:0 0 0 0; 193 | padding:5px 6px; 194 | clear:none; 195 | } 196 | .nav-list-search label { 197 | position:relative; 198 | right:-16px; 199 | } 200 | ul.sub-nav-list li { 201 | list-style:none; 202 | float:left; 203 | padding-top:10px; 204 | } 205 | .top-nav a:link, .top-nav a:active, .top-nav a:visited { 206 | color:#FFFFFF; 207 | text-decoration:none; 208 | text-transform:uppercase; 209 | } 210 | .top-nav a:hover { 211 | text-decoration:none; 212 | color:#bb7a2a; 213 | text-transform:uppercase; 214 | } 215 | .nav-bar-cell1-rev { 216 | background-color:#F8981D; 217 | color:#253441; 218 | margin: auto 5px; 219 | } 220 | .skip-nav { 221 | position:absolute; 222 | top:auto; 223 | left:-9999px; 224 | overflow:hidden; 225 | } 226 | /* 227 | * Hide navigation links and search box in print layout 228 | */ 229 | @media print { 230 | ul.nav-list, div.sub-nav { 231 | display:none; 232 | } 233 | } 234 | /* 235 | * Styles for page header and footer. 236 | */ 237 | .title { 238 | color:#2c4557; 239 | margin:10px 0; 240 | } 241 | .sub-title { 242 | margin:5px 0 0 0; 243 | } 244 | .header ul { 245 | margin:0 0 15px 0; 246 | padding:0; 247 | } 248 | .header ul li, .footer ul li { 249 | list-style:none; 250 | font-size:13px; 251 | } 252 | /* 253 | * Styles for headings. 254 | */ 255 | body.class-declaration-page .summary h2, 256 | body.class-declaration-page .details h2, 257 | body.class-use-page h2, 258 | body.module-declaration-page .block-list h2 { 259 | font-style: italic; 260 | padding:0; 261 | margin:15px 0; 262 | } 263 | body.class-declaration-page .summary h3, 264 | body.class-declaration-page .details h3, 265 | body.class-declaration-page .summary .inherited-list h2 { 266 | background-color:#dee3e9; 267 | border:1px solid #d0d9e0; 268 | margin:0 0 6px -8px; 269 | padding:7px 5px; 270 | } 271 | /* 272 | * Styles for page layout containers. 273 | */ 274 | main { 275 | clear:both; 276 | padding:10px 20px; 277 | position:relative; 278 | } 279 | dl.notes > dt { 280 | font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; 281 | font-size:12px; 282 | font-weight:bold; 283 | margin:10px 0 0 0; 284 | color:#4E4E4E; 285 | } 286 | dl.notes > dd { 287 | margin:5px 10px 10px 0; 288 | font-size:14px; 289 | font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; 290 | } 291 | dl.name-value > dt { 292 | margin-left:1px; 293 | font-size:1.1em; 294 | display:inline; 295 | font-weight:bold; 296 | } 297 | dl.name-value > dd { 298 | margin:0 0 0 1px; 299 | font-size:1.1em; 300 | display:inline; 301 | } 302 | /* 303 | * Styles for lists. 304 | */ 305 | li.circle { 306 | list-style:circle; 307 | } 308 | ul.horizontal li { 309 | display:inline; 310 | font-size:0.9em; 311 | } 312 | div.inheritance { 313 | margin:0; 314 | padding:0; 315 | } 316 | div.inheritance div.inheritance { 317 | margin-left:2em; 318 | } 319 | ul.block-list, 320 | ul.details-list, 321 | ul.member-list, 322 | ul.summary-list { 323 | margin:10px 0 10px 0; 324 | padding:0; 325 | } 326 | ul.block-list > li, 327 | ul.details-list > li, 328 | ul.member-list > li, 329 | ul.summary-list > li { 330 | list-style:none; 331 | margin-bottom:15px; 332 | line-height:1.4; 333 | } 334 | .summary-table dl, .summary-table dl dt, .summary-table dl dd { 335 | margin-top:0; 336 | margin-bottom:1px; 337 | } 338 | ul.see-list, ul.see-list-long { 339 | padding-left: 0; 340 | list-style: none; 341 | } 342 | ul.see-list li { 343 | display: inline; 344 | } 345 | ul.see-list li:not(:last-child):after, 346 | ul.see-list-long li:not(:last-child):after { 347 | content: ", "; 348 | white-space: pre-wrap; 349 | } 350 | /* 351 | * Styles for tables. 352 | */ 353 | .summary-table, .details-table { 354 | width:100%; 355 | border-spacing:0; 356 | border-left:1px solid #EEE; 357 | border-right:1px solid #EEE; 358 | border-bottom:1px solid #EEE; 359 | padding:0; 360 | } 361 | .caption { 362 | position:relative; 363 | text-align:left; 364 | background-repeat:no-repeat; 365 | color:#253441; 366 | font-weight:bold; 367 | clear:none; 368 | overflow:hidden; 369 | padding:0; 370 | padding-top:10px; 371 | padding-left:1px; 372 | margin:0; 373 | white-space:pre; 374 | } 375 | .caption a:link, .caption a:visited { 376 | color:#1f389c; 377 | } 378 | .caption a:hover, 379 | .caption a:active { 380 | color:#FFFFFF; 381 | } 382 | .caption span { 383 | white-space:nowrap; 384 | padding-top:5px; 385 | padding-left:12px; 386 | padding-right:12px; 387 | padding-bottom:7px; 388 | display:inline-block; 389 | float:left; 390 | background-color:#F8981D; 391 | border: none; 392 | height:16px; 393 | } 394 | div.table-tabs { 395 | padding:10px 0 0 1px; 396 | margin:0; 397 | } 398 | div.table-tabs > button { 399 | border: none; 400 | cursor: pointer; 401 | padding: 5px 12px 7px 12px; 402 | font-weight: bold; 403 | margin-right: 3px; 404 | } 405 | div.table-tabs > button.active-table-tab { 406 | background: #F8981D; 407 | color: #253441; 408 | } 409 | div.table-tabs > button.table-tab { 410 | background: #4D7A97; 411 | color: #FFFFFF; 412 | } 413 | .two-column-summary { 414 | display: grid; 415 | grid-template-columns: minmax(15%, max-content) minmax(15%, auto); 416 | } 417 | .three-column-summary { 418 | display: grid; 419 | grid-template-columns: minmax(10%, max-content) minmax(15%, max-content) minmax(15%, auto); 420 | } 421 | .four-column-summary { 422 | display: grid; 423 | grid-template-columns: minmax(10%, max-content) minmax(10%, max-content) minmax(10%, max-content) minmax(10%, auto); 424 | } 425 | @media screen and (max-width: 600px) { 426 | .two-column-summary { 427 | display: grid; 428 | grid-template-columns: 1fr; 429 | } 430 | } 431 | @media screen and (max-width: 800px) { 432 | .three-column-summary { 433 | display: grid; 434 | grid-template-columns: minmax(10%, max-content) minmax(25%, auto); 435 | } 436 | .three-column-summary .col-last { 437 | grid-column-end: span 2; 438 | } 439 | } 440 | @media screen and (max-width: 1000px) { 441 | .four-column-summary { 442 | display: grid; 443 | grid-template-columns: minmax(15%, max-content) minmax(15%, auto); 444 | } 445 | } 446 | .summary-table > div, .details-table > div { 447 | text-align:left; 448 | padding: 8px 3px 3px 7px; 449 | } 450 | .col-first, .col-second, .col-last, .col-constructor-name, .col-summary-item-name { 451 | vertical-align:top; 452 | padding-right:0; 453 | padding-top:8px; 454 | padding-bottom:3px; 455 | } 456 | .table-header { 457 | background:#dee3e9; 458 | font-weight: bold; 459 | } 460 | .col-first, .col-first { 461 | font-size:13px; 462 | } 463 | .col-second, .col-second, .col-last, .col-constructor-name, .col-summary-item-name, .col-last { 464 | font-size:13px; 465 | } 466 | .col-first, .col-second, .col-constructor-name { 467 | vertical-align:top; 468 | overflow: auto; 469 | } 470 | .col-last { 471 | white-space:normal; 472 | } 473 | .col-first a:link, .col-first a:visited, 474 | .col-second a:link, .col-second a:visited, 475 | .col-first a:link, .col-first a:visited, 476 | .col-second a:link, .col-second a:visited, 477 | .col-constructor-name a:link, .col-constructor-name a:visited, 478 | .col-summary-item-name a:link, .col-summary-item-name a:visited, 479 | .constant-values-container a:link, .constant-values-container a:visited, 480 | .all-classes-container a:link, .all-classes-container a:visited, 481 | .all-packages-container a:link, .all-packages-container a:visited { 482 | font-weight:bold; 483 | } 484 | .table-sub-heading-color { 485 | background-color:#EEEEFF; 486 | } 487 | .even-row-color, .even-row-color .table-header { 488 | background-color:#FFFFFF; 489 | } 490 | .odd-row-color, .odd-row-color .table-header { 491 | background-color:#EEEEEF; 492 | } 493 | /* 494 | * Styles for contents. 495 | */ 496 | .deprecated-content { 497 | margin:0; 498 | padding:10px 0; 499 | } 500 | div.block { 501 | font-size:14px; 502 | font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; 503 | } 504 | .col-last div { 505 | padding-top:0; 506 | } 507 | .col-last a { 508 | padding-bottom:3px; 509 | } 510 | .module-signature, 511 | .package-signature, 512 | .type-signature, 513 | .member-signature { 514 | font-family:'DejaVu Sans Mono', monospace; 515 | font-size:14px; 516 | margin:14px 0; 517 | white-space: pre-wrap; 518 | } 519 | .module-signature, 520 | .package-signature, 521 | .type-signature { 522 | margin-top: 0; 523 | } 524 | .member-signature .type-parameters-long, 525 | .member-signature .parameters, 526 | .member-signature .exceptions { 527 | display: inline-block; 528 | vertical-align: top; 529 | white-space: pre; 530 | } 531 | .member-signature .type-parameters { 532 | white-space: normal; 533 | } 534 | /* 535 | * Styles for formatting effect. 536 | */ 537 | .source-line-no { 538 | color:green; 539 | padding:0 30px 0 0; 540 | } 541 | h1.hidden { 542 | visibility:hidden; 543 | overflow:hidden; 544 | font-size:10px; 545 | } 546 | .block { 547 | display:block; 548 | margin:0 10px 5px 0; 549 | color:#474747; 550 | } 551 | .deprecated-label, .descfrm-type-label, .implementation-label, .member-name-label, .member-name-link, 552 | .module-label-in-package, .module-label-in-type, .override-specify-label, .package-label-in-type, 553 | .package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link, .preview-label { 554 | font-weight:bold; 555 | } 556 | .deprecation-comment, .help-footnote, .preview-comment { 557 | font-style:italic; 558 | } 559 | .deprecation-block { 560 | font-size:14px; 561 | font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; 562 | border-style:solid; 563 | border-width:thin; 564 | border-radius:10px; 565 | padding:10px; 566 | margin-bottom:10px; 567 | margin-right:10px; 568 | display:inline-block; 569 | } 570 | .preview-block { 571 | font-size:14px; 572 | font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; 573 | border-style:solid; 574 | border-width:thin; 575 | border-radius:10px; 576 | padding:10px; 577 | margin-bottom:10px; 578 | margin-right:10px; 579 | display:inline-block; 580 | } 581 | div.block div.deprecation-comment { 582 | font-style:normal; 583 | } 584 | /* 585 | * Styles specific to HTML5 elements. 586 | */ 587 | main, nav, header, footer, section { 588 | display:block; 589 | } 590 | /* 591 | * Styles for javadoc search. 592 | */ 593 | .ui-autocomplete-category { 594 | font-weight:bold; 595 | font-size:15px; 596 | padding:7px 0 7px 3px; 597 | background-color:#4D7A97; 598 | color:#FFFFFF; 599 | } 600 | .result-item { 601 | font-size:13px; 602 | } 603 | .ui-autocomplete { 604 | max-height:85%; 605 | max-width:65%; 606 | overflow-y:scroll; 607 | overflow-x:scroll; 608 | white-space:nowrap; 609 | box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); 610 | } 611 | ul.ui-autocomplete { 612 | position:fixed; 613 | z-index:999999; 614 | background-color: #FFFFFF; 615 | } 616 | ul.ui-autocomplete li { 617 | float:left; 618 | clear:both; 619 | width:100%; 620 | } 621 | .result-highlight { 622 | font-weight:bold; 623 | } 624 | .ui-autocomplete .result-item { 625 | font-size: inherit; 626 | } 627 | #search-input { 628 | background-image:url('resources/glass.png'); 629 | background-size:13px; 630 | background-repeat:no-repeat; 631 | background-position:2px 3px; 632 | padding-left:20px; 633 | position:relative; 634 | right:-18px; 635 | width:400px; 636 | } 637 | #reset-button { 638 | background-color: rgb(255,255,255); 639 | background-image:url('resources/x.png'); 640 | background-position:center; 641 | background-repeat:no-repeat; 642 | background-size:12px; 643 | border:0 none; 644 | width:16px; 645 | height:16px; 646 | position:relative; 647 | left:-4px; 648 | top:-4px; 649 | font-size:0px; 650 | } 651 | .watermark { 652 | color:#545454; 653 | } 654 | .search-tag-desc-result { 655 | font-style:italic; 656 | font-size:11px; 657 | } 658 | .search-tag-holder-result { 659 | font-style:italic; 660 | font-size:12px; 661 | } 662 | .search-tag-result:target { 663 | background-color:yellow; 664 | } 665 | .module-graph span { 666 | display:none; 667 | position:absolute; 668 | } 669 | .module-graph:hover span { 670 | display:block; 671 | margin: -100px 0 0 100px; 672 | z-index: 1; 673 | } 674 | .inherited-list { 675 | margin: 10px 0 10px 0; 676 | } 677 | section.class-description { 678 | line-height: 1.4; 679 | } 680 | .summary section[class$="-summary"], .details section[class$="-details"], 681 | .class-uses .detail, .serialized-class-details { 682 | padding: 0px 20px 5px 10px; 683 | border: 1px solid #ededed; 684 | background-color: #f8f8f8; 685 | } 686 | .inherited-list, section[class$="-details"] .detail { 687 | padding:0 0 5px 8px; 688 | background-color:#ffffff; 689 | border:none; 690 | } 691 | .vertical-separator { 692 | padding: 0 5px; 693 | } 694 | ul.help-section-list { 695 | margin: 0; 696 | } 697 | ul.help-subtoc > li { 698 | display: inline-block; 699 | padding-right: 5px; 700 | font-size: smaller; 701 | } 702 | ul.help-subtoc > li::before { 703 | content: "\2022" ; 704 | padding-right:2px; 705 | } 706 | span.help-note { 707 | font-style: italic; 708 | } 709 | /* 710 | * Indicator icon for external links. 711 | */ 712 | main a[href*="://"]::after { 713 | content:""; 714 | display:inline-block; 715 | background-image:url('data:image/svg+xml; utf8, \ 716 | \ 717 | \ 719 | '); 720 | background-size:100% 100%; 721 | width:7px; 722 | height:7px; 723 | margin-left:2px; 724 | margin-bottom:4px; 725 | } 726 | main a[href*="://"]:hover::after, 727 | main a[href*="://"]:focus::after { 728 | background-image:url('data:image/svg+xml; utf8, \ 729 | \ 730 | \ 732 | '); 733 | } 734 | 735 | /* 736 | * Styles for user-provided tables. 737 | * 738 | * borderless: 739 | * No borders, vertical margins, styled caption. 740 | * This style is provided for use with existing doc comments. 741 | * In general, borderless tables should not be used for layout purposes. 742 | * 743 | * plain: 744 | * Plain borders around table and cells, vertical margins, styled caption. 745 | * Best for small tables or for complex tables for tables with cells that span 746 | * rows and columns, when the "striped" style does not work well. 747 | * 748 | * striped: 749 | * Borders around the table and vertical borders between cells, striped rows, 750 | * vertical margins, styled caption. 751 | * Best for tables that have a header row, and a body containing a series of simple rows. 752 | */ 753 | 754 | table.borderless, 755 | table.plain, 756 | table.striped { 757 | margin-top: 10px; 758 | margin-bottom: 10px; 759 | } 760 | table.borderless > caption, 761 | table.plain > caption, 762 | table.striped > caption { 763 | font-weight: bold; 764 | font-size: smaller; 765 | } 766 | table.borderless th, table.borderless td, 767 | table.plain th, table.plain td, 768 | table.striped th, table.striped td { 769 | padding: 2px 5px; 770 | } 771 | table.borderless, 772 | table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, 773 | table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { 774 | border: none; 775 | } 776 | table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { 777 | background-color: transparent; 778 | } 779 | table.plain { 780 | border-collapse: collapse; 781 | border: 1px solid black; 782 | } 783 | table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { 784 | background-color: transparent; 785 | } 786 | table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, 787 | table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { 788 | border: 1px solid black; 789 | } 790 | table.striped { 791 | border-collapse: collapse; 792 | border: 1px solid black; 793 | } 794 | table.striped > thead { 795 | background-color: #E3E3E3; 796 | } 797 | table.striped > thead > tr > th, table.striped > thead > tr > td { 798 | border: 1px solid black; 799 | } 800 | table.striped > tbody > tr:nth-child(even) { 801 | background-color: #EEE 802 | } 803 | table.striped > tbody > tr:nth-child(odd) { 804 | background-color: #FFF 805 | } 806 | table.striped > tbody > tr > th, table.striped > tbody > tr > td { 807 | border-left: 1px solid black; 808 | border-right: 1px solid black; 809 | } 810 | table.striped > tbody > tr > th { 811 | font-weight: normal; 812 | } 813 | /** 814 | * Tweak font sizes and paddings for small screens. 815 | */ 816 | @media screen and (max-width: 1050px) { 817 | #search-input { 818 | width: 300px; 819 | } 820 | } 821 | @media screen and (max-width: 800px) { 822 | #search-input { 823 | width: 200px; 824 | } 825 | .top-nav, 826 | .bottom-nav { 827 | font-size: 11px; 828 | padding-top: 6px; 829 | } 830 | .sub-nav { 831 | font-size: 11px; 832 | } 833 | .about-language { 834 | padding-right: 16px; 835 | } 836 | ul.nav-list li, 837 | .sub-nav .nav-list-search { 838 | padding: 6px; 839 | } 840 | ul.sub-nav-list li { 841 | padding-top: 5px; 842 | } 843 | main { 844 | padding: 10px; 845 | } 846 | .summary section[class$="-summary"], .details section[class$="-details"], 847 | .class-uses .detail, .serialized-class-details { 848 | padding: 0 8px 5px 8px; 849 | } 850 | body { 851 | -webkit-text-size-adjust: none; 852 | } 853 | } 854 | @media screen and (max-width: 500px) { 855 | #search-input { 856 | width: 150px; 857 | } 858 | .top-nav, 859 | .bottom-nav { 860 | font-size: 10px; 861 | } 862 | .sub-nav { 863 | font-size: 10px; 864 | } 865 | .about-language { 866 | font-size: 10px; 867 | padding-right: 12px; 868 | } 869 | } 870 | -------------------------------------------------------------------------------- /docs/javadoc/tag-search-index.js: -------------------------------------------------------------------------------- 1 | tagSearchIndex = [];updateSearchResults(); -------------------------------------------------------------------------------- /docs/javadoc/type-search-index.js: -------------------------------------------------------------------------------- 1 | typeSearchIndex = [{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"com.jummania","l":"DataManager.Converter"},{"p":"com.jummania","l":"DataManager"},{"p":"com.jummania","l":"DataManagerFactory"},{"p":"com.jummania","l":"DataManager.DataObserver"},{"p":"com.jummania.converter","l":"GsonConverter"},{"p":"com.jummania.model","l":"MetaData"},{"p":"com.jummania.model","l":"PaginatedData"},{"p":"com.jummania.model","l":"Pagination"}];updateSearchResults(); -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app's APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Enables namespacing of each library's R class so that its R class includes only the 19 | # resources declared in the library itself and none from the library's dependencies, 20 | # thereby reducing the size of the R class for that library 21 | android.nonTransitiveRClass=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jumman04/DataManager/a43d31f313e390faa63c9c57efd92b9a470819d1/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sun Jan 07 15:38:43 BDT 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /jitpack.yml: -------------------------------------------------------------------------------- 1 | jdk: 2 | - openjdk17 -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | gradlePluginPortal() 6 | } 7 | } 8 | plugins { 9 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" 10 | } 11 | dependencyResolutionManagement { 12 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 13 | repositories { 14 | google() 15 | mavenCentral() 16 | } 17 | } 18 | 19 | include(":Library") 20 | --------------------------------------------------------------------------------