Apache Commons CLI লাইব্রেরি Java অ্যাপ্লিকেশনে কমান্ড লাইন আর্গুমেন্ট ম্যানেজমেন্টের জন্য একটি শক্তিশালী টুল, যা আপনাকে সোজা, কার্যকরী এবং ফ্লেক্সিবল উপায়ে কমান্ড লাইন আর্গুমেন্টগুলো পার্স করতে সাহায্য করে। তবে, কখনো কখনো আপনাকে আপনার অ্যাপ্লিকেশনটির জন্য Sub-commands বা উপ-কমান্ড ব্যবস্থাপনা করতে হতে পারে, যেমন git কমান্ডের মধ্যে clone, push, pull ইত্যাদি।
Sub-commands ব্যবস্থাপনা আপনাকে অ্যাপ্লিকেশনটির বিভিন্ন কার্যক্রম ভাগ করার সুযোগ দেয় এবং প্রতিটি কার্যক্রমের জন্য নির্দিষ্ট অপশন এবং আর্গুমেন্ট ব্যবহার করতে দেয়।
এই গাইডে, আমরা দেখবো কিভাবে Apache Commons CLI ব্যবহার করে Sub-commands তৈরি এবং ম্যানেজ করা যায়।
Sub-commands কী?
Sub-commands হল প্রধান কমান্ডের অধীনে ছোট কমান্ড যা নির্দিষ্ট কার্যক্রম সম্পাদন করতে ব্যবহৃত হয়। উদাহরণস্বরূপ:
git clonegit pushdocker runaws s3 cp
প্রতিটি Sub-command একটি নির্দিষ্ট কার্যক্রম সম্পাদন করে এবং এর সাথে সংশ্লিষ্ট অপশন ও আর্গুমেন্ট থাকতে পারে।
Apache Commons CLI দিয়ে Sub-commands ব্যবস্থাপনা
Apache Commons CLI লাইব্রেরির মাধ্যমে আপনি সহজেই Sub-commands তৈরি এবং তাদের জন্য পৃথক অপশন ও আর্গুমেন্ট সেট করতে পারেন। নিচে একটি উদাহরণ দেওয়া হলো যেখানে আমরা দুটি Sub-command তৈরি করবো: install এবং uninstall।
Step 1: Sub-commands Setup
প্রথমে, আমরা দুটি Sub-command তৈরি করবো: install এবং uninstall, এবং তাদের জন্য নির্দিষ্ট অপশন দেব।
import org.apache.commons.cli.*;
public class SubCommandExample {
public static void main(String[] args) {
// অপশন তৈরি করা
Options options = new Options();
// Sub-command: install
Option installOption = new Option("i", "install", false, "Install the package");
options.addOption(installOption);
// Sub-command: uninstall
Option uninstallOption = new Option("u", "uninstall", false, "Uninstall the package");
options.addOption(uninstallOption);
// কমান্ড লাইন আর্গুমেন্ট পার্সিং
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
cmd = parser.parse(options, args);
// Sub-command গুলি যাচাই করা
if (cmd.hasOption("i")) {
System.out.println("Running install command...");
// এখানে install কোড চালানো হবে
} else if (cmd.hasOption("u")) {
System.out.println("Running uninstall command...");
// এখানে uninstall কোড চালানো হবে
} else {
System.out.println("Usage: java SubCommandExample -i (install) or -u (uninstall)");
}
} catch (ParseException e) {
System.err.println("Error: " + e.getMessage());
printHelp(options);
}
}
// সাহায্য বার্তা প্রদর্শন
private static void printHelp(Options options) {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("SubCommandExample", options);
}
}
কোডের ব্যাখ্যা:
- Sub-commands Creation:
installএবংuninstallদুটি Sub-command তৈরি করা হয়েছে।-iএবং--installঅপশন ব্যবহার করে আপনিinstallকমান্ড চালাতে পারবেন।-uএবং--uninstallঅপশন ব্যবহার করে আপনিuninstallকমান্ড চালাতে পারবেন।
- Sub-command Validation:
cmd.hasOption("i")এবংcmd.hasOption("u")দিয়ে যাচাই করা হচ্ছে যে ব্যবহারকারী কোন Sub-command ব্যবহার করছেন। যদি কোনো Sub-command না ব্যবহার করা হয়, তবে একটি ব্যবহারযোগ্য মেসেজ দেখানো হবে। - Help Option:
HelpFormatterব্যবহার করে কমান্ডের সাহায্য বার্তা প্রদর্শন করা হয়েছে, যাতে ব্যবহারকারী অপশন এবং তাদের কার্যকারিতা সহজে বুঝতে পারেন।
Step 2: কমান্ড লাইন আর্গুমেন্ট পাস করা
এখন এই প্রোগ্রামটি চালানোর সময়, আপনি -i বা -u Sub-command নির্বাচন করতে পারেন:
java SubCommandExample -i
আউটপুট:
Running install command...
অথবা:
java SubCommandExample -u
আউটপুট:
Running uninstall command...
যদি না দেওয়া হয় কোনো Sub-command:
java SubCommandExample
আউটপুট:
Usage: java SubCommandExample -i (install) or -u (uninstall)
Step 3: Sub-command এর জন্য আলাদা অপশন
ধরা যাক, install কমান্ডের জন্য একটি প্যাকেজ নাম (যেমন -p অথবা --package) পাস করতে হবে, এবং uninstall কমান্ডের জন্য একটি প্যাকেজ আইডি (যেমন -id) পাস করতে হবে।
public class SubCommandWithOptionsExample {
public static void main(String[] args) {
// অপশন তৈরি করা
Options options = new Options();
// install Sub-command এর জন্য প্যাকেজ অপশন
Option installOption = new Option("i", "install", false, "Install the package");
Option packageOption = new Option("p", "package", true, "Package name for installation");
options.addOption(installOption);
options.addOption(packageOption);
// uninstall Sub-command এর জন্য প্যাকেজ আইডি অপশন
Option uninstallOption = new Option("u", "uninstall", false, "Uninstall the package");
Option idOption = new Option("id", "package-id", true, "Package ID for uninstallation");
options.addOption(uninstallOption);
options.addOption(idOption);
// কমান্ড লাইন আর্গুমেন্ট পার্সিং
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
cmd = parser.parse(options, args);
// install Sub-command প্রক্রিয়া
if (cmd.hasOption("i")) {
String packageName = cmd.getOptionValue("p");
System.out.println("Installing package: " + packageName);
// Install logic here
}
// uninstall Sub-command প্রক্রিয়া
else if (cmd.hasOption("u")) {
String packageId = cmd.getOptionValue("id");
System.out.println("Uninstalling package with ID: " + packageId);
// Uninstall logic here
} else {
System.out.println("Usage: java SubCommandWithOptionsExample -i -p <package-name> or -u -id <package-id>");
}
} catch (ParseException e) {
System.err.println("Error: " + e.getMessage());
printHelp(options);
}
}
// সাহায্য বার্তা প্রদর্শন
private static void printHelp(Options options) {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("SubCommandWithOptionsExample", options);
}
}
উদাহরণ:
java SubCommandWithOptionsExample -i -p package1
আউটপুট:
Installing package: package1
java SubCommandWithOptionsExample -u -id 12345
আউটপুট:
Uninstalling package with ID: 12345
সারাংশ
Apache Commons CLI দিয়ে আপনি সহজেই Sub-commands পরিচালনা করতে পারেন, যা একটি অ্যাপ্লিকেশনকে একাধিক কার্যক্রমে বিভক্ত করার সুযোগ দেয়। এটি আপনাকে ব্যবহারকারীদের জন্য একটি নমনীয় কমান্ড লাইন ইন্টারফেস তৈরি করতে সহায়তা করে, যেখানে বিভিন্ন সাব-কমান্ডের জন্য আলাদা আলাদা অপশন এবং প্যারামিটার থাকতে পারে। এই ব্যবস্থাপনার মাধ্যমে অ্যাপ্লিকেশনটির কার্যকারিতা আরও সমৃদ্ধ এবং সুনির্দিষ্ট হয়ে ওঠে।
অ্যাপাচি কমন্স সিআলআই (Apache Commons CLI) লাইব্রেরি কমান্ড লাইন আর্গুমেন্টস (Command Line Arguments) পার্স করার জন্য একটি শক্তিশালী টুল সরবরাহ করে। এক্ষেত্রে, Sub-command এমন একটি কৌশল যা আপনাকে একটি মূল কমান্ডের অধীনে বিভিন্ন বিকল্প কমান্ড বা সাব-কমান্ড তৈরি করতে সক্ষম করে। এটি বিশেষভাবে বড় বা জটিল অ্যাপ্লিকেশনগুলির জন্য ব্যবহৃত হয়, যেখানে একাধিক ফাংশনালিটি বা সাব-অপারেশন থাকে, এবং আপনি এইসব অপারেশনকে আলাদা আলাদা সাব-কমান্ড হিসেবে সংজ্ঞায়িত করতে পারেন।
যেমন, git কমান্ডে বিভিন্ন সাব-কমান্ড থাকে, যেমন git commit, git push, git pull ইত্যাদি, প্রতিটি সাব-কমান্ড আলাদা আলাদা কার্যক্রম সম্পাদন করে। অ্যাপাচি কমন্স সিআলআই-এও আপনি সাব-কমান্ড ব্যবহার করে বিভিন্ন কার্যক্রম সহজে সংগঠিত করতে পারেন।
Sub-command কি?
Sub-command হল একটি কমান্ডের অধীনে আরেকটি কমান্ড যা নির্দিষ্ট একটি কার্যক্রম সম্পাদন করে। সাব-কমান্ডগুলো মূল কমান্ডের অংশ হিসেবে কাজ করে এবং তারা একটি নির্দিষ্ট উদ্দেশ্য বা কাজ সম্পাদন করতে ব্যবহৃত হয়। সাব-কমান্ডের সাথে আরও নির্দিষ্ট আর্গুমেন্টস বা অপশন যুক্ত করা হতে পারে।
একটি সাধারণ উদাহরণ হতে পারে:
myapp start
এখানে, myapp হল মূল কমান্ড এবং start একটি সাব-কমান্ড। start সাব-কমান্ডটি মূল কমান্ডের অধীনে নির্দিষ্ট একটি কাজ (যেমন সার্ভার শুরু করা) সম্পাদন করবে।
অ্যাপাচি কমন্স সিআলআই (Apache Commons CLI) এ Sub-command কিভাবে কাজ করে?
অ্যাপাচি কমন্স সিআলআই লাইব্রেরি সাব-কমান্ড সমর্থন করে যা আপনাকে মূল কমান্ডের অধীনে একাধিক সাব-কমান্ড তৈরি করতে সহায়তা করে। প্রতিটি সাব-কমান্ডের জন্য আলাদা অপশন এবং আর্গুমেন্ট থাকতে পারে, এবং এগুলোকে মূল কমান্ডের সঙ্গে সম্পর্কিতভাবে সাজানো হয়।
১. সাব-কমান্ডের জন্য অপশন তৈরি করা
অ্যাপাচি কমন্স সিআলআই-এ সাব-কমান্ড তৈরির জন্য মূল কমান্ডের জন্য অপশন তৈরি করতে হবে এবং তারপর সেই অপশনগুলোর মধ্যে সাব-কমান্ড যুক্ত করতে হবে।
উদাহরণ: Sub-command তৈরি করা
import org.apache.commons.cli.*;
public class SubCommandExample {
public static void main(String[] args) {
// অপশন তৈরি করা
Options options = new Options();
// 'start' সাব-কমান্ড
Option start = new Option("start", "start the application");
options.addOption(start);
// 'stop' সাব-কমান্ড
Option stop = new Option("stop", "stop the application");
options.addOption(stop);
// কমান্ড লাইন পার্সার তৈরি করা
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
// কমান্ড লাইন আর্গুমেন্টস পার্স করা
cmd = parser.parse(options, args);
// সাব-কমান্ড অনুযায়ী কাজ করা
if (cmd.hasOption("start")) {
System.out.println("Application started.");
} else if (cmd.hasOption("stop")) {
System.out.println("Application stopped.");
} else {
System.out.println("Please specify a sub-command (start/stop).");
}
} catch (ParseException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
এখানে, দুটি সাব-কমান্ড তৈরি করা হয়েছে: start এবং stop। প্রতিটি সাব-কমান্ডের জন্য আলাদা অপশন নির্ধারণ করা হয়েছে এবং সেগুলি পার্স করা হচ্ছে।
২. সাব-কমান্ড ব্যবহার
কমান্ড লাইন থেকে সাব-কমান্ড ব্যবহার করতে, আপনি মূল কমান্ডের সাথে start বা stop সাব-কমান্ড পাস করতে পারেন:
java SubCommandExample start
এখন, এটি start সাব-কমান্ড কার্যকর করবে এবং আউটপুট হবে:
Application started.
অথবা, যদি আপনি stop সাব-কমান্ড পাস করেন:
java SubCommandExample stop
তাহলে আউটপুট হবে:
Application stopped.
এছাড়া, যদি আপনি কোনো সাব-কমান্ড না পাস করেন, তবে একটি ডিফল্ট বার্তা প্রদর্শিত হবে:
Please specify a sub-command (start/stop).
Sub-command এর সুবিধা
১. বড় অ্যাপ্লিকেশনগুলির জন্য সংগঠন
যখন আপনার অ্যাপ্লিকেশনে একাধিক কার্যক্রম বা ফিচার থাকে, তখন সাব-কমান্ড ব্যবহার করলে তা পরিষ্কার এবং সুসংগঠিত হয়। প্রতিটি সাব-কমান্ড আলাদা কার্যক্রম সম্পাদন করবে এবং ব্যবহারকারী সহজেই বুঝতে পারবে কোন কমান্ডটি কখন এবং কীভাবে ব্যবহার করতে হবে।
২. সহজ ও পরিষ্কার ইউজার ইন্টারফেস
সাব-কমান্ডের মাধ্যমে আপনি একটি সহজ এবং পরিষ্কার ইউজার ইন্টারফেস তৈরি করতে পারেন, যেখানে একাধিক কার্যক্রম একটি মূল কমান্ডের অধীনে থাকে, এবং ব্যবহারকারী সহজেই তাদের প্রয়োজনীয় কাজটি নির্বাচন করতে পারে।
৩. স্কেলেবিলিটি
যেহেতু প্রতিটি সাব-কমান্ডের জন্য আলাদা অপশন এবং আর্গুমেন্ট নির্ধারণ করা যায়, এটি অ্যাপ্লিকেশনটির স্কেলেবিলিটি বাড়াতে সাহায্য করে। নতুন ফিচার যোগ করার সময় নতুন সাব-কমান্ড তৈরি করা যেতে পারে, যা মূল কমান্ডের সংগঠন এবং কাজের প্রক্রিয়া বজায় রাখে।
সারাংশ
অ্যাপাচি কমন্স সিআলআই (Apache Commons CLI) লাইব্রেরি সাব-কমান্ড ব্যবহার করার জন্য একটি কার্যকরী উপায় সরবরাহ করে, যা আপনাকে একাধিক কার্যক্রম বা অপারেশন একটি মূল কমান্ডের অধীনে সংগঠিত করতে সহায়তা করে। সাব-কমান্ড ব্যবহার করে আপনি অ্যাপ্লিকেশনের বিভিন্ন অংশের মধ্যে পরিষ্কার পার্থক্য তৈরি করতে পারেন, যা ব্যবহারকারীকে একটি সুষম এবং সুবিধাজনক ইউজার ইন্টারফেস প্রদান করে।
Apache Commons CLI লাইব্রেরি ব্যবহার করে আপনি Multiple Sub-commands হ্যান্ডল করতে পারেন, যার মাধ্যমে একটি কমান্ড-লাইন অ্যাপ্লিকেশন একাধিক সাব-কমান্ড গ্রহণ করতে সক্ষম হয়। প্রতিটি সাব-কমান্ড আলাদা ফাংশনালিটি বা অপশন কনফিগারেশন সরবরাহ করতে পারে। যেমন একটি অ্যাপ্লিকেশন start, stop, বা status নামক সাব-কমান্ডের মাধ্যমে বিভিন্ন কাজ করতে পারে।
এখানে, আমরা দেখব কিভাবে Multiple Sub-commands হ্যান্ডল করা যায় Apache Commons CLI এর মাধ্যমে।
১. Maven Dependency:
প্রথমে, pom.xml ফাইলে Apache Commons CLI ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-cli</artifactId>
<version>1.4</version>
</dependency>
২. Multiple Sub-commands উদাহরণ:
ধরা যাক, আমরা একটি কমান্ড-লাইন অ্যাপ্লিকেশন তৈরি করছি যেখানে start, stop, এবং status নামক তিনটি সাব-কমান্ড রয়েছে। প্রতিটি সাব-কমান্ডের জন্য আলাদা অপশন এবং কাজ নির্ধারণ করা হবে।
উদাহরণ:
import org.apache.commons.cli.*;
public class MultipleSubCommandsExample {
public static void main(String[] args) {
// অপশন কনফিগারেশন
Options globalOptions = new Options();
// Sub-commands তৈরি করা
Options startOptions = new Options();
startOptions.addOption("h", "help", false, "Show help for start");
Options stopOptions = new Options();
stopOptions.addOption("f", "force", false, "Force stop");
Options statusOptions = new Options();
statusOptions.addOption("v", "verbose", false, "Show detailed status");
// Sub-command parser
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
if (args.length == 0) {
throw new ParseException("No sub-command provided");
}
// প্রথম আর্গুমেন্ট হিসাবে সাব-কমান্ড চেক করা
String subCommand = args[0];
switch (subCommand) {
case "start":
// "start" সাব-কমান্ডের জন্য অপশন পার্সিং
cmd = parser.parse(startOptions, args);
if (cmd.hasOption("h")) {
System.out.println("Help for start command");
} else {
System.out.println("Starting the service...");
}
break;
case "stop":
// "stop" সাব-কমান্ডের জন্য অপশন পার্সিং
cmd = parser.parse(stopOptions, args);
if (cmd.hasOption("f")) {
System.out.println("Forcing stop...");
} else {
System.out.println("Stopping the service...");
}
break;
case "status":
// "status" সাব-কমান্ডের জন্য অপশন পার্সিং
cmd = parser.parse(statusOptions, args);
if (cmd.hasOption("v")) {
System.out.println("Showing verbose status...");
} else {
System.out.println("Showing basic status...");
}
break;
default:
System.out.println("Invalid sub-command: " + subCommand);
break;
}
} catch (ParseException e) {
// ত্রুটি হলে সাহায্য মেসেজ প্রদর্শন
System.err.println("Error: " + e.getMessage());
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("MultipleSubCommandsExample", globalOptions);
}
}
}
ব্যাখ্যা:
- Multiple Sub-commands: এখানে
start,stop, এবংstatusসাব-কমান্ডের জন্য আলাদা আলাদা Options তৈরি করা হয়েছে। প্রতিটি সাব-কমান্ডের জন্য নির্দিষ্ট অপশন (যেমনhelp,force,verbose) নির্ধারণ করা হয়েছে। - Sub-command Parsing: প্রথমে কমান্ডের প্রথম আর্গুমেন্ট হিসেবে একটি সাব-কমান্ড চেক করা হয় (যেমন
start,stop,status) এবং তারপরে সংশ্লিষ্ট অপশনগুলোর পার্সিং করা হয়। HelpFormatter: যদি কোন ত্রুটি ঘটে বা ইউজার যদি কোনো ভুল সাব-কমান্ড দেয়, তবেHelpFormatterএর মাধ্যমে সাহায্য মেসেজ প্রদর্শিত হয়।- Switch Statement:
switchস্টেটমেন্ট ব্যবহার করে বিভিন্ন সাব-কমান্ডের জন্য আলাদা আলাদা কোড চালানো হয়।
আউটপুট:
- যদি আপনি
startসাব-কমান্ড ব্যবহার করেন:
java MultipleSubCommandsExample start
আউটপুট:
Starting the service...
- যদি আপনি
stopসাব-কমান্ড ব্যবহার করেন এবং-fঅপশন প্রদান করেন:
java MultipleSubCommandsExample stop -f
আউটপুট:
Forcing stop...
- যদি আপনি
statusসাব-কমান্ড ব্যবহার করেন এবং-vঅপশন প্রদান করেন:
java MultipleSubCommandsExample status -v
আউটপুট:
Showing verbose status...
- যদি আপনি ভুল সাব-কমান্ড প্রদান করেন:
java MultipleSubCommandsExample wrongCommand
আউটপুট:
Invalid sub-command: wrongCommand
৩. Sub-command এর জন্য Help এবং Validation
আপনি চাইলে Help এবং Validation এর জন্য অতিরিক্ত কাস্টমাইজেশনও করতে পারেন। উদাহরণস্বরূপ, যদি ইউজার start সাব-কমান্ডের জন্য সাহায্য চায়, তাহলে আপনাকে HelpFormatter ব্যবহার করতে হবে। পাশাপাশি, আপনি সাব-কমান্ডগুলির জন্য প্রয়োজনীয় validation প্রয়োগ করতে পারেন যাতে ইউজার ভুল আর্গুমেন্ট প্রদান না করে।
উদাহরণ:
Option helpOption = new Option("h", "help", false, "Show help for start");
startOptions.addOption(helpOption);
if (cmd.hasOption("h")) {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("start", startOptions);
return;
}
Apache Commons CLI এর মাধ্যমে Multiple Sub-commands হ্যান্ডল করা অত্যন্ত সহজ। আপনি আলাদা আলাদা সাব-কমান্ড এবং সেগুলির জন্য নির্দিষ্ট অপশন গঠন করতে পারেন এবং ইউজারের ইনপুট অনুযায়ী সেগুলিকে প্রোসেস করতে পারেন। এর মাধ্যমে আপনি শক্তিশালী এবং নমনীয় কমান্ড-লাইন অ্যাপ্লিকেশন তৈরি করতে পারবেন যেখানে বিভিন্ন কার্যক্রমের জন্য আলাদা সাব-কমান্ড ব্যবহৃত হবে।
- OptionGroup ব্যবহার করে আপনি সাব-কমান্ডের মধ্যে অপশন গ্রুপ করতে পারেন।
- HelpFormatter ব্যবহার করে ব্যবহারকারীদের সাহায্য মেসেজ প্রদান করতে পারেন।
- CommandLineParser এবং Options ব্যবহার করে বিভিন্ন সাব-কমান্ডের জন্য আর্গুমেন্ট এবং অপশন পার্সিং করতে পারেন।
Apache Commons CLI লাইব্রেরি কমান্ড লাইন আর্গুমেন্ট পার্সিংয়ের জন্য একটি শক্তিশালী টুল। এর মাধ্যমে আপনি সহজভাবে কমান্ড লাইন আর্গুমেন্ট তৈরি, প্রক্রিয়া, এবং যাচাই করতে পারেন। কখনও কখনও, আপনার অ্যাপ্লিকেশনটির মধ্যে nested (সাব-কমান্ড) এবং complex sub-command structure থাকতে পারে, যেখানে বিভিন্ন কমান্ড একে অপরের মধ্যে অর্ন্তভুক্ত থাকে এবং প্রতিটি সাব-কমান্ডের জন্য আলাদা আলাদা অপশন থাকতে পারে।
এই টিউটোরিয়ালে, আমরা দেখব কিভাবে Apache Commons CLI ব্যবহার করে nested এবং complex sub-command structure তৈরি করা যায়।
Nested এবং Complex Sub-command Structure এর ধারণা
- Nested Commands:
- Nested Commands হল যখন এক কমান্ডের ভিতরে আরেকটি কমান্ড থাকে। উদাহরণস্বরূপ, আপনার অ্যাপ্লিকেশনটি যদি ডাটাবেস অ্যাপ্লিকেশন হয়, তবে আপনার কমান্ড হতে পারে
database backupবাdatabase restore, যেখানেdatabaseহল মূল কমান্ড এবংbackup,restoreহল সাব-কমান্ড।
- Nested Commands হল যখন এক কমান্ডের ভিতরে আরেকটি কমান্ড থাকে। উদাহরণস্বরূপ, আপনার অ্যাপ্লিকেশনটি যদি ডাটাবেস অ্যাপ্লিকেশন হয়, তবে আপনার কমান্ড হতে পারে
- Complex Sub-command Structure:
- Complex sub-command structure হল এমন একটি কমান্ড যেখানে একাধিক স্তরের কমান্ড এবং তাদের নিজস্ব অপশন থাকে। উদাহরণস্বরূপ,
user addবাuser removeএর মধ্যে আরো সাব-অপশন থাকতে পারে (যেমনuser add --role admin), যেখানেuserহল মূল কমান্ড এবংadd,removeহল সাব-কমান্ড।
- Complex sub-command structure হল এমন একটি কমান্ড যেখানে একাধিক স্তরের কমান্ড এবং তাদের নিজস্ব অপশন থাকে। উদাহরণস্বরূপ,
Apache Commons CLI তে Nested এবং Complex Sub-command Structure তৈরি
Apache Commons CLI লাইব্রেরি আপনাকে sub-command তৈরি করতে সহায়তা করে, যেখানে প্রতিটি সাব-কমান্ডের জন্য আলাদা আলাদা অপশন নির্ধারণ করা যায়। এটি কমান্ড লাইন আর্গুমেন্টের উপর ভিত্তি করে বিভিন্ন লজিক্যাল ইউনিট (sub-commands) তৈরিতে কার্যকরী।
উদাহরণ: Nested এবং Complex Sub-command Structure
ধরি, আমাদের একটি অ্যাপ্লিকেশন আছে যেখানে user এবং database নামক দুটি প্রধান কমান্ড আছে। এবং প্রতিটি কমান্ডের সাথে কিছু সাব-কমান্ড (যেমন add, remove, backup, restore) এবং কিছু অপশন (যেমন --role, --file) থাকবে।
কোড উদাহরণ:
import org.apache.commons.cli.*;
public class ComplexSubCommandExample {
public static void main(String[] args) {
// অপশন তৈরি
Options globalOptions = new Options();
// 'user' সাব-কমান্ড অপশন
Options userOptions = new Options();
userOptions.addOption("add", false, "Add a new user");
userOptions.addOption("remove", false, "Remove an existing user");
userOptions.addOption("role", true, "Set user role");
// 'database' সাব-কমান্ড অপশন
Options dbOptions = new Options();
dbOptions.addOption("backup", false, "Backup database");
dbOptions.addOption("restore", false, "Restore database");
// পার্সার তৈরি
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
try {
// প্রথমে কমান্ড লাইন আর্গুমেন্ট পার্স করা
CommandLine line = parser.parse(globalOptions, args);
// 'user' কমান্ড চেক করা
if (args.length > 0 && args[0].equals("user")) {
CommandLine userLine = parser.parse(userOptions, args, true);
if (userLine.hasOption("add")) {
System.out.println("Adding a new user...");
if (userLine.hasOption("role")) {
System.out.println("Role: " + userLine.getOptionValue("role"));
}
} else if (userLine.hasOption("remove")) {
System.out.println("Removing user...");
}
}
// 'database' কমান্ড চেক করা
else if (args.length > 0 && args[0].equals("database")) {
CommandLine dbLine = parser.parse(dbOptions, args, true);
if (dbLine.hasOption("backup")) {
System.out.println("Backing up the database...");
} else if (dbLine.hasOption("restore")) {
System.out.println("Restoring the database...");
}
} else {
formatter.printHelp("ComplexSubCommandExample", globalOptions);
}
} catch (ParseException exp) {
System.out.println("Error parsing the command line: " + exp.getMessage());
formatter.printHelp("ComplexSubCommandExample", globalOptions);
}
}
}
কোডের ব্যাখ্যা:
- Global Options: এখানে কোনো গ্লোবাল অপশন সংজ্ঞায়িত করা হয়নি, তবে
userএবংdatabaseসাব-কমান্ড এর জন্য আলাদা আলাদা অপশন তৈরি করা হয়েছে। userসাব-কমান্ড:userসাব-কমান্ডের জন্য দুটি অপশনaddএবংremoveতৈরি করা হয়েছে।addঅপশনটি একটি নতুন ব্যবহারকারী যোগ করার জন্য এবংremoveঅপশনটি একটি ব্যবহারকারী মুছে ফেলার জন্য।roleঅপশনটি ব্যবহারকারীর রোল সেট করার জন্য।
databaseসাব-কমান্ড:databaseসাব-কমান্ডের জন্য দুটি অপশনbackupএবংrestoreতৈরি করা হয়েছে, যা ডাটাবেস ব্যাকআপ বা রিস্টোর করতে ব্যবহৃত হবে।
- Parse এবং Handle: প্রথমে কোডটি চেক করবে কোন মূল কমান্ড (যেমন
userবাdatabase) ইনপুট হয়েছে, এবং তারপর সেই সাব-কমান্ডের অপশনগুলো পার্স করবে।
আউটপুট:
user addকমান্ড:java ComplexSubCommandExample user add --role admin Adding a new user... Role: adminuser removeকমান্ড:java ComplexSubCommandExample user remove Removing user...database backupকমান্ড:java ComplexSubCommandExample database backup Backing up the database...database restoreকমান্ড:java ComplexSubCommandExample database restore Restoring the database...
Nested এবং Complex Sub-command Structure এর সুবিধা
- লজিক্যাল কমান্ড স্ট্রাকচার: Nested এবং complex sub-commands ব্যবহার করার মাধ্যমে আপনি একটি অ্যাপ্লিকেশনকে লজিক্যালভাবে বিভাগে ভাগ করতে পারেন, যা অ্যাপ্লিকেশনটির ব্যবহারকে আরও সহজ এবং সুসংগঠিত করে তোলে।
- বিকাশের সুবিধা: যখন আপনার অ্যাপ্লিকেশন অনেক ধরনের কমান্ড সমর্থন করে, তখন সেগুলিকে সাব-কমান্ডের মাধ্যমে সাজানো খুবই সুবিধাজনক এবং কোডের রক্ষণাবেক্ষণ সহজ হয়।
- পরিষ্কার হেল্প আউটপুট: সাব-কমান্ড এবং তাদের অপশনগুলির জন্য HelpFormatter ব্যবহার করলে একটি পরিষ্কার এবং সুশৃঙ্খল হেল্প আউটপুট পাওয়া যায়, যা ব্যবহারকারীর জন্য উপকারী।
সারাংশ
Apache Commons CLI লাইব্রেরির মাধ্যমে আপনি nested এবং complex sub-command structure তৈরি করতে পারেন, যেখানে একটি কমান্ডের অধীনে একাধিক সাব-কমান্ড এবং তাদের অপশন থাকতে পারে। এটি আপনাকে আরও উন্নত এবং পরিষ্কার কমান্ড লাইন অ্যাপ্লিকেশন তৈরি করতে সহায়তা করে। সাব-কমান্ডের মাধ্যমে অ্যাপ্লিকেশনের ফিচারগুলোকে একত্রিত এবং সুসংগঠিত করা যায়, যা ব্যবহারকারী-বান্ধব এবং ডেভেলপমেন্টে সহজে মেনটেইনযোগ্য হয়।
Apache Commons CLI লাইব্রেরি Java অ্যাপ্লিকেশনের জন্য কমান্ড লাইন আর্গুমেন্ট হ্যান্ডলিং খুবই সহজ এবং কার্যকরী করে তোলে। এর মাধ্যমে আপনি একাধিক সাব-কমান্ড (sub-command) তৈরি করতে পারেন এবং প্রত্যেকটি সাব-কমান্ডের জন্য আলাদা কমান্ড লাইন বিকল্প (options) এবং আর্গুমেন্ট (arguments) প্রক্রিয়া করতে পারেন। Sub-command Parsing এবং Validation এর মাধ্যমে আপনি একটি শক্তিশালী এবং নমনীয় কমান্ড লাইন ইন্টারফেস তৈরি করতে পারবেন যা বিভিন্ন ফাংশনালিটির জন্য বিভিন্ন সাব-কমান্ড গ্রহণ করে।
Sub-command Parsing এবং Validation এর ভূমিকা
- Sub-command Parsing: সাব-কমান্ডগুলি একাধিক কার্যক্রম বা অপারেশনকে পৃথক করে দেয়, যেখানে প্রতিটি সাব-কমান্ডের জন্য আলাদা কমান্ড লাইন বিকল্প বা আর্গুমেন্ট থাকতে পারে। উদাহরণস্বরূপ,
gitকমান্ডেgit commit,git push,git pullইত্যাদি আলাদা সাব-কমান্ড হতে পারে। - Validation: সাব-কমান্ড ব্যবহারের সময় প্রয়োজনীয় বিকল্প বা আর্গুমেন্ট যাচাই (validate) করা খুব গুরুত্বপূর্ণ। সঠিক ইনপুট প্রদান না করলে ত্রুটি (error) বার্তা প্রদর্শন করা উচিত।
উদাহরণ: Sub-command Parsing এবং Validation
এই উদাহরণে আমরা একটি অ্যাপ্লিকেশন তৈরি করব, যেখানে দুটি সাব-কমান্ড থাকবে:
add– একটি ফাইল যোগ করবে।remove– একটি ফাইল মুছে ফেলবে।
এই দুটি সাব-কমান্ডের জন্য আলাদা বিকল্প এবং আর্গুমেন্ট থাকবে। যদি ব্যবহারকারী সঠিক সাব-কমান্ড বা আর্গুমেন্ট প্রদান না করে, তাহলে একটি ত্রুটি বার্তা প্রদর্শিত হবে।
উদাহরণ কোড:
import org.apache.commons.cli.*;
public class SubCommandParsingExample {
public static void main(String[] args) {
// মূল অপশন তৈরি
Options options = new Options();
// "add" সাব-কমান্ড বিকল্প
Option addFileOption = new Option("f", "file", true, "File to add");
addFileOption.setRequired(true);
options.addOption(addFileOption);
// "remove" সাব-কমান্ড বিকল্প
Option removeFileOption = new Option("f", "file", true, "File to remove");
removeFileOption.setRequired(true);
options.addOption(removeFileOption);
// "help" বিকল্প
Option helpOption = new Option("h", "help", false, "Show help");
options.addOption(helpOption);
// সাব-কমান্ড অপশন গ্রুপ
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
// প্রথমে কমান্ড পার্স করা
cmd = parser.parse(options, args);
// সাহায্য প্রদর্শন
if (cmd.hasOption("h")) {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("SubCommandParsingExample", options);
return;
}
// সাব-কমান্ড চেক করা
if (cmd.hasOption("f")) {
String file = cmd.getOptionValue("f");
if (args[0].equals("add")) {
System.out.println("Adding file: " + file);
} else if (args[0].equals("remove")) {
System.out.println("Removing file: " + file);
} else {
System.out.println("Invalid sub-command. Use 'add' or 'remove'.");
return;
}
}
} catch (ParseException e) {
System.out.println("Error parsing command line: " + e.getMessage());
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("SubCommandParsingExample", options);
}
}
}
ব্যাখ্যা:
- Options তৈরি:
addএবংremoveসাব-কমান্ডের জন্য বিকল্প-fবা--fileতৈরি করা হয়েছে, যা বাধ্যতামূলক।helpবিকল্প-hবা--helpতৈরি করা হয়েছে যাতে সহায়ক বার্তা প্রদর্শন করা যায়।
- Sub-command চেকিং:
args[0].equals("add")বাargs[0].equals("remove")চেক করার মাধ্যমে প্রথম আর্গুমেন্ট (সাব-কমান্ড) যাচাই করা হয়। যদি এটিaddবাremoveনা হয়, তাহলে ত্রুটি বার্তা প্রদর্শন করা হবে।
- HelpFormatter:
- ব্যবহারকারী যদি
-hবা--helpবিকল্প দেন, তাহলেHelpFormatterব্যবহার করে সহায়ক বার্তা প্রদর্শন করা হবে।
- ব্যবহারকারী যদি
- বাধ্যতামূলক আর্গুমেন্ট:
-fবিকল্পের জন্যsetRequired(true)ব্যবহার করা হয়েছে, যা এই বিকল্পটিকে বাধ্যতামূলক (mandatory) করে তোলে।
কমান্ড লাইনের উদাহরণ:
ফাইল যোগ করা:
java SubCommandParsingExample add -f myfile.txtআউটপুট:
Adding file: myfile.txtফাইল মুছে ফেলা:
java SubCommandParsingExample remove -f myfile.txtআউটপুট:
Removing file: myfile.txtঅযাচিত সাব-কমান্ড ব্যবহার:
java SubCommandParsingExample delete -f myfile.txtআউটপুট:
Invalid sub-command. Use 'add' or 'remove'.সহায়ক বার্তা প্রদর্শন:
java SubCommandParsingExample -hআউটপুট:
Usage: SubCommandParsingExample [options] Options: -h, --help Show help -f, --file <file> File to add/remove
Apache Commons CLI-এর Sub-command Parsing এবং Validation ফিচারের মাধ্যমে আপনি শক্তিশালী এবং নমনীয় CLI অ্যাপ্লিকেশন তৈরি করতে পারেন। এটি আপনাকে একাধিক সাব-কমান্ড এবং তাদের সাথে সম্পর্কিত বিকল্প প্রক্রিয়া করতে সক্ষম করে এবং ব্যবহারকারীকে সঠিক ইনপুট প্রদান করতে সহায়ক বার্তা প্রদর্শন করতে পারে। এটি Java কমান্ড লাইন অ্যাপ্লিকেশনের জন্য অত্যন্ত কার্যকরী এবং প্রয়োজনীয় টুল।
Read more