Apache Commons CLI ব্যবহার করে একটি complex command line application ডিজাইন করা একটি শক্তিশালী উপায় যা আপনাকে অনেক ধরনের কমান্ড লাইন আর্গুমেন্ট এবং অপশন পরিচালনা করতে সহায়তা করে। যদি আপনি একটি অ্যাপ্লিকেশন তৈরি করতে চান যা একাধিক সাব-কমান্ড, অপশন এবং প্যারামিটার সমর্থন করে, তাহলে আপনি এই লাইব্রেরিটি ব্যবহার করতে পারেন।
এই গাইডে, আমরা একটি complex command line application ডিজাইন করার জন্য প্রয়োজনীয় পদক্ষেপ এবং টিপস দেখবো, যার মধ্যে থাকবে:
- Multiple Sub-commands (একাধিক সাব-কমান্ড)
- Options and Arguments (অপশন এবং আর্গুমেন্ট)
- Argument Validation (আর্গুমেন্ট যাচাই)
- Help Message Generation (সাহায্য বার্তা তৈরি)
- Error Handling (ত্রুটি হ্যান্ডলিং)
Step 1: Define the Structure of the Application
একটি complex command line application ডিজাইন করার আগে, আপনাকে প্রথমে এই সিদ্ধান্ত নিতে হবে যে অ্যাপ্লিকেশনটি কি ধরনের কমান্ড এবং অপশন সমর্থন করবে। উদাহরণস্বরূপ, ধরুন আমাদের একটি অ্যাপ্লিকেশন আছে যা ব্যবহারকারীদের ফাইল ইনপুট আর্গুমেন্ট গ্রহণ করবে এবং বিভিন্ন অপশনের মাধ্যমে সেই ফাইলের উপর বিভিন্ন কাজ করবে (যেমন process, validate, convert ইত্যাদি)।
আমাদের অ্যাপ্লিকেশনটি বিভিন্ন Sub-commands সমর্থন করবে যেমন:
- process: একটি ফাইল প্রসেস করা
- validate: ফাইলের ভ্যালিডেশন
- convert: ফাইলের ফরম্যাট কনভার্ট করা
এছাড়াও, প্রতিটি সাব-কমান্ডে কিছু অপশন থাকবে, যেমন ইনপুট ফাইল পাথ এবং আউটপুট ফাইল পাথ।
Step 2: Define Sub-commands and Options
আমরা প্রথমে সুনির্দিষ্ট sub-commands এবং তাদের জন্য প্রয়োজনীয় options নির্ধারণ করবো।
Example: Sub-commands and Options Setup
import org.apache.commons.cli.*;
public class ComplexCLIApplication {
public static void main(String[] args) {
// অপশন এবং সাব-কমান্ডের জন্য Options অবজেক্ট তৈরি
Options options = new Options();
// Common options for all sub-commands
Option inputOption = new Option("i", "input", true, "Input file path");
Option outputOption = new Option("o", "output", true, "Output file path");
options.addOption(inputOption);
options.addOption(outputOption);
// Sub-command 1: process
Option processSubCommand = new Option("p", "process", false, "Process the input file");
options.addOption(processSubCommand);
// Sub-command 2: validate
Option validateSubCommand = new Option("v", "validate", false, "Validate the input file");
options.addOption(validateSubCommand);
// Sub-command 3: convert
Option convertSubCommand = new Option("c", "convert", false, "Convert the input file format");
options.addOption(convertSubCommand);
// CommandLineParser তৈরি
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
cmd = parser.parse(options, args);
// Check which sub-command is selected
if (cmd.hasOption("p")) {
processFile(cmd);
} else if (cmd.hasOption("v")) {
validateFile(cmd);
} else if (cmd.hasOption("c")) {
convertFile(cmd);
} else {
System.out.println("No valid sub-command found.");
printHelp(options);
}
} catch (ParseException e) {
System.err.println("Error: " + e.getMessage());
printHelp(options);
}
}
// Process file logic
private static void processFile(CommandLine cmd) {
String inputFile = cmd.getOptionValue("i");
String outputFile = cmd.getOptionValue("o");
System.out.println("Processing file: " + inputFile + " and saving to " + outputFile);
// Add file processing logic here
}
// Validate file logic
private static void validateFile(CommandLine cmd) {
String inputFile = cmd.getOptionValue("i");
System.out.println("Validating file: " + inputFile);
// Add file validation logic here
}
// Convert file format logic
private static void convertFile(CommandLine cmd) {
String inputFile = cmd.getOptionValue("i");
String outputFile = cmd.getOptionValue("o");
System.out.println("Converting file: " + inputFile + " to " + outputFile);
// Add file conversion logic here
}
// Help message display
private static void printHelp(Options options) {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("ComplexCLIApplication", options);
}
}
Step 3: Argument Validation
Argument Validation হল এমন একটি প্রক্রিয়া যেখানে আপনি কমান্ড লাইন আর্গুমেন্টগুলির সঠিকতা যাচাই করেন, যেমন ফাইলের পাথ, ফাইলের ফরম্যাট, অথবা অপশনগুলির প্রয়োজনীয়তা। উদাহরণস্বরূপ, যদি একটি -p বা --process অপশন ব্যবহারকারীর দ্বারা নির্বাচিত হয়, তবে ইনপুট এবং আউটপুট ফাইলের পাথ অবশ্যই থাকতে হবে।
private static void validateArguments(CommandLine cmd) {
if (cmd.hasOption("p") || cmd.hasOption("v") || cmd.hasOption("c")) {
if (!cmd.hasOption("i")) {
System.out.println("Error: Input file path is required.");
printHelp(options);
System.exit(1);
}
}
if (cmd.hasOption("o")) {
String outputFile = cmd.getOptionValue("o");
// Check for output file validity if required
}
}
এইভাবে আপনি বিভিন্ন সাব-কমান্ডের জন্য পৃথক আর্গুমেন্ট যাচাই করতে পারেন এবং সঠিক ত্রুটি বার্তা প্রদর্শন করতে পারেন।
Step 4: Error Handling
Error Handling একটি গুরুত্বপূর্ণ দিক যখন আপনি একটি কমপ্লেক্স কমান্ড লাইন অ্যাপ্লিকেশন তৈরি করেন। আপনি যত বেশি সাব-কমান্ড এবং অপশন ব্যবহার করবেন, তত বেশি সম্ভাবনা থাকে যে ব্যবহারকারী ভুল ইনপুট দিতে পারে। এর ফলে অ্যাপ্লিকেশনের প্রতিক্রিয়া জানানো প্রয়োজন।
try {
cmd = parser.parse(options, args);
if (cmd.hasOption("p")) {
processFile(cmd);
} else if (cmd.hasOption("v")) {
validateFile(cmd);
} else if (cmd.hasOption("c")) {
convertFile(cmd);
} else {
throw new IllegalArgumentException("No valid sub-command found.");
}
} catch (ParseException | IllegalArgumentException e) {
System.err.println("Error: " + e.getMessage());
printHelp(options);
}
এখানে, IllegalArgumentException ব্যবহার করে ব্যবহারকারী যদি কোন ভুল সাব-কমান্ড প্রদান করেন, তবে তাকে ত্রুটি বার্তা প্রদর্শন করা হবে।
Step 5: Help Message Generation
যখন ব্যবহারকারী কমান্ড লাইন ইন্টারফেস ব্যবহার করেন এবং সাহায্য চান, তখন অ্যাপ্লিকেশনের মধ্যে Help Message তৈরি করা গুরুত্বপূর্ণ। Apache Commons CLI একটি সহজ পদ্ধতিতে সাহায্য বার্তা প্রদর্শন করার জন্য HelpFormatter সরবরাহ করে।
private static void printHelp(Options options) {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("ComplexCLIApplication", options);
}
এই কোডটি চালানোর পর, ব্যবহারকারী যখন -h বা --help অপশন ব্যবহার করবেন, তখন অ্যাপ্লিকেশন স্বয়ংক্রিয়ভাবে সাহায্য বার্তা দেখাবে।
Step 6: Testing and Optimization
একটি complex command line application ডিজাইন করার পর, এটি পরীক্ষা এবং অপটিমাইজ করাও গুরুত্বপূর্ণ। পরীক্ষার সময় নিশ্চিত করুন যে:
- সব অপশন এবং আর্গুমেন্ট সঠিকভাবে কাজ করছে।
- ভুল ইনপুটের জন্য যথাযথ ত্রুটি বার্তা দেখানো হচ্ছে।
- সাব-কমান্ডগুলি কার্যকরভাবে ব্যবস্থাপনা হচ্ছে।
- হেল্প বার্তাটি ব্যবহারকারী বান্ধব এবং বিস্তারিত।
সারাংশ
Apache Commons CLI ব্যবহার করে একটি complex command line application ডিজাইন করার জন্য:
- Sub-commands তৈরি করতে পারেন এবং প্রতিটি কমান্ডের জন্য আলাদা অপশন এবং আর্গুমেন্ট পরিচালনা করতে পারেন।
- Argument Validation এবং Error Handling কার্যকরভাবে ব্যবহারকারী ইনপুট যাচাই এবং ভুল ইনপুটের জন্য ত্রুটি বার্তা প্রদর্শন করতে সাহায্য করে।
- Help Message স্বয়ংক্রিয়ভাবে তৈরি করা যায়, যা ব্যবহারকারীদের জন্য অ্যাপ্লিকেশন ব্যবহার করা আরও সহজ করে তোলে।
- Testing এবং Optimization নিশ্চিত করুন যে আপনার অ্যাপ্লিকেশনটি সঠিকভাবে এবং দ্রুত কাজ করছে।
এইসব কৌশলগুলি ব্যবহার করে আপনি একটি শক্তিশালী এবং কার্যকর command line application তৈরি করতে পারবেন।
একটি Large Command Line Application ডিজাইন ও বাস্তবায়ন করতে গেলে, আপনাকে বেশ কিছু গুরুত্বপূর্ণ বিষয় বিবেচনা করতে হয়। একটি বড় এবং জটিল কমান্ড লাইন অ্যাপ্লিকেশন অনেক আর্গুমেন্ট, অপশন, সাব-কমান্ড এবং অন্যান্য ইনপুট প্যারামিটার গ্রহণ করতে পারে। অ্যাপাচি কমন্স সিআলআই (Apache Commons CLI) একটি শক্তিশালী লাইব্রেরি যা বড় কমান্ড লাইন অ্যাপ্লিকেশনগুলোর জন্য অপশন পার্সিং, সাব-কমান্ড সাপোর্ট, ইনপুট যাচাই, এবং ডিফল্ট মান নির্ধারণের মতো সুবিধা প্রদান করে।
এই গাইডে, আমরা দেখব কীভাবে অ্যাপাচি কমন্স সিআলআই ব্যবহার করে একটি বড় কমান্ড লাইন অ্যাপ্লিকেশন ডিজাইন এবং বাস্তবায়ন করা যায়।
Large Command Line Application ডিজাইন করার ধাপ
১. অ্যাপ্লিকেশনের প্রয়োজনীয়তা বিশ্লেষণ
প্রথমেই আপনাকে অ্যাপ্লিকেশনের প্রয়োজনীয়তা নির্ধারণ করতে হবে। কী ধরনের অপশন, সাব-কমান্ড এবং আর্গুমেন্ট আপনার অ্যাপ্লিকেশন গ্রহণ করবে তা ভাবুন। উদাহরণস্বরূপ, একটি ফাইল প্রসেসিং অ্যাপ্লিকেশন যা বিভিন্ন ফাইল অপশন, আউটপুট ডিরেক্টরি, লগ লেভেল, ইত্যাদি গ্রহণ করবে।
২. অ্যাপ্লিকেশন স্ট্রাকচার এবং সাব-কমান্ড ডিজাইন
একটি বড় অ্যাপ্লিকেশন সাধারণত বিভিন্ন সাব-কমান্ড এবং অপশন ব্যবহার করে। আপনি সাব-কমান্ডের মাধ্যমে বিভিন্ন কার্যক্রম (যেমন process, backup, restore, ইত্যাদি) আলাদা করতে পারেন। এই সাব-কমান্ডগুলির জন্য আলাদা আলাদা অপশন ও আর্গুমেন্ট থাকতে পারে।
৩. একাধিক অপশন এবং আর্গুমেন্ট সঠিকভাবে হ্যান্ডল করা
বড় অ্যাপ্লিকেশনগুলিতে সাধারণত একাধিক অপশন এবং আর্গুমেন্ট থাকে। অ্যাপাচি কমন্স সিআলআই এই অপশনগুলোকে সহজভাবে পার্স করতে সহায়তা করে, যেমন ফ্ল্যাগ, আর্গুমেন্ট সংখ্যা, ডিফল্ট মান এবং আর্গুমেন্ট যাচাই করা।
৪. ইনপুট যাচাই এবং ডিফল্ট মান নির্ধারণ
বড় অ্যাপ্লিকেশনগুলিতে ইনপুট যাচাই অত্যন্ত গুরুত্বপূর্ণ। ইনপুট থেকে ভুল বা অবৈধ প্যারামিটার শনাক্ত করতে, আপনি ডিফল্ট মান নির্ধারণ এবং ইনপুট যাচাইয়ের জন্য ফিচারগুলো ব্যবহার করতে পারেন।
অ্যাপাচি কমন্স সিআলআই দিয়ে Large Command Line Application বাস্তবায়ন
উদাহরণ: ফাইল প্রসেসিং অ্যাপ্লিকেশন ডিজাইন করা
ধরা যাক, আপনার একটি ফাইল প্রসেসিং অ্যাপ্লিকেশন তৈরি করতে হবে, যা বিভিন্ন ফাইল নিয়ে কাজ করবে। এই অ্যাপ্লিকেশনটি process, backup, এবং restore সাব-কমান্ড সাপোর্ট করবে। প্রতিটি সাব-কমান্ডের জন্য আলাদা অপশন এবং আর্গুমেন্ট থাকবে।
১. অপশন ও সাব-কমান্ড তৈরি করা
import org.apache.commons.cli.*;
public class LargeCommandLineApp {
public static void main(String[] args) {
// অপশন তৈরি করা
Options options = new Options();
// সাধারণ অপশন: লোগ লেভেল, আউটপুট ডিরেক্টরি
Option outputDir = new Option("o", "output", true, "Output directory");
outputDir.setRequired(true);
options.addOption(outputDir);
Option logLevel = new Option("l", "log", true, "Log level (INFO, DEBUG, ERROR)");
logLevel.setRequired(true);
options.addOption(logLevel);
// সাব-কমান্ডের জন্য অপশন তৈরি
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
// সাব-কমান্ড তৈরি: process, backup, restore
OptionGroup commandGroup = new OptionGroup();
Option process = new Option("p", "process", false, "Process files");
Option backup = new Option("b", "backup", false, "Backup files");
Option restore = new Option("r", "restore", false, "Restore files");
commandGroup.addOption(process);
commandGroup.addOption(backup);
commandGroup.addOption(restore);
options.addOptionGroup(commandGroup);
try {
// কমান্ড লাইন আর্গুমেন্টস পার্স করা
cmd = parser.parse(options, args);
// সাব-কমান্ড যাচাই করা
if (cmd.hasOption("p")) {
// Process ফাইলের জন্য কাজ
System.out.println("Processing files...");
} else if (cmd.hasOption("b")) {
// Backup ফাইলের জন্য কাজ
System.out.println("Backing up files...");
} else if (cmd.hasOption("r")) {
// Restore ফাইলের জন্য কাজ
System.out.println("Restoring files...");
} else {
System.out.println("Please specify a valid sub-command (process, backup, restore).");
}
// আউটপুট ডিরেক্টরি এবং লগ লেভেল প্রদর্শন
System.out.println("Output Directory: " + cmd.getOptionValue("o"));
System.out.println("Log Level: " + cmd.getOptionValue("l"));
} catch (ParseException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
২. কমান্ড লাইন আর্গুমেন্টস
-o(output directory)-l(log level)- সাব-কমান্ডের জন্য
-p,-b, বা-r
এখন, এই অ্যাপ্লিকেশনটি তিনটি সাব-কমান্ড সাপোর্ট করবে: process, backup, এবং restore।
উদাহরণ ১: ফাইল প্রক্রিয়াজাতকরণ
java LargeCommandLineApp -o /path/to/output -l DEBUG -p
এই কমান্ডে, ফাইল প্রক্রিয়াজাতকরণ (process) সাব-কমান্ড এবং আউটপুট ডিরেক্টরি এবং লগ লেভেল সঠিকভাবে পাস করা হয়েছে।
উদাহরণ ২: ফাইল ব্যাকআপ
java LargeCommandLineApp -o /path/to/output -l INFO -b
এখানে, ফাইল ব্যাকআপ (backup) সাব-কমান্ড এবং অন্যান্য অপশন ব্যবহার করা হয়েছে।
Large Command Line Application ডিজাইন করার সময় কিছু টিপস
১. সহজ ও পরিষ্কার স্ট্রাকচার
বড় অ্যাপ্লিকেশন ডিজাইন করার সময়, কমান্ড লাইন আর্গুমেন্টস এবং অপশনগুলির মধ্যে পরিষ্কার স্ট্রাকচার বজায় রাখা গুরুত্বপূর্ণ। একাধিক সাব-কমান্ডের জন্য গ্রুপ ব্যবহার করুন এবং ডিফল্ট মান এবং ভ্যালিডেশন নিশ্চিত করুন।
২. সাব-কমান্ড ও অপশন গ্রুপিং
বিভিন্ন কার্যক্রম (যেমন process, backup, restore) আলাদা সাব-কমান্ডের মাধ্যমে গ্রুপ করুন, যাতে অ্যাপ্লিকেশনটি আরও সংগঠিত এবং ব্যবহারে সহজ হয়।
৩. ইনপুট যাচাই
অ্যাপ্লিকেশনের ইনপুট যাচাইয়ের জন্য যথাযথ ভ্যালিডেশন ব্যবহার করুন। যদি কোনো অপশন মিসিং থাকে বা ভুল ইনপুট দেওয়া হয়, তাহলে একটি স্পষ্ট ত্রুটি বার্তা প্রদান করুন।
৪. স্বয়ংক্রিয় হেল্প মেসেজ
বড় অ্যাপ্লিকেশনগুলির জন্য একটি স্বয়ংক্রিয় হেল্প মেসেজ তৈরি করা উচিত, যা ব্যবহারকারীদের কমান্ড এবং অপশনগুলির কার্যপ্রণালী বুঝতে সাহায্য করবে।
সারাংশ
অ্যাপাচি কমন্স সিআলআই (Apache Commons CLI) ব্যবহার করে একটি বড় কমান্ড লাইন অ্যাপ্লিকেশন ডিজাইন এবং বাস্তবায়ন করা যায় সহজভাবে। এটি বিভিন্ন সাব-কমান্ড, অপশন গ্রুপিং, ডিফল্ট মান, এবং আর্গুমেন্ট যাচাইয়ের জন্য ফিচার সরবরাহ করে, যা অ্যাপ্লিকেশনটির কার্যক্রম এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করে। অ্যাপাচি কমন্স সিআলআই দ্বারা একটি শক্তিশালী, পরিষ্কার এবং কার্যকর CLI অ্যাপ্লিকেশন তৈরি করা সম্ভব।
Apache Commons CLI লাইব্রেরি দিয়ে আপনি multi-level sub-command structures তৈরি করতে পারেন, যেখানে একাধিক সাব-কমান্ডের মধ্যে সম্পর্ক থাকে এবং প্রতিটি সাব-কমান্ডের নিজস্ব অপশন বা আর্গুমেন্ট থাকতে পারে। এই ধরণের কাঠামো ব্যবহার করে আপনি কমপ্লেক্স কমান্ড-লাইন অ্যাপ্লিকেশন তৈরি করতে পারেন, যেখানে বিভিন্ন স্তরের সাব-কমান্ড থাকে।
ধরা যাক, আমরা একটি অ্যাপ্লিকেশন তৈরি করতে চাই যা server, user, এবং database এর মতো সাব-কমান্ডে বিভক্ত, যেখানে প্রতিটি সাব-কমান্ডের নিজস্ব অপশন থাকতে পারে। এটি একটি multi-level sub-command structure তৈরি করার একটি উদাহরণ।
১. Maven Dependency:
প্রথমে, আপনার pom.xml ফাইলে Apache Commons CLI ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-cli</artifactId>
<version>1.4</version>
</dependency>
২. Multi-level Sub-command Structure Example
এই উদাহরণে, আমরা একটি অ্যাপ্লিকেশন তৈরি করবো যেখানে ৩টি সাব-কমান্ড রয়েছে:
- server: সার্ভার সম্পর্কিত কমান্ডগুলির জন্য।
- user: ইউজার সম্পর্কিত কমান্ডগুলির জন্য।
- database: ডাটাবেস সম্পর্কিত কমান্ডগুলির জন্য।
এখন, প্রতিটি সাব-কমান্ডের জন্য আলাদা অপশন থাকবে।
উদাহরণ কোড:
import org.apache.commons.cli.*;
public class MultiLevelSubCommandExample {
public static void main(String[] args) {
// গ্লোবাল অপশন কনফিগারেশন
Options globalOptions = new Options();
// server সাব-কমান্ডের অপশন
Options serverOptions = new Options();
Option serverPort = new Option("p", "port", true, "Server port");
serverPort.setRequired(true);
serverOptions.addOption(serverPort);
// user সাব-কমান্ডের অপশন
Options userOptions = new Options();
Option userName = new Option("n", "name", true, "User name");
userName.setRequired(true);
userOptions.addOption(userName);
// database সাব-কমান্ডের অপশন
Options dbOptions = new Options();
Option dbHost = new Option("h", "host", true, "Database host");
dbHost.setRequired(true);
dbOptions.addOption(dbHost);
// কমান্ড-লাইন পার্সার এবং কমান্ড ইনপুট
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 "server":
// "server" সাব-কমান্ডের জন্য অপশন পার্সিং
cmd = parser.parse(serverOptions, args);
System.out.println("Starting server on port: " + cmd.getOptionValue("port"));
break;
case "user":
// "user" সাব-কমান্ডের জন্য অপশন পার্সিং
cmd = parser.parse(userOptions, args);
System.out.println("User name: " + cmd.getOptionValue("name"));
break;
case "database":
// "database" সাব-কমান্ডের জন্য অপশন পার্সিং
cmd = parser.parse(dbOptions, args);
System.out.println("Connecting to database host: " + cmd.getOptionValue("host"));
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("MultiLevelSubCommandExample", globalOptions);
}
}
}
ব্যাখ্যা:
- Multiple Sub-commands: এখানে তিনটি সাব-কমান্ড (
server,user, এবংdatabase) তৈরি করা হয়েছে। প্রতিটি সাব-কমান্ডের জন্য পৃথক অপশন এবং আর্গুমেন্ট আছে।serverকমান্ডের জন্য একটিportঅপশন।userকমান্ডের জন্য একটিnameঅপশন।databaseকমান্ডের জন্য একটিhostঅপশন।
- Option Handling: প্রতিটি সাব-কমান্ডের জন্য আলাদা
Optionsঅবজেক্ট ব্যবহার করা হয়েছে। এটি প্রতিটি সাব-কমান্ডের জন্য প্রয়োজনীয় অপশনগুলিকে সংজ্ঞায়িত করে। - Sub-command Parsing: প্রথমে কমান্ড-লাইনের প্রথম আর্গুমেন্ট হিসাবে সাব-কমান্ড (যেমন
server,user,database) চেক করা হয়। তারপর সেই সাব-কমান্ডের জন্য নির্দিষ্ট অপশনগুলি পার্স করা হয়। - HelpFormatter: যদি কোনও ত্রুটি ঘটে বা ইউজার ভুল সাব-কমান্ড প্রদান করেন, তবে সাহায্য মেসেজ দেখানোর জন্য
HelpFormatterব্যবহার করা হয়েছে।
৩. আউটপুট উদাহরণ:
- server সাব-কমান্ড:
java MultiLevelSubCommandExample server -p 8080
আউটপুট:
Starting server on port: 8080
- user সাব-কমান্ড:
java MultiLevelSubCommandExample user -n John
আউটপুট:
User name: John
- database সাব-কমান্ড:
java MultiLevelSubCommandExample database -h localhost
আউটপুট:
Connecting to database host: localhost
- ভুল সাব-কমান্ড:
java MultiLevelSubCommandExample wrongCommand
আউটপুট:
Invalid sub-command: wrongCommand
৪. Multiple Levels of Sub-commands
আপনি multi-level sub-commands তৈরি করতে পারেন, যেখানে একটি সাব-কমান্ড অন্য একটি সাব-কমান্ডের মধ্যে অন্তর্ভুক্ত থাকতে পারে। উদাহরণস্বরূপ, server সাব-কমান্ডের মধ্যে start, stop বা restart সাব-কমান্ড থাকতে পারে।
উদাহরণ:
Options startOptions = new Options();
Option start = new Option("s", "start", false, "Start the server");
startOptions.addOption(start);
Options stopOptions = new Options();
Option stop = new Option("p", "stop", false, "Stop the server");
stopOptions.addOption(stop);
if (subCommand.equals("server")) {
String subSubCommand = args[1];
switch (subSubCommand) {
case "start":
cmd = parser.parse(startOptions, args);
System.out.println("Starting the server...");
break;
case "stop":
cmd = parser.parse(stopOptions, args);
System.out.println("Stopping the server...");
break;
default:
System.out.println("Invalid server sub-command");
break;
}
}
এখানে server সাব-কমান্ডের মধ্যে start এবং stop নামে দুটি সাব-কমান্ড রয়েছে। সেক্ষেত্রে ইউজার server start অথবা server stop ব্যবহার করতে পারবেন।
সারাংশ
Apache Commons CLI ব্যবহার করে আপনি সহজেই multi-level sub-command structures তৈরি করতে পারেন, যেখানে একাধিক সাব-কমান্ড থাকে এবং প্রতিটি সাব-কমান্ডের নিজস্ব অপশন এবং আর্গুমেন্ট থাকে। এটি জটিল কমান্ড-লাইন অ্যাপ্লিকেশনগুলিতে কার্যকারিতা বাড়ানোর জন্য অত্যন্ত উপকারী। আপনি সাব-কমান্ডগুলির মধ্যে সম্পর্ক তৈরি করতে পারেন এবং প্রয়োজন অনুযায়ী অপশন এবং আর্গুমেন্ট প্রোসেসিং কাস্টমাইজ করতে পারেন।
Apache Commons CLI একটি শক্তিশালী লাইব্রেরি যা Java অ্যাপ্লিকেশনগুলিতে কমান্ড লাইন আর্গুমেন্ট পার্সিং এবং অপশন হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়। এটি একটি সহজ এবং কার্যকরী উপায় প্রদান করে, যা আপনাকে কমান্ড লাইন আর্গুমেন্টগুলির মধ্যে ফ্ল্যাগ এবং অপশনগুলো সহজে পার্স করতে সাহায্য করে। তবে, যখন অ্যাপ্লিকেশনটির কমপ্লেক্স ইনপুট প্রক্রিয়া করা হয়, তখন Advanced Validation এবং Argument Parsing বেশ গুরুত্বপূর্ণ হয়ে ওঠে।
এই টিউটোরিয়ালে, আমরা Advanced Validation এবং Argument Parsing কৌশলগুলো দেখে নেব, যা Apache Commons CLI ব্যবহার করে আপনার কমান্ড লাইন অ্যাপ্লিকেশনের ইনপুট যাচাই এবং প্রসেসিংয়ের কাজকে আরও উন্নত ও নিরাপদ করবে।
Advanced Validation Techniques
কাস্টম ভ্যালিডেশন একটি গুরুত্বপূর্ণ বিষয় যখন কমান্ড লাইন ইনপুট প্রক্রিয়াকরণে কোনও বিশেষ শর্ত বা সীমাবদ্ধতা থাকতে পারে। এর মাধ্যমে আপনি ইনপুটের সঠিকতা যাচাই করতে পারেন এবং ভুল ইনপুট গ্রহণ থেকে আপনার অ্যাপ্লিকেশনকে সুরক্ষিত রাখতে পারেন।
1. Custom Validation for Numeric Inputs
ধরি, আমাদের একটি অ্যাপ্লিকেশন আছে যেখানে ব্যবহারকারী numeric ইনপুট দিতে চায়, যেমন port number বা age। আমরা নিশ্চিত করতে চাই যে ব্যবহারকারী শুধুমাত্র বৈধ সংখ্যার মান প্রবেশ করছেন।
উদাহরণ: Numeric Validation
import org.apache.commons.cli.*;
public class NumericValidationExample {
public static void main(String[] args) {
Options options = new Options();
options.addOption("p", "port", true, "Port number (between 1024 and 65535)");
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
try {
CommandLine line = parser.parse(options, args);
if (line.hasOption("p")) {
String port = line.getOptionValue("p");
// Custom validation: Port number must be between 1024 and 65535
try {
int portNumber = Integer.parseInt(port);
if (portNumber < 1024 || portNumber > 65535) {
System.out.println("Error: Port number must be between 1024 and 65535.");
return;
}
System.out.println("Valid port: " + portNumber);
} catch (NumberFormatException e) {
System.out.println("Error: Port must be a valid integer.");
}
}
} catch (ParseException exp) {
System.out.println("Error: " + exp.getMessage());
formatter.printHelp("NumericValidationExample", options);
}
}
}
কেন এটি কার্যকরী:
- Custom validation ব্যবহার করে আপনি নিশ্চিত করতে পারেন যে numeric inputs সঠিকভাবে যাচাই করা হয়েছে, যেমন একটি পোর্ট নাম্বার অবশ্যই 1024 থেকে 65535 এর মধ্যে থাকতে হবে।
- NumberFormatException এবং Range Validation ব্যবহার করে আপনি ভুল ইনপুটগুলো ধরতে পারেন।
2. Custom Validation for File Paths
কখনও কখনও, আপনার ইনপুটটি ফাইল পাথ হতে পারে, এবং আপনি নিশ্চিত করতে চাইবেন যে এটি একটি বৈধ পাথ, এবং ফাইলটি আসলেই উপস্থিত রয়েছে।
উদাহরণ: File Path Validation
import org.apache.commons.cli.*;
import java.io.File;
public class FilePathValidationExample {
public static void main(String[] args) {
Options options = new Options();
options.addOption("f", "file", true, "Path to the input file");
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
try {
CommandLine line = parser.parse(options, args);
if (line.hasOption("f")) {
String filePath = line.getOptionValue("f");
File file = new File(filePath);
// Custom validation: Check if the file exists and is a file
if (!file.exists() || !file.isFile()) {
System.out.println("Error: The specified file does not exist or is not a valid file.");
return;
}
System.out.println("Valid file: " + filePath);
}
} catch (ParseException exp) {
System.out.println("Error: " + exp.getMessage());
formatter.printHelp("FilePathValidationExample", options);
}
}
}
কেন এটি কার্যকরী:
- File validation নিশ্চিত করে যে যে ফাইলটি দেওয়া হয়েছে তা প্রকৃতপক্ষে বিদ্যমান এবং ফাইল ফরম্যাটে রয়েছে।
- এটি ত্রুটির সম্ভাবনা কমিয়ে অ্যাপ্লিকেশনকে আরও সুরক্ষিত এবং স্থিতিশীল করে।
3. Date Validation
যদি আপনি ডেটা ইনপুট চান (যেমন, date of birth বা event date), তবে আপনি date validation ব্যবহার করতে পারেন যাতে ইউজার সঠিক তারিখ ইনপুট দেন।
উদাহরণ: Date Validation
import org.apache.commons.cli.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateValidationExample {
public static void main(String[] args) {
Options options = new Options();
options.addOption("d", "date", true, "Date in the format dd-MM-yyyy");
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
try {
CommandLine line = parser.parse(options, args);
if (line.hasOption("d")) {
String dateStr = line.getOptionValue("d");
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
format.setLenient(false);
// Custom validation: Check if the date is valid
try {
Date date = format.parse(dateStr);
System.out.println("Valid date: " + format.format(date));
} catch (Exception e) {
System.out.println("Error: Invalid date format. Please use dd-MM-yyyy.");
}
}
} catch (ParseException exp) {
System.out.println("Error: " + exp.getMessage());
formatter.printHelp("DateValidationExample", options);
}
}
}
কেন এটি কার্যকরী:
- Date validation নিশ্চিত করে যে ইউজার সঠিক তারিখ ফরম্যাটে ইনপুট দিচ্ছে।
- এটি নির্দিষ্ট ফরম্যাটে তারিখ যাচাই করার জন্য SimpleDateFormat ব্যবহার করে।
4. Multiple Arguments for an Option (Handling Lists)
অনেক সময়, আপনার একটি অপশনের জন্য একাধিক মান প্রয়োজন হতে পারে (যেমন, একাধিক ফাইল পাথ বা ব্যবহারকারীর আইডি)। এই ক্ষেত্রে, আপনি Option.UNLIMITED_VALUES ব্যবহার করতে পারেন, যা একাধিক মান গ্রহণ করতে সহায়তা করবে।
উদাহরণ: Multiple Arguments for an Option
import org.apache.commons.cli.*;
public class MultipleArgumentsExample {
public static void main(String[] args) {
Options options = new Options();
options.addOption("i", "ids", true, "List of user IDs")
.setArgs(Option.UNLIMITED_VALUES); // Multiple values allowed
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
try {
CommandLine line = parser.parse(options, args);
if (line.hasOption("i")) {
String[] ids = line.getOptionValues("i");
System.out.println("User IDs:");
for (String id : ids) {
System.out.println(id);
}
}
} catch (ParseException exp) {
System.out.println("Error: " + exp.getMessage());
formatter.printHelp("MultipleArgumentsExample", options);
}
}
}
কেন এটি কার্যকরী:
Option.UNLIMITED_VALUESব্যবহার করে আপনি একাধিক মান সংরক্ষণ করতে পারেন, যেমন একাধিক ইউজার আইডি বা ফাইল পাথ, যা একটি অপশনের জন্য সুবিধাজনক।
5. HelpFormatter এর ব্যবহার
HelpFormatter আপনাকে কমান্ড লাইন অপশনগুলির জন্য পরিষ্কার এবং ব্যবহারকারী-বান্ধব হেল্প আউটপুট তৈরি করতে সহায়তা করে। এটি Advanced Validation এবং অপশন পার্সিংয়ের পরে ইউজারকে নির্দেশিকা প্রদান করার জন্য গুরুত্বপূর্ণ।
উদাহরণ: HelpFormatter ব্যবহার
import org.apache.commons.cli.*;
public class HelpFormatterExample {
public static void main(String[] args) {
Options options = new Options();
options.addOption("v", "version", false, "Display version information");
options.addOption("f", "file", true, "Input file path");
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("HelpFormatterExample", options);
}
}
কেন এটি কার্যকরী:
- HelpFormatter কমান্ড লাইন অ্যাপ্লিকেশনের জন্য খুবই সহায়ক হেল্প পৃষ্ঠা তৈরি করে, যা ব্যবহারকারীকে কমান্ড লাইন অপশন সম্পর্কে সঠিক তথ্য দেয়।
- এটি আপনার অ্যাপ্লিকেশনকে আরও ব্যবহারকারী-বান্ধব এবং সুনির্দিষ্ট করে তোলে।
সারাংশ
Apache Commons CLI লাইব্রেরি Advanced Validation এবং Argument Parsing জন্য কিছু শক্তিশালী কৌশল সরবরাহ করে। আপনি custom validation ব্যবহার করে ইনপুট যাচাই করতে পারেন, যেমন numeric inputs, file paths, date formats ইত্যাদি। এছাড়াও, multiple values, help formatting, এবং OptionGroup এর মতো বৈশিষ্ট্যগুলি আপনার CLI অ্যাপ্লিকেশনটিকে আরও উন্নত এবং কার্যকরী করে তোলে। এই কৌশলগুলির মাধ্যমে আপনি আপনার কমান্ড লাইন অ্যাপ্লিকেশনের সঠিকতা, নিরাপত্তা এবং ব্যবহারযোগ্যতা নিশ্চিত করতে পারবেন।
Apache Commons CLI একটি শক্তিশালী লাইব্রেরি যা Java অ্যাপ্লিকেশনের জন্য কমান্ড লাইন আর্গুমেন্ট এবং বিকল্প হ্যান্ডলিং করে। এটি কমান্ড লাইন অ্যাপ্লিকেশনগুলির জন্য কনফিগারেশন ম্যানেজমেন্টের ক্ষেত্রে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। কমান্ড লাইন অ্যাপ্লিকেশনের কনফিগারেশন সাধারণত ফাইলের মাধ্যমে যেমন properties ফাইল, XML ফাইল বা কমান্ড লাইনের আর্গুমেন্টের মাধ্যমে পরিচালিত হয়।
এই লেখায়, আমরা কীভাবে Apache Commons CLI ব্যবহার করে কমান্ড লাইন অ্যাপ্লিকেশনগুলির জন্য কনফিগারেশন ম্যানেজমেন্ট কার্যকরভাবে বাস্তবায়ন করা যায়, তা দেখব।
Configuration Management in Command Line Applications
Configuration Management এর উদ্দেশ্য হল অ্যাপ্লিকেশনটির কনফিগারেশন বা সেটিংস একটি কেন্দ্রীয় জায়গায় সঞ্চয় এবং পরিচালনা করা। কমান্ড লাইন অ্যাপ্লিকেশনে, কনফিগারেশনগুলি সাধারণত তিনটি প্রধান উপায়ে প্রক্রিয়া করা হয়:
- কমান্ড লাইন আর্গুমেন্ট – ব্যবহারকারী কমান্ড লাইনে বিকল্প এবং আর্গুমেন্ট দিয়ে কনফিগারেশন সেট করতে পারে।
- কনফিগারেশন ফাইল – অ্যাপ্লিকেশন কনফিগারেশন একটি ফাইলে সংরক্ষিত থাকতে পারে (যেমন
.propertiesফাইল)। - এনভায়রনমেন্ট ভেরিয়েবল – কিছু কনফিগারেশন ফাইল সিস্টেম বা পরিবেশ ভেরিয়েবল (environment variable) হিসেবে পরিবেশন করা যেতে পারে।
Apache Commons CLI এর মাধ্যমে কনফিগারেশন ম্যানেজমেন্ট
Apache Commons CLI আপনাকে কমান্ড লাইন আর্গুমেন্ট এবং ঐচ্ছিক আর্গুমেন্ট (যেমন -f, --file, --config ইত্যাদি) ব্যবহার করে কনফিগারেশন ম্যানেজমেন্ট করতে সাহায্য করে। আপনি এই কনফিগারেশন সেটিংসগুলির মান কনফিগারেশন ফাইল থেকে বা কমান্ড লাইনের আর্গুমেন্ট থেকে গ্রহণ করতে পারেন।
উদাহরণ: Configuration Management Using Apache Commons CLI
ধরা যাক, আমরা একটি অ্যাপ্লিকেশন তৈরি করতে যাচ্ছি যা কনফিগারেশন ফাইল থেকে ডেটা লোড করবে এবং কমান্ড লাইন আর্গুমেন্টের মাধ্যমে অতিরিক্ত কনফিগারেশন সেটিংস গ্রহণ করবে। এটি একটি কনফিগারেশন ফাইলের মাধ্যমে লোড করবে এবং সেই সাথে ব্যবহারকারীকে কমান্ড লাইনের আর্গুমেন্টের মাধ্যমে অতিরিক্ত কনফিগারেশন সেটিংস দিতে পারবে।
কোড উদাহরণ:
import org.apache.commons.cli.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class CLIConfigExample {
public static void main(String[] args) {
// বিকল্প তৈরি
Options options = new Options();
// --help বিকল্প
Option helpOption = new Option("h", "help", false, "Show help");
options.addOption(helpOption);
// --config ফাইলের পথ আর্গুমেন্ট
Option configOption = new Option("c", "config", true, "Configuration file path");
configOption.setRequired(false);
options.addOption(configOption);
// --output আউটপুট ফাইলের জন্য বিকল্প
Option outputOption = new Option("o", "output", true, "Output file");
options.addOption(outputOption);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = null;
try {
// আর্গুমেন্ট পার্স করা
cmd = parser.parse(options, args);
// --help চেক করা
if (cmd.hasOption("h")) {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("CLIConfigExample", options);
return;
}
// কনফিগারেশন ফাইল প্রক্রিয়া করা
String configFilePath = cmd.getOptionValue("c");
if (configFilePath != null) {
Properties configProperties = new Properties();
try (FileInputStream input = new FileInputStream(configFilePath)) {
configProperties.load(input);
System.out.println("Loaded config file: " + configFilePath);
System.out.println("Config value for 'app.name': " + configProperties.getProperty("app.name"));
} catch (IOException e) {
System.out.println("Error loading config file: " + e.getMessage());
}
}
// --output আর্গুমেন্ট চেক করা
if (cmd.hasOption("o")) {
String outputFile = cmd.getOptionValue("o");
System.out.println("Output file: " + outputFile);
}
} catch (ParseException e) {
System.out.println("Error parsing command line: " + e.getMessage());
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("CLIConfigExample", options);
}
}
}
ব্যাখ্যা:
- Options:
-hবা--help: ব্যবহারকারীকে সাহায্য বার্তা প্রদর্শন করবে।-cবা--config: কনফিগারেশন ফাইলের পথ।-oবা--output: আউটপুট ফাইলের নাম বা পথ।
- Properties File:
- কনফিগারেশন ফাইল (যেমন
.propertiesফাইল) লোড করা হয় এবং সেটি প্রক্রিয়া করা হয়। উদাহরণস্বরূপ, যদি কনফিগারেশন ফাইলের মধ্যেapp.nameনামে একটি প্রপার্টি থাকে, তাহলে সেটি প্রদর্শিত হবে।
- কনফিগারেশন ফাইল (যেমন
- CommandLine Parsing:
- কমান্ড লাইন আর্গুমেন্ট এবং কনফিগারেশন ফাইল থেকে ইনপুট গ্রহণ করা হয় এবং প্রয়োজনীয় আর্গুমেন্ট বা ফাইল থেকে কনফিগারেশন সেটিংস প্রক্রিয়া করা হয়।
কনফিগারেশন ফাইলের উদাহরণ (config.properties):
app.name=MyCLIApp
app.version=1.0.0
কমান্ড লাইন উদাহরণ:
কনফিগারেশন ফাইল সহ অ্যাপ্লিকেশন চালানো:
java CLIConfigExample -c config.properties -o output.txtআউটপুট:
Loaded config file: config.properties Config value for 'app.name': MyCLIApp Output file: output.txtহেল্প বার্তা দেখা:
java CLIConfigExample -hআউটপুট:
Usage: CLIConfigExample [options] Options: -h, --help Show help -c, --config <file> Configuration file path -o, --output <file> Output file
Benefits of Configuration Management in Command Line Applications
- Centralized Configuration:
- কনফিগারেশন ফাইল ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনের সমস্ত সেটিংস একটি কেন্দ্রীয় স্থানে সংরক্ষণ করতে পারেন, যা সহজেই পরিচালিত হয়।
- Flexibility:
- ব্যবহারকারীরা কনফিগারেশন সেটিংস কমান্ড লাইনের আর্গুমেন্ট অথবা ফাইল থেকে দিতে পারে, যা অ্যাপ্লিকেশনকে আরও নমনীয় এবং কাস্টমাইজযোগ্য করে তোলে।
- Error Prevention:
- কনফিগারেশন ফাইল থেকে ইনপুট প্রক্রিয়া করার মাধ্যমে আপনি ইনপুটের বৈধতা চেক করতে পারেন, যা ভুল কনফিগারেশন থেকে অ্যাপ্লিকেশনকে রক্ষা করে।
- Maintainability:
- যখন অ্যাপ্লিকেশন বড় হয়, কনফিগারেশন ফাইলগুলি সহজেই আপডেট এবং রক্ষণাবেক্ষণ করা যেতে পারে। এতে কোডের মধ্যে পরিবর্তন না করে কনফিগারেশন পরিবর্তন করা সম্ভব হয়।
Apache Commons CLI-এর মাধ্যমে Command Line Application এ Configuration Management অত্যন্ত সহজ এবং কার্যকরী হয়ে ওঠে। এটি আপনাকে কনফিগারেশন ফাইল থেকে ডেটা লোড করতে এবং কমান্ড লাইনের আর্গুমেন্ট ব্যবহার করে অতিরিক্ত কনফিগারেশন গ্রহণ করতে সাহায্য করে। কনফিগারেশন ম্যানেজমেন্টের মাধ্যমে আপনার অ্যাপ্লিকেশনটি আরও নমনীয়, ব্যবস্থাপনাযোগ্য এবং সহজেই কনফিগারেশন পরিবর্তন করা সম্ভব হয়।
Read more