|
Mohd Altaf Oodles

Mohd Altaf (Backend-Associate Consultant L2- Development)

Experience:2+ yrs

Mohd Altaf is an experienced Backend Developer with over years of expertise in Java, SpringBoot, MySQL, and MongoDB. He has contributed to various projects including Optaplanner customization for a medical practice, where he added new functionalities as per the client's requirements and optimized the code for better API efficiency. He is proficient in bug resolution and has resolved various bugs during development. In the CaptionLabs project, he contributed to bug resolution in both production and development servers and worked on code optimization for better performance. He enjoys taking on new challenges and delivering high-quality results that meet the client's needs.

Mohd Altaf Oodles
Mohd Altaf
(Associate Consultant L2- Development)

Mohd Altaf is an experienced Backend Developer with over years of expertise in Java, SpringBoot, MySQL, and MongoDB. He has contributed to various projects including Optaplanner customization for a medical practice, where he added new functionalities as per the client's requirements and optimized the code for better API efficiency. He is proficient in bug resolution and has resolved various bugs during development. In the CaptionLabs project, he contributed to bug resolution in both production and development servers and worked on code optimization for better performance. He enjoys taking on new challenges and delivering high-quality results that meet the client's needs.

LanguageLanguages

DotENGLISH

Fluent

DotHindi

Fluent

DotENGLISH

Conversational

DotHINDI

Fluent

Skills
Skills

DotAngular/AngularJS

60%

DotOCR

80%

DotReactJS

60%

DotStripe API

80%

DotOAuth

60%

DotJava

100%

DotJSON

60%

DotMySQL

80%

DotSpring Boot

80%

DotOPEN KM

60%

DotWhatsApp API

60%

DotPython

60%

DotNode Js

60%

DotWebhooks

60%

DotSlack

60%

DotGithub/Gitlab

100%

DotSharePoint

80%

DotAPI Testing

100%
ExpWork Experience / Trainings / Internship

Sep 2022-Present

Associate Consultant - Development

Gurugram


Oodles Technologies

Gurugram

Sep 2022-Present

EducationEducation

2020-2023

Dot

Lucknow Institute of Technology

B Tech-Computer Science and Engineering

Top Blog Posts
How to Connect from Your Local Environment On AWS Redis Elasticache

To connect to a Redis Elasticache instance on AWS using the Redis command-line client (redis-cli) from a Mac terminal, ensure you have the Redis client installed on your machine. Additionally, have the endpoint and credentials for your Elasticache instance ready.


 

1. Install Redis Client: Use Homebrew to install the Redis client on your Mac terminal:

brew install redis

 

2. Find Endpoint and Port: Locate the endpoint and port number for your Elasticache instance. You can find this information on the AWS Management Console in the Elasticache dashboard.

 

3. Connect to Elasticache Instance: Use the redis-cli command to connect to the instance:

 

      redis-cli -h mycluster.abc123.us-west-2.elasticache.amazonaws.com -p port_number

 

4. Authentication: If your cluster requires authentication, you will be prompted to enter the password.

 

5. Execute Redis Commands: Once connected, you can run Redis commands as usual. 

For example:

   

   set mykey "myvalue"

   

 

Also, Read How To Encrypt an Existing Unencrypted EBS Volume For EC2 Instance

 

 

6. Useful Commands: To check the value of a key, use:

   

   get mykey

   

 

7. Alternative Clients: Besides redis-cli, you can use other Redis clients like “Ioredis” in Node.js or “Jedis” in Java to connect to Redis Elasticache.

 

8. Security Considerations: Consider using IAM authentication for Elasticache instead of plaintext passwords for enhanced security. If using an authentication token, use the AUTH command followed by the token.

 

9. Using OpenSSL: Optionally, you can use the OpenSSL command-line tool to establish a secure connection to the Redis Elasticache instance. However, this method is less secure than IAM authentication and is not recommended.

 

10. SSL/TLS Encryption: Redis Elasticache supports SSL/TLS encryption. If you require encryption in transit, ensure to use SSL/TLS encryption when establishing the connection.

 

By following these steps, you can efficiently connect to a Redis Elasticache instance on AWS using the Redis command-line client from your Mac terminal.

Category: ERP Solutions
Delegation Pattern and The By Keyword

