{"id":36420203,"url":"https://github.com/atolomei/odilon-client","last_synced_at":"2026-01-11T17:05:54.778Z","repository":{"id":219639553,"uuid":"749526287","full_name":"atolomei/odilon-client","owner":"atolomei","description":"Odilon Object Storage - Java SDK ","archived":false,"fork":false,"pushed_at":"2026-01-03T12:26:25.000Z","size":634,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-05T06:02:21.822Z","etag":null,"topics":["client-sdk","data-repl","erasure-codes","file-storage","java","object-storage","software-raid"],"latest_commit_sha":null,"homepage":"https://odilon.io","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/atolomei.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-01-28T20:31:42.000Z","updated_at":"2026-01-03T12:26:29.000Z","dependencies_parsed_at":"2024-03-15T22:24:49.655Z","dependency_job_id":"cebbe46e-7754-482c-b944-5798b361e486","html_url":"https://github.com/atolomei/odilon-client","commit_stats":null,"previous_names":["atolomei/odilon-client"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/atolomei/odilon-client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atolomei%2Fodilon-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atolomei%2Fodilon-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atolomei%2Fodilon-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atolomei%2Fodilon-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/atolomei","download_url":"https://codeload.github.com/atolomei/odilon-client/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atolomei%2Fodilon-client/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28314264,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-11T14:58:17.114Z","status":"ssl_error","status_checked_at":"2026-01-11T14:55:53.580Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["client-sdk","data-repl","erasure-codes","file-storage","java","object-storage","software-raid"],"created_at":"2026-01-11T17:05:54.707Z","updated_at":"2026-01-11T17:05:54.763Z","avatar_url":"https://github.com/atolomei.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n![sunflower-g72ba79a53_1280](https://github.com/atolomei/odilon-client/assets/29349757/13cf02bd-68df-41f4-ba09-c26519c287c1)\n\n\u003ch1\u003eOdilon Java SDK \u003c/h1\u003e\n\n\u003ch2\u003eAbout Odilon\u003c/h2\u003e\n\u003cp\u003e \u003ca href=\"https://odilon.io\"\u003eOdilon\u003c/a\u003e is a scalable and lightweight Open Source Object Storage that runs on standard hardware.\u003c/p\u003e\n\u003cp\u003eIt is an infrastructure software designed to be used by applications that need to store to store terabytes of medium to large size objects (like photos, pdfs, audio, video) securely and safely through encryption, replication and redundancy. \u003c/p\u003e \n\u003cp\u003eIt has a simple single-level folder structure similar to the Bucket / Object model of Amazon S3. It is small and easy to integrate, offers encryption, data protection and fault tolerance (software RAID and Erasure Codes) and detection of silent data degradation. Odilon also supports version control and master - standby replication over the Internet for disaster recovery and ransomware recovery.\u003c/p\u003e\n\u003cp\u003e\nFor more info visit Odilon's website \u003ca href=\"https://odilon.io/development.html\"\u003eJava Development with Odilon SDK\u003c/a\u003e and also \u003ca href=\"https://githug.com/odilon-server.html\"\u003e GitHub page\u003c/a\u003e \t\n\u003c/p\u003e\n\n\u003ch2\u003eOdilon Java SDK Concepts\u003c/h2\u003e\n\n\u003cp\u003eA Java client program that interacts with the Odilon server must include the Odilon SDK jar in the classpath.\nA typical architecture for a Web Application is\u003c/p\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n![web-app-odilon-en](https://github.com/atolomei/odilon-client/assets/29349757/aa736909-f247-4a18-99b9-166adacf0929)\n\n\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cp\u003eIn order to access the Odilon server from a Java Application you have to include Odilon client JAR in the classpath. The interaction is managed by an instance of \u003cb\u003eOdilonClient\u003c/b\u003e that connects to the server using the credentials: \u003cb\u003eAccessKey\u003c/b\u003e (ie. username) and \u003cb\u003eSecretKey\u003c/b\u003e (ie. password)\u003c/p\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n\n```java\n/* these are the default values for the Server */\nString endpoint = \"http://localhost\";\nint port = 9234;\nString accessKey = \"odilon\";\nString secretKey = \"odilon\";\n\t\t\t\t\t\t\n/** OdilonClient is the interface, ODClient is the implementation */\nOdilonClient client = new ODClient(endpoint, port, accessKey, secretKey);\n\n/** ping checks the status of server, it returns the String \"ok\" when the server is normal */\nString ping = client.ping();\nif (!ping.equals(\"ok\")) {\n\tSystem.out.println(\"ping error -\u003e \" + ping);\n\tSystem.exit(1);\n}\n```\n\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cp\u003eOdilon stores objects using a flat structure of containers called Buckets. A bucket is like a folder, it just contains binary objects, potentially a very large number. Every object contained by a bucket has a unique ObjectName in that bucket; therefore, the pair BucketName + ObjectName is a Unique ID for each object in Odilon.\u003c/p\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n```java\ntry {\n    String bucketName = \"bucket-demo\";\n    /** check if the bucket exists, if not create it */\n    if (client.existsBucket(bucketName))\n        System.out.println(\"bucket already exists -\u003e\" + bucketName );\n    else \n        client.createBucket(bucketName);\n} catch (ODClientException e) {\n        System.out.println(String.valueOf(e.getHttpStatus())+ \" \" + e.getMessage()+\" \" + String.valueOf(e.getErrorCode()));\n}\n```\n\n\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cp\u003eUploading a File requires the Bucket to exist and the ObjectName to be unique for that bucket.\u003c/p\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n```java\nFile file = new File(\"test.pdf\");\nString bucketName = \"bucket-demo\";\nString objectName = file.getName();\n\ntry (InputStream inputStream = new BufferedInputStream(new FileInputStream(file))) {\t\n\tclient.putObjectStream(bucketName, objectName, inputStream, Optional.of(file.getName()), Optional.empty());\n} catch (ODClientException e) {\n\tSystem.out.println(String.valueOf(e.getHttpStatus())+\" \" + e.getMessage()+\" \" + String.valueOf(e.getErrorCode()));\n} catch (FileNotFoundException | IOException e1) {\n\tSystem.out.println(e1.getClass().getName() + \" \" + e1.getMessage());\n}\n```\n\n\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cp\u003eIn addition to the binary file, an Object has Metadata (called ObjectMetadata) that is returned by some of the API calls. Odilon allows to retrieve Objects individually by BucketName + ObjectName and also supports to list the contents of a bucket and other simple queries.\u003c/p\u003e\n\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n```java\ntry {\n\t/** list all bucket's objects */\n\tResultSet\u003cItem \u003cObjectMetadata\u003e\u003e resultSet = client.listObjects(bucket.getName());\n\twhile (resultSet.hasNext()) {\n\t\tItem item = resultSet.next();\n\t\tif (item.isOk())\n\t\t\tSystem.out.println(\"ObjectName:\"+item.getObject().objectName+\" | file: \" + item.getObject().fileName);\n\t\telse\n\t\t\tSystem.out.println(item.getErrorString());\n\t}\n} catch (ODClientException e) {\n   \tSystem.out.println(String.valueOf( e.getHttpStatus())+ \" \"+e.getMessage() + \" \"+String.valueOf(e.getErrorCode()));\n}\n```\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n\u003ch2\u003eSample Programs\u003c/h2\u003e\n\n\n\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/atolomei/odilon-client/blob/main/src/test/io/odilon/demo/SampleBucketCreation.java\"\u003eCreate Bucket\u003c/a\u003e\u003c/li\u003e\t\n\u003cli\u003e\u003ca href=\"https://github.com/atolomei/odilon-client/blob/main/src/test/io/odilon/demo/SampleListBuckets.java\"\u003eList Buckets\u003c/a\u003e\u003c/li\u003e\t\n\u003cli\u003e\u003ca href=\"https://github.com/atolomei/odilon-client/blob/main/src/test/io/odilon/demo/SamplePutObject.java\"\u003eUpload file\u003c/a\u003e\u003c/li\u003e\t\t\n\u003cli\u003e\u003ca href=\"https://github.com/atolomei/odilon-client/blob/main/src/test/io/odilon/demo/SampleListObjects.java\"\u003eList all objects in a Bucket\u003c/a\u003e\u003c/li\u003e\t\n\u003cli\u003e\u003ca href=\"https://odilon.io/examples/SamplePresignedUrl.java\"\u003eGet presigned urls of Objects\u003c/a\u003e\u003c/li\u003e\t\n\u003cli\u003e\u003ca href=\"https://github.com/atolomei/miniomigration\"\u003eMinio to Odilon migration\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003eResources\u003c/h2\u003e\n\u003cp\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://odilon.io\" target=\"_blank\"\u003eOdilon website\u003c/a\u003e\u003c/li\u003e\t\n\u003cli\u003e\u003ca href=\"https://odilon.io/configuration-linux.html\" target=\"_blank\"\u003eInstallation, Configuration and Operation on Linux\u003c/a\u003e\u003c/li\u003e\t\n\u003cli\u003e\u003ca href=\"https://odilon.io/configuration-windows.html\" target=\"_blank\"\u003eInstallation, Configuration and Operation on Windows\u003c/a\u003e\u003c/li\u003e\t\t\n\u003cli\u003e\u003ca href=\"https://odilon.io/development.html\" target=\"_blank\"\u003eJava Application Development with Odilon\u003c/a\u003e\u003c/li\u003e\t\n\u003cli\u003e\u003ca href=\"https://odilon.io/javadoc/index.html\" target=\"_blank\"\u003eOdilon SDK Javadoc\u003c/a\u003e\u003c/li\u003e\t\n\u003cli\u003e\u003ca href=\"https://twitter.com/odilonSoftware\" target=\"_blank\"\u003eTwitter\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/p\u003e\n\n\n\u003ch2\u003eOdilon Server\u003c/h2\u003e\n\u003cp\u003eSee \u003ca href=\"https://github.com/atolomei/odilon-server\" target=\"_blank\"\u003eodilon Server\u003c/a\u003e\n\u003c/p\u003e\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatolomei%2Fodilon-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fatolomei%2Fodilon-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatolomei%2Fodilon-client/lists"}