Tuesday, June 14, 2016

Quick start to heroku applications


Nexus Repository Manager

Nexus is a repository manager & stating repository in which files can be uploaded using maven. Alternatively files can be also uploaded via curl commands.
This tutorial outlines to install Nexus also covers artifacts upload using maven & files upload using curl commands.
1. Download latest nexus war file from http://www.sonatype.org/downloads/nexus- latest.war
2. Deploy the war file in any webserver.
3. Launch nexus home page http://localhost:8081/nexus-2.13.0-01/#welcome
4. Default username and password to login are admin & admin123
5. You can create your own Repository from views/Repositories section
6. Add a hosted repository using the sample configuration shown in image.

7. Have curl in classpath to upload files into repository. Example: curl --upload-file upload.zip -u admin:admin123 -v http://localhost:8081/nexus-2.13.0-01/content/repositories/targus/upload.zip Repository url can be found navigating to corresponding repository and in summary section

8. Files uploaded can be found in the browse storage section of the respective repository.

Sunday, October 11, 2015

FindBugs Jenkins Integration

Jenkins installation & integration with firebugs documentation available in the link. Download here Maven plugin for findbugs report generation.
<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>2.5.2</version>
            <configuration>
                <!--
                    Enables analysis which takes more memory but finds more bugs.
                    If you run out of memory, changes the value of the effort element
                    to 'low'.
                -->
                <effort>Max</effort>
                <!-- Reports all bugs (other values are medium and max) -->
                <threshold>Low</threshold>
                <!-- Produces XML report -->
                <xmlOutput>true</xmlOutput>
            </configuration>
        </plugin>
    </plugins>
</reporting>
Command to generate find bugs report : mvn clean compile site

Wednesday, July 15, 2015

PEM File Creation

PEM:Privacy Enhanced Mail is a Base64 encoded DER certificate
PEM files are used to represent Certificate/PrivateKey in an understandable format. They have a distinct header and footer for every key, where the body is composed of Base64 encoded Key.
They are represented as shown below for (Certificate/PrivateKey/Certificate Signing Request/PublicKey)
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCpF26VoB9/Au3Ct/dBFW5kfXFU8IkK+G3CG4slkVX2mwBtvLyb
mFAuQ3RXvmX6tZxeUgwN7m+pZH+Y94lgAIpvcnzBEh8FFxwu0jy17uw+4ler5Soy
YRGV8TYOeQHqoHS44clTG28T2RYy9lkRqTIkkCyo5ViyD7GVQVUgjR31LQIDAQAB
AoGAFmkioPYd9ol+1aXoQVoDzZHKqYVPxIJ0mZto78u5ZvvYLLMtFDo1tkv+aXq0
rWvQk7ewHVCSwBKvzqhQLscjkbZqBdhnkBsyDQTcTQ+0sf8RGDHhBz2A1gGrBFhB
rWc9wGuk7CFHUCrUL0ZXBquMM1KCd/+Fdg2+OQzcoJd9/AECQQDkLdyiaG4Y/lFM
i4wtIf9rNVP4a1jHcYk1Ll7wvymY+v0e9zNVqKbkHaZ4/tyvD3MzVXZCByJZoFu4
sCWRK9WBAkEAvbVF3E7jxrQNTNRqLyQW6v0cmNSCSUfDkYANRuO+d6xvvT2HgrYs
SiL8h4qDLkbM/LTvf9lxb8vSlUSt/3ctrQJAP70767YmQx8PkMVOg/ECS21bJoK+
CwCBJnTsmm2b7hr2iCbflScGb6SEsznmZZR4Rrex0CH0C3tLA91YsSPAgQJAa1Wc
6UFZbpuAyu+EBJgOv3XmMDJMZNnNtQ0Wdf11TpCpyBCAE1yvQmL5LlcYUZ6NbI2S
1Gta2z4fL4VkTR5JIQJAQE6QBPguRRYLFyDa6db+QyeJ1iBHy3I8XvK9bem+Dsby
Km2l2KzLk3IpIEniqjLcoCQzFd5jp8m5VfjMx1doQQ==
-----END RSA PRIVATE KEY-----

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpF26VoB9/Au3Ct/dBFW5kfXFU
8IkK+G3CG4slkVX2mwBtvLybmFAuQ3RXvmX6tZxeUgwN7m+pZH+Y94lgAIpvcnzB
Eh8FFxwu0jy17uw+4ler5SoyYRGV8TYOeQHqoHS44clTG28T2RYy9lkRqTIkkCyo
5ViyD7GVQVUgjR31LQIDAQAB
-----END PUBLIC KEY-----


-----BEGIN CERTIFICATE-----
MIIBmjCCAQMCBgFOkeZMojANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDEwhSYXZp
VGVqYTAeFw0xNTA3MTQxMzI3NDVaFw0xNTA2MjkyMTQ1NTZaMBMxETAPBgNVBAMT
CFJhdmlUZWphMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpF26VoB9/Au3C
t/dBFW5kfXFU8IkK+G3CG4slkVX2mwBtvLybmFAuQ3RXvmX6tZxeUgwN7m+pZH+Y
94lgAIpvcnzBEh8FFxwu0jy17uw+4ler5SoyYRGV8TYOeQHqoHS44clTG28T2RYy
9lkRqTIkkCyo5ViyD7GVQVUgjR31LQIDAQABMA0GCSqGSIb3DQEBCwUAA4GBAIh6
cNhWToRwhaJBykHXPqiaqPDA8n0xtq65dBiUQWOKeoXw0I7+LKUUzfHfb4wGZoLK
W2rBnNCY1BtpasqtAkdZ/Q+keJQd9xBcPqnKGUEqxxX7omB7cKYuhw9C+rGn/K1J
Ci1xlYBWuRsMd3A064fSHV0Adu+ru9YaWyS5+aLU
-----END CERTIFICATE-----


Java Program to generate PEM files.
package bc;

import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.util.Date;

import javax.security.auth.x500.X500Principal;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMWriter;
import org.bouncycastle.x509.X509V1CertificateGenerator;

public class PEMWrite {
    public static void main(String[] args) throws Exception {
        generateSelfSignedX509Certificate();
    }

    static {
        // adds the Bouncy castle provider to java security
        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     * Generate a self signed X509 certificate with Bouncy Castle.
     */
    static void generateSelfSignedX509Certificate() throws Exception {

        // yesterday
        Date validityBeginDate = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000);
        // in 2 years
        Date validityEndDate = new Date(System.currentTimeMillis() + 2 * 365 * 24 * 60 * 60 * 1000);

        // GENERATE THE PUBLIC/PRIVATE RSA KEY PAIR
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC");
        keyPairGenerator.initialize(1024, new SecureRandom());

        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        // GENERATE THE X509 CERTIFICATE
        X509V1CertificateGenerator certGen = new X509V1CertificateGenerator();
        X500Principal dnName = new X500Principal("CN=RaviTeja");
        certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
        certGen.setSubjectDN(dnName);
        certGen.setIssuerDN(dnName); // use the same
        certGen.setNotBefore(validityBeginDate);
        certGen.setNotAfter(validityEndDate);
        certGen.setPublicKey(keyPair.getPublic());
        certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");
        X509Certificate cert = certGen.generate(keyPair.getPrivate(), "BC");
        System.out.println(cert);

        // PEM format representing Certificate
        PEMWriter pemWriter = new PEMWriter(new PrintWriter(System.out));
        pemWriter.writeObject(cert);
        pemWriter.flush();

        //Loads Private Key as PEM format into private_key.pem file
        File file = new File("private_key.pem");
        PEMWriter pw1 = new PEMWriter(new FileWriter(file));
        pw1.writeObject(keyPair.getPrivate());
        pw1.flush();
        pw1.close();

        //PEM format representing PrivateKey
        pemWriter.writeObject(keyPair.getPrivate());
        pemWriter.flush();

        //PEM format representing PublicKey
        pemWriter.writeObject(keyPair.getPublic());
        pemWriter.flush();
        pemWriter.close();

    }
}


Tuesday, April 28, 2015

JSON & XML Online Conversion tool