The delegation pattern is a technique where an object expresses a certain behavior to the outside but simultaneously delegates responsibility for implementing that behavior to an associated object.

Let's understand this with the help of an example:
Let's say we want a printer. And a printer does what it is supposed to do. Let's create an interface to show this behavior.

 

interface Printer {
   void print(final String message);
}

 

Also, Read Saving Files To System in Spring Boot

 

Now it does not matter which printer prints this.

So let's say we have Three Printers(Canon, Epson, and HP) . Whichever printer is available or has ink prints the text. Now all of them are of type printers so all three will implement the Printer interface.

 

class CanonPrinter implements Printer {
   @Override
   public void print(String message) {
       System.out.println("Canon Printer : "+message );
   }
}

class EpsonPrinter implements Printer {
   @Override
   public void print(String message) {
       System.out.println("Epson Printer : {}"+message);
   }
}

class HpPrinter implements Printer {
   @Override
   public void print(String message) {
       System.out.println("HP Printer : {}" + message);
   }
}

Let's say you want to use the HP Printer to print hello world. You would get that done by creating an object of type HpPrinter.

 

public class Main {
   public static void main(String args[]){
       final String MESSAGE_TO_PRINT = "hello world";
       var printer = new HpPrinter();
       printer.print(MESSAGE_TO_PRINT);
   }
}

If in the future you want to swap the usage of this HP Printer since there is no ink and you need to use the Epson Printer, you'll need to change the implementation to Epson in all the places where Hp was used so instead you use a controller. The work of this controller is to supply a printer that gives you the output.

 

Also, Read Featuring ngxTranslate To Implement Translation In Angular

 

class PrinterController implements Printer {

   private final Printer printer;

   public PrinterController(Printer printer) {
       this.printer = printer;
   }

   @Override
   public void print(String message) {
       printer.print(message);
   }
}

The main method will change like so
 

public class Main {

   public static void main(String args[]){
       final String MESSAGE_TO_PRINT = "hello world";

       var hpPrinterController = new PrinterController(new HpPrinter());
       var canonPrinterController = new PrinterController(new CanonPrinter());
       var epsonPrinterController = new PrinterController(new EpsonPrinter());

       hpPrinterController.print(MESSAGE_TO_PRINT);
       canonPrinterController.print(MESSAGE_TO_PRINT);
       epsonPrinterController.print(MESSAGE_TO_PRINT);
   }
}

 

Now the PrinterController decides which printer to use to print. In other words, it delegates the responsibility from the user to the printer controller. This is known as the delegation pattern.

An Introduction To Apache iText

iText PDF Java Introduction

Apache iText is an open-source Java Library that enables developing and converting PDF documents. The PDF is a Portable Document Format that helps present data in a manner that is independent of application software, hardware, and operating systems. Several libraries can create and manipulate documents through programs like Adobe PDF Library, Formatting Object Processor, Jasper Report, etc.

 

Features of iText 

Following are the features of iText -

 

  • iText provides classes to generate interactive PDF documents. We can create maps and books using iText.
  • Using iText we can add bookmarks, watermarks, and page numbers.
  • Using iText we can split a PDF into multiple PDFs and also add additional pages.
  • Using iText, we can fill interactive forms in a PDF document.
  • Using iText, we can save PDF as an image file, such as PNG or JPEG.
  • iText library provides a Canvas class using which we can draw geometrical shapes.
  • Using iText, we can create PDF files from the Java programs. We can add images and fonts.

 

Add the following content to its pom.xml

 

<dependencies>     

      <dependency>         

         <groupId>com.itextpdf</groupId>         

         <artifactId>kernel</artifactId>         

         <version>7.0.2</version>     

      </dependency>  

      

      <dependency>         

         <groupId>com.itextpdf</groupId>         

         <artifactId>io</artifactId>         

         <version>7.0.2</version>     

      </dependency>  

      

      <dependency>         

         <groupId>com.itextpdf</groupId>         

         <artifactId>layout</artifactId>         

         <version>7.0.2</version>

      </dependency>  

      

      <dependency>         

         <groupId>com.itextpdf</groupId>         

         <artifactId>forms</artifactId>         

         <version>7.0.2</version>    

      </dependency>  

      

      <dependency>         

         <groupId>com.itextpdf</groupId>         

         <artifactId>pdfa</artifactId>         

         <version>7.0.2</version>     

      </dependency>  

      

      <dependency>         

         <groupId>com.itextpdf</groupId>         

         <artifactId>sign</artifactId>         

         <version>7.0.2</version>     

      </dependency>  

      

      <dependency>         

         <groupId>com.itextpdf</groupId>         

         <artifactId>barcodes</artifactId>         

         <version>7.0.2</version>     

      </dependency>  

      

      <dependency>         

         <groupId>com.itextpdf</groupId>         

         <artifactId>font-asian</artifactId>         

         <version>7.0.2</version>     

      </dependency>  

      

      <dependency>         

         <groupId>com.itextpdf</groupId>         

         <artifactId>hyph</artifactId>         

         <version>7.0.2</version>    

      </dependency> 

   </dependencies>

 

Program to create PDF document

package com.javapapers.java.itext;

 

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

 

import com.itextpdf.text.Document;

import com.itextpdf.text.DocumentException;

import com.itextpdf.text.Paragraph;

import com.itextpdf.text.pdf.PdfWriter;

 

public class PdfDocument {

 

public static void main(String[] args) {

 

Document document = new Document();

 

try {

PdfWriter.getInstance(document, new FileOutputStream(

"MyFirstDynamic.pdf"));

 

document.open();

document.add(new Paragraph(

"iText Core is a library that aids in creating, processing, and editing PDF documents"));

document.close();

 

} catch (DocumentException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

}

At Oodles, we provide full-scale ERP application development services to help our clients streamline their day-to-day business processes. Contact us at [email protected] for project-related queries. 

Payment Integration With Paytm In a Spring Boot Application

Payment Integration With Paytm In Spring Boot Application

This article will teach us to integrate Paytm as a Payment Gateway in the Spring Boot Application. It is one of the popular services with the fastest and safest payment method.

 

Steps to Integrate Paytm as a Payment Gateway 

  • Create a Spring Boot Application from Spring Initializr.
  • Get Paytm Properties such as Merchant ID, Merchant Key, etc

     
  • Log in or sign in to a Paytm Account.
  • Go to Developer Setting and API Keys.
  • Select Generate Test API Details.
  • You will get a Test Merchant ID and Test Merchant Key.
           
  • Configure the application.properties file

################ Paytm Properties #########################

 paytm.payment.sandbox.merchantId:your merchant ID 

paytm.payment.sandbox.merchantKey: your merchant key 

paytm.payment.sandbox.channelId:WEB 

paytm.payment.sandbox.industryTypeId:Retail 

paytm.payment.sandbox.website:WEBSTAGING 

paytm.payment.sandbox.paytmUrl:https://securegw-stage.paytm.in/order/process paytm.payment.sandbox.callbackUrl:http://localhost:8080/pgresponse 

paytm.payment.sandbox.details.MID: ${paytm.payment.sandbox.merchantId} 

paytm.payment.sandbox.details.CHANNEL_ID: ${paytm.payment.sandbox.channelId} 

paytm.payment.sandbox.details.INDUSTRY_TYPE_ID: ${paytm.payment.sandbox.industryTypeId} paytm.payment.sandbox.details.WEBSITE: ${paytm.payment.sandbox.website} paytm.payment.sandbox.details.CALLBACK_URL: ${paytm.payment.sandbox.callbackUrl} 

paytm.mobile = your paytm registered mobile number 

paytm.email = your email address

Note: All the properties will be the same as mentioned in the application.properties, Only Merchant ID, Merchant Key, Mobile Number, and Email Address will be yours.

 

Also, Read Stripe Payment Gateway Integration In Java
 

 

  • Add the following maven repository in your pom.xml.

<repositories>

    <repository>

        <id>my-repo1</id>

        <url>  http://artifactorypg.paytm.in/artifactory/libs-release </url>

    </repository>

</repositories>

  • Placed the dependency for checksum in pom.xml.

<dependency> 

       <groupId>com.paytm</groupId> 

         <artifactId>paytm-checksum</artifactId>

     </dependency>

 

Also, Read Performing Basic Operation On AWS Bucket In Spring Boot Java

 

  • Controller code.

@Log4j2

@RestController

@RequestMapping("/booking")

public class BookingController {

 

    @Autowired

    private PaytmDetails paytmDetails;

 

    @Value("${paytm.mobile}")

    private String paytmMobile;

    @Value("${paytm.email}")

    private String paytmEmail;

 

    @PostMapping(value = "/make-payment")

    public ModelAndView getPaymentRedirect(@RequestParam String orderId, @RequestParam String txnAmount, @RequestParam String customerId) throws Exception {

        log.info("1=========");

     ModelAndView modelAndView = new ModelAndView("redirect:" + paytmDetails.getPaytmUrl());

        log.info("2=========");

     TreeMap<String, String> parameters = new TreeMap<>();

        paytmDetails.getDetails().forEach((k, v) -> parameters.put(k, v));

        parameters.put("MOBILE_NO", paytmMobile);

        parameters.put("EMAIL", paytmEmail);

        parameters.put("ORDER_ID", orderId);

        parameters.put("TXN_AMOUNT", txnAmount);

        parameters.put("CUST_ID", customerId);

     String checkSum = getCheckSum(parameters);

        parameters.put("CHECKSUMHASH", checkSum);

        log.info("3=========");

        modelAndView.addAllObjects(parameters);

     return modelAndView;

    }

 

    @PostMapping(value = "/payment-response")

    public ModelAndView getPaymentResponseRedirect(HttpServletRequest request) {

     ModelAndView modelAndView = new ModelAndView("redirect:http://localhost:8080/#/payment");//my angular payment response landing url

     Map<String, String[]> mapData = request.getParameterMap();

     TreeMap<String, String> parameters = new TreeMap<String, String>();

     String paytmChecksum = "";

     for (Entry<String, String[]> requestParamsEntry : mapData.entrySet()) {

         if ("CHECKSUMHASH".equalsIgnoreCase(requestParamsEntry.getKey())) {

                paytmChecksum = requestParamsEntry.getValue()[0];

            } else {

                parameters.put(requestParamsEntry.getKey(), requestParamsEntry.getValue()[0]);

            }

        }

     String result;

        boolean isValideChecksum = false;

     try {

            isValideChecksum = validateCheckSum(parameters, paytmChecksum);

         if (isValideChecksum && parameters.containsKey("RESPCODE")) {

             if (parameters.get("RESPCODE").equals("01")) {

                    result = "Payment Successful";

                } else {

                    result = "Payment Failed";

                }

            } else {

                result = "Checksum mismatched";

            }

        } catch (Exception e) {

            result = e.toString();

        }

        modelAndView.addObject("result", result);

        parameters.remove("CHECKSUMHASH");

        modelAndView.addObject("parameters", parameters);

     return modelAndView;

    }

 

    private boolean validateCheckSum(TreeMap<String, String> parameters, String paytmChecksum) throws Exception {

     return PaytmChecksum.verifySignature(parameters, paytmDetails.getMerchantKey(), paytmChecksum);

    }

 

    private String getCheckSum(TreeMap<String, String> parameters) throws Exception {

     return PaytmChecksum.generateSignature(parameters, paytmDetails.getMerchantKey());

    }

}

An Introduction To OpenKM DMS

OpenKM is a document management system which is also known as electronic document and Record Management System( EDRMS). Document Management Software is a program used to store, manage and track electronic documents. We can upload different formats of documents with advanced searching features.

 

Features Provided by OpenKM

  • Document Management.

  • Record Management.

  • Workflow.

  • Automate tasks.

  • Modules.

  • Integration.

  • Make your own App.

  • Partner Program.

 

Document Management

OpenKM is frequently appertained to as Document Management System( DMS). It's a computer program used to store, manage and track electronic documents.

With the OpenKM enterprise, we can:-

  • control our enterprise content.

  • Collect information from any digital source.

  • Manage digital content.

  • Manage document.

  • Unite with associates on documents and systems.

 

Record Management

OpenKM helps the association efficiently and totally control the creation, event, conservation, application, and disposition of records, including processes for capturing and maintaining substantiation of and information about business conditioning and deals in the form of records.

With the OpenKM enterprise, you can:-

  • Set lifecycle operation.

  • Set information governance.

  • Manage Content.

 

Workflow

OpenKM provides a workflow machine for defining and reusing business sense. It helps the workers to coordinate effectively with both the association and each other.

  • produce intricate workflows.

  • Workflows are used for reviewing, blessing, and confirmation.

  • Support for periodical and resemblant workflows.

  • Assign tasks to users or groups.

  • Track workflow tasks, status, and process.

  • Configure correspondence communication announcements.

 

Automatic Tasks

Automatic tasks We can apply confirmation rules and certain conduct to be performed on the documents without mortal intervention. The main advantage of robotization is increased productivity, reduced functional time, bettered quality, a high degree of delicacy, document robotization, etc. For illustration:

  • Metadata Capture.

  • Brackets of documents.

  • Automatic workflow machine.

  • Electronic Signature.

 

Modules

  • Mail Archiver

  • Multitenant

  • Electronic Signature – A hand in a document is a suggestion that the person accepts the intentions recorded in the document.

  • Barcode - Reading and identification of barcode.

  • Electronic Invoicing – excerpt tab “ XML ” format and store them in the system.

  • CMIS – Use OpenKM as a CMIS server.

  • Cryptography - Lines can be translated and deciphered.

  • ReportsProduce your own Jasper Report and induce PDF format.

  • Task Manager – Administrate and assign task to users and roles.

 

Integration

OpenKM provide several ways of integration-

  • OpenKM SDK’s available for Java and .Net

  • Using the webservices REST API

  • Datastore can be configured in any database as MYSQL, PostgreSQL, Oracle or SQL Server

  • Authentication is pluggable and easy to user external user database, LDAP, or Actice Directory, SSO and CAS

 

Build Your Own App

Make your own App With the help of OpenKM Dev tools, we can produce our own custom app for our association needs, fluently handle our content, simplify our workflow, and increase our effectiveness and effectiveness.

 

Partner Program

  • Migration to OpenKM

  • Compliance and record operation

  • System integrations

  • UI customizations

  • ISO consulting

 

We, at Oodles ERP, provide end-to-end ERP application development services to meet the diverse industry-specific needs of our clients. Our team specializes in building custom enterprise solutions from scratch for varying business needs. To learn more about our custom ERP application development services, reach out at [email protected]

New Features In Java 19

Java 19 Features

Java 19 is released on 20 September 2022. One of the most exciting features of Java 19 is virtual threads. It is a prerequisite for structured concurrency.

 

Methods To Create Preallocated HashMaps

We can create an ArrayList of a known number of elements. But it is not the case in hashmap, because the default load factor of hashmap is 0.75. As soon as the hashmap is 75% full, it is rehashed with double size. So, if we want to create a hashmap of a known number, we have to calculate the capacity by diving the number with the load factor.

So, the HashMap of 100 mappings is created as follows:

120 / 0.75 = 160

Map map = new HashMap(160);

In Java 19, we can write as follows:

Map map = HashMap.newHashMap(120);

 

Pattern Matching For The Switch

In Java 19, the syntax of pattern matching for the switch is changed. Instead of && operator, we use the new keyword ‘when’. When is called a contextual keyword?

 

Record Pattern

Records in Java are introduced in the previous version. But in Java 19, instead of matching ‘Position position’ and accessing ‘position’ in the code, we can match ‘Position( int x, int y)’ and access ‘x’ and ‘y ‘directly.

 

Virtual Threads

Virtual threads are like normal threads from the Java perspective but they are not mapped with an operating system thread. Instead, they are pooled on carrier thread. As soon as the virtual thread encounters a blocking operation it is removed from the carrier thread and then the carrier thread executes another virtual thread. Thus no longer block the executing thread and allows multiple requests in parallel.

 

Deprecation and Degradation

• Locale class is marked as deprecated instead we use new static factory memory Locale.of.

• ThreadGroup.destroy().

• ThreadGroup.isDestroyed().

• ThreadGroup.setDaemon().

• ThreadGroup.getDaemon().

• ThreadGroup.suspend(), resume() and stop() throw UnsupportedOperationException.

 

We provide full-scale enterprise web app development services to solve complex business problems and strengthen their web presence. Our custom ERP application development services enable enterprises to sail through their routine operational challenges and build resilience for the future. Write to us at [email protected] for more detail. 

Banner

Don't just hire talent,
But build your dream team

Our experience in providing the best talents in accordance with diverse industry demands sets us apart from the rest. Hire a dedicated team of experts to build & scale your project, achieve delivery excellence, and maximize your returns. Rest assured, we will help you start and launch your project, your way – with full trust and transparency!