http://jsonxmlutil.appspot.com/
This tutorial is for converting JSON to XML or XML to JSON. The conversion happens using APIGEE tool, which is used to develop APIs. For the conversion of JSON/XML we use the target endpoint's that are developed on APIGEE tool. We create an API for the conversion which will have two resources inorder to handle JSONtoXML and XMLtoJSON requests.

Step1:Create a resource jsontoxml or any name..


Step2: In develope section , you can arrange all the policies to be applied on the requests. The request gets route on the basis of matching pattern Ex: ../convert/jsontoxml,.../convert/xmltojson (For this you should have good understanding on APIGEE )


Step3: Deploy to environment available


Step4: Go to trace section and Start the Trace Session and hit the url's, you find the live traffic logging.


Finally


How does the conversion happen

APIGEE tool has the ability to do service chaining, sampling data, make XML/JSON conversions, extract variables from request or response e.t.c
APIGEE record the request sent by user into request variable, we now form a list of policies in a sequence to be executed.
Ex: for xml to json conversion, in the response flow


1) Create an assign message policy and assign all the xml request that is sent into an variable response.
2)Send this response xml to an XML to JSON policy using the request as source & assign it to an output variable.
3)Finally assign the json response in an Assign-Message-Policy which can be consumed by any one who ever sends the request.


Source code has been bundled, any one needs this proxy can download it from the url and import in their APIGEE account. Download Here

Saturday, February 14, 2015

Plan My Tavel

Checkout a new application to plan your train journey's using

Plan Your Journeys

Developed using : Angular JS, Groovy & Grails, JQuery UI, JavaScript, Responsive Layout.
Trains Between Stations and Seat Availability Source code location : Source Code

Services Used From : railpnrapi.com End Points: Trains Between Stations Sample Response:

{
    "from_station": {
        "name": "Kakinada Town",
        "code": "CCT"
    },
    "to_station": {
        "name": "Secunderabad Junction",
        "code": "SC"
    },
    "trains": [{
        "number": "17206",
        "name": "Cct Snsi Express",
        "src_arrival_time": "Start",
        "src_departure_time": "06:15",
        "dest_arrival_time": "16:25",
        "dest_departure_time": "16:40",
        "days": [{
            "day-code": "SUN",
            "runs": "N"
        }, {
            "day-code": "MON",
            "runs": "Y"
        }, {
            "day-code": "TUE",
            "runs": "N"
        }, {
            "day-code": "WED",
            "runs": "Y"
        }, {
            "day-code": "THU",
            "runs": "N"
        }, {
            "day-code": "FRI",
            "runs": "N"
        }, {
            "day-code": "SAT",
            "runs": "Y"
        }],
        "classes": [{
            "class-code": "1A",
            "available": "N"
        }, {
            "class-code": "2A",
            "available": "Y"
        }, {
            "class-code": "FC",
            "available": "N"
        }, {
            "class-code": "3A",
            "available": "Y"
        }, {
            "class-code": "CC",
            "available": "N"
        }, {
            "class-code": "SL",
            "available": "Y"
        }, {
            "class-code": "2S",
            "available": "N"
        }, {
            "class-code": "3E",
            "available": "N"
        }]
    }, {
        "number": "17221",
        "name": "Coa Ltt Express",
        "src_arrival_time": "08:53",
        "src_departure_time": "08:55",
        "dest_arrival_time": "20:20",
        "dest_departure_time": "20:25",
        "days": [{
            "day-code": "SUN",
            "runs": "N"
        }, {
            "day-code": "MON",
            "runs": "N"
        }, {
            "day-code": "TUE",
            "runs": "N"
        }, {
            "day-code": "WED",
            "runs": "Y"
        }, {
            "day-code": "THU",
            "runs": "N"
        }, {
            "day-code": "FRI",
            "runs": "N"
        }, {
            "day-code": "SAT",
            "runs": "Y"
        }],
        "classes": [{
            "class-code": "1A",
            "available": "N"
        }, {
            "class-code": "2A",
            "available": "Y"
        }, {
            "class-code": "FC",
            "available": "N"
        }, {
            "class-code": "3A",
            "available": "Y"
        }, {
            "class-code": "CC",
            "available": "N"
        }, {
            "class-code": "SL",
            "available": "Y"
        }, {
            "class-code": "2S",
            "available": "N"
        }, {
            "class-code": "3E",
            "available": "N"
        }]
    }, {
        "number": "12737",
        "name": "Goutami Express",
        "src_arrival_time": "20:28",
        "src_departure_time": "20:33",
        "dest_arrival_time": "06:35",
        "dest_departure_time": "Ends",
        "days": [{
            "day-code": "SUN",
            "runs": "Y"
        }, {
            "day-code": "MON",
            "runs": "Y"
        }, {
            "day-code": "TUE",
            "runs": "Y"
        }, {
            "day-code": "WED",
            "runs": "Y"
        }, {
            "day-code": "THU",
            "runs": "Y"
        }, {
            "day-code": "FRI",
            "runs": "Y"
        }, {
            "day-code": "SAT",
            "runs": "Y"
        }],
        "classes": [{
            "class-code": "1A",
            "available": "Y"
        }, {
            "class-code": "2A",
            "available": "Y"
        }, {
            "class-code": "FC",
            "available": "N"
        }, {
            "class-code": "3A",
            "available": "Y"
        }, {
            "class-code": "CC",
            "available": "N"
        }, {
            "class-code": "SL",
            "available": "Y"
        }, {
            "class-code": "2S",
            "available": "N"
        }, {
            "class-code": "3E",
            "available": "N"
        }]
    }],
    "error": null
}
Seat Availability Sample Response:
{
    "response_code": 200,
    "availability": {
        "train_number": "12738",
        "train_name": "GOUTAMI EXP    ",
        "date_of_journey": "21-02-2015",
        "from": {
            "name": "SECUNDERABAD JN",
            "code": "sc",
            "location": null
        },
        "to": {
            "name": "KAKINADA TOWN  ",
            "code": "cct",
            "location": null
        },
        "class": {
            "class_code": "SL",
            "class_name": "SLEEPER CLASS"
        },
        "quota": {
            "quota_code": "CK",
            "quota_name": "TATKAL"
        },
        "availability_status": [{
            "date": "21-02-2015",
            "status": "AVAILABLE 151"
        }, {
            "date": "22-02-2015",
            "status": "AVAILABLE 151"
        }, {
            "date": "23-02-2015",
            "status": "AVAILABLE 151"
        }, {
            "date": "24-02-2015",
            "status": "AVAILABLE 151"
        }, {
            "date": "25-02-2015",
            "status": "AVAILABLE 151"
        }, {
            "date": "26-02-2015",
            "status": "AVAILABLE 151"
        }]
    }
}
PNR STATUS
EndPoint: PNR STATUS Sample Response:
{
    "response_code": 200,
    "pnr": "4824325952",
    "train_num": "12738",
    "train_name": "GOUTAMI EXP    ",
    "doj": "2015-03-06",
    "from_station": {
        "code": "SC  ",
        "name": "Secunderabad Junction"
    },
    "to_station": {
        "code": "CCT ",
        "name": "Kakinada Town"
    },
    "reservation_upto": {
        "code": "CCT ",
        "name": "Kakinada Town"
    },
    "boarding_point": {
        "code": "SC  ",
        "name": "Secunderabad Junction"
    },
    "class": " SL",
    "no_of_passengers": 6,
    "chart_prepared": "N",
    "passengers": [{
        "sr": "1",
        "booking_status": "S8,35,GN",
        "current_status": "CNF"
    }, {
        "sr": "2",
        "booking_status": "S8,34,GN",
        "current_status": "CNF"
    }, {
        "sr": "3",
        "booking_status": "S8,40,GN",
        "current_status": "CNF"
    }, {
        "sr": "4",
        "booking_status": "S8,38,GN",
        "current_status": "CNF"
    }, {
        "sr": "5",
        "booking_status": "S8,37,GN",
        "current_status": "CNF"
    }, {
        "sr": "6",
        "booking_status": "S8,24,GN",
        "current_status": "CNF"
    }],
    "error": null
}

Saturday, November 1, 2014

PNR Status Application

Hey!! I have developed an application to check your pnr status Have you booked any train ticket with which is not confirmed?. Then you can check it right now here.
Click here to access

API from railpnrapi paid service
Developed on Grails Platform
source code available in github