com.pari.nm.modules.imgmgmt.ImagePropertyCCOHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.pari.nm.modules.imgmgmt.ImagePropertyCCOHelper.java

Source

/**
 * Copyright (c) 2009 Pari Networks, Inc.  All Rights Reserved.
 *
 * This software is the proprietary information of Pari Networks, Inc.
 *
 */

package com.pari.nm.modules.imgmgmt;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.log4j.Logger;

import com.pari.nm.gui.guiservices.PariException;

public class ImagePropertyCCOHelper {
    private static final Logger logger = Logger.getLogger(ImagePropertyCCOHelper.class);
    private static final Pattern valuePattern = Pattern.compile(".*<option.*selected.*>(.*)<.*");
    private static final Pattern featValuePattern = Pattern.compile(".*<A class=.*&featureId=.*>(.*)<.*");
    private static final Pattern minValuesPattern = Pattern.compile("\\s*([0-9]+)\\s*/\\s*([0-9]+).*");

    /**
     * populateImagePropertiesFromCCO
     * 
     * @param imageName
     *            imageName
     * 
     * @return DOCUMENT ME!
     * 
     * @throws PariException
     *             PariException
     */
    public static SoftwareImage populateImagePropertiesFromCCO(String imageName) throws PariException {
        // This URL need to be changed once NCCM use SWIM/BSD api provide by CCO.
        String url = "http://tools.cisco.com/ITDIT/CFN/jsp/Image.data?_dc=1360865397887&imageName=";
        url += imageName;
        // url += "&ostype=?platformid=&mrel=&release=&fsetid=&productCode=&page=1&start=0&limit=50";
        SoftwareImage image = new SoftwareImage();
        populateImagePropertiesFromCCOInternal(image, imageName, url, true, true);
        return image;
    }

    private static void populateImagePropertiesFromCCOInternal(SoftwareImage image, String imageName, String url,
            boolean populateVersion, boolean populatePforms) throws PariException {
        HttpClient httpClient = new HttpClient();
        GetMethod method = new GetMethod(url);
        method.setFollowRedirects(true);
        try {
            httpClient.executeMethod(method);

            int statuscode = method.getStatusCode();
            if (statuscode != HttpStatus.SC_OK) {
                throw new PariException(-1, "Unable to connect to cisco.com to get image properites for image: "
                        + imageName + " Status: " + method.getStatusText());
            }
            populateImagePropertiesFromHTTPOutput(method.getResponseBodyAsStream(), image, imageName,
                    populateVersion, populatePforms);
        } catch (PariException pex) {
            logger.error("Pari Exception while getting image properties for image: " + imageName, pex);
            throw pex;
        } catch (Exception ex) {
            logger.error("Exception while getting image properties for image: " + imageName, ex);
            throw new PariException(-1,
                    "Error while getting image properties from www.cisco.com for image: " + imageName);
        }
    }

    /**
     * populateImagePropertiesFromHTTPOutput
     * 
     * @param inputStream
     *            responseBodyAsString
     * @param image
     *            image
     * @param imageName
     *            imageName
     * @param populateVersion
     *            populateVersion
     * @param populatePforms
     *            populatePforms
     * 
     * @throws PariException
     *             PariException
     * @throws IOException
     */
    public static void populateImagePropertiesFromHTTPOutput(InputStream inputStream, SoftwareImage image,
            String imageName, boolean populateVersion, boolean populatePforms) throws PariException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        StringBuffer sb = new StringBuffer();
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line + "\n");
        }
        String lines[] = sb.toString().split("\\n");
        String pageType = getHTMLPageType(lines);
        if (pageType.equals("no_image")) {
            throw new PariException(-1, "Unable to obtain any information from www.cisco.com");
        }
        if (pageType.equals("illegal")) {
            throw new PariException(-1, "Unable to parse the output from www.cisco.com");
        }
        if (pageType.equals("table_type")) {
            populateImagePropsType1(lines, image, imageName);
            return;
        }
        if (pageType.equals("single_type")) {
            populateImagePropsType2(lines, image, populateVersion, populatePforms);
            return;
        }
        if (pageType.equals("single_record")) {
            populateImagePropsType3(lines, image, imageName);
        }
    }

    private static void populateImagePropsType2(String[] lines, SoftwareImage image, boolean populateVersion,
            boolean populatePforms) {
        boolean insideReleases = false;
        boolean insidePforms = false;
        boolean insideMinVals = false;
        String release = null;
        Set<String> pformSet = new LinkedHashSet<String>();
        Set<String> featSet = new LinkedHashSet<String>();
        int minRAM = -1;
        int minFlash = -1;
        Boolean deferred = false;
        Boolean psirt = false;
        for (String line : lines) {
            if (!insideReleases && populateVersion && (line.contains("All Releases"))) {
                insideReleases = true;
                insidePforms = false;
                insideMinVals = false;
                continue;
            }
            if (!insidePforms && populatePforms && line.contains("All Platforms")) {
                insidePforms = true;
                insideReleases = false;
                insideMinVals = false;
                continue;
            }
            if (!insideMinVals && line.contains("RAM / Min Flash")) {
                insideMinVals = true;
                insidePforms = false;
                insideReleases = false;
            }
            if (insideReleases && line.contains("selected")) {
                Matcher m = valuePattern.matcher(line);
                if (m.matches()) {
                    release = m.group(1).trim();
                    insideReleases = false;
                }
            }
            if (insidePforms && line.contains("selected")) {
                Matcher m = valuePattern.matcher(line);
                if (m.matches()) {
                    pformSet.add(m.group(1).trim());
                    insidePforms = false;
                }
            }
            if (insideMinVals) {
                Matcher m = minValuesPattern.matcher(line);
                if (m.matches()) {
                    String val1Str = m.group(1);
                    String val2Str = m.group(2);
                    try {
                        minRAM = Integer.parseInt(val1Str);
                    } catch (Exception ex) {
                    }
                    try {
                        minFlash = Integer.parseInt(val2Str);
                    } catch (Exception e) {
                    }
                    insideMinVals = false;
                }
            }
            if (line.toLowerCase().contains("deferred image")) {
                deferred = true;
            }
            if (line.toLowerCase().contains("has software advisories")) {
                psirt = true;
            }
            if (line.contains("featureId")) {
                Matcher m = featValuePattern.matcher(line);
                if (m.matches()) {
                    featSet.add(m.group(1).trim());
                    continue;
                }
            }
        }
        if ((release != null) && populateVersion && (image.getOsVersion() == null)) {
            image.setOsVersion(release);
        }
        if (populatePforms && (pformSet != null) && !pformSet.isEmpty()) {
            String[] existingPforms = image.getApplicablePlatforms();
            if (existingPforms != null) {
                for (String pf : existingPforms) {
                    pformSet.add(pf);
                }
            }
            image.setApplicablePlatforms(pformSet.toArray(new String[pformSet.size()]));
        }
        if ((featSet != null) && !featSet.isEmpty()) {
            String[] existingFeats = image.getFeatureList();
            if (existingFeats != null) {
                for (String f : existingFeats) {
                    pformSet.add(f);
                }
            }
            image.setFeatureList(featSet.toArray(new String[featSet.size()]));
        }
        if ((minRAM >= 0) && (image.getMinRAMSize() < 0)) {
            image.setMinRAMSize(minRAM);
        }
        if ((minFlash >= 0) && (image.getMinFlashSize() < 0)) {
            image.setMinFlashSize(minFlash);
        }

        image.setDeferred(deferred);
        image.setHasAdvisories(psirt);
    }

    private static void populateImagePropsType1(String[] lines, SoftwareImage image, String imageName)
            throws PariException {
        boolean insideTable = false;
        boolean insideCorrectTable = false;
        boolean insideTr = false;
        boolean insideTd = false;
        int releaseCol = -1;
        int pformCol = -1;
        int currentCol = 0;
        boolean pformFound = false;
        boolean rlsFound = false;
        Set<String> pformSet = new HashSet<String>();
        String nextLink = null;
        for (String line : lines) {
            String lowerLine = line.toLowerCase();
            if ((nextLink == null) && lowerLine.contains("href") && line.contains(imageName)) {
                Pattern p = Pattern.compile(".*<A .*HREF=\"(.*Dispatch.*HDDMPlatFamDet.*)\">.*</A>.*");
                Matcher m = p.matcher(line);
                if (m.matches()) {
                    nextLink = m.group(1);
                    if (nextLink.startsWith("/")) {
                        nextLink = "http://tools.cisco.com" + nextLink;
                    } else {
                        nextLink = "http://tools.cisco.com/" + nextLink;
                    }
                }

            }
            if (!insideTable) {
                if (lowerLine.contains("<table")) {
                    if (!lowerLine.matches(".*/.*table>")) {
                        insideTable = true;
                    }
                }
                continue;
            } else {
                if (lowerLine.contains("</table")) {
                    insideTable = false;
                    if (insideCorrectTable) {
                        break;
                    }
                    insideTr = false;
                    insideTd = false;
                    currentCol = -1;
                    continue;
                }
                if (!insideTr) {
                    if (lowerLine.contains("<tr")) {
                        if (!lowerLine.matches(".*/.*tr>")) {
                            insideTr = true;
                            currentCol = -1;
                        }
                    }
                    continue;
                } else {
                    if (lowerLine.contains("</tr")) {
                        insideTr = false;
                        insideTd = false;
                        currentCol = -1;
                        continue;
                    }
                    if (!insideTd) {
                        if (lowerLine.contains("<td")) {
                            currentCol++;
                            if (line.contains("Release")) {
                                releaseCol = currentCol;
                                rlsFound = true;
                            }
                            if (line.contains("Platform")) {
                                pformCol = currentCol;
                                pformFound = true;
                            }
                            if (!lowerLine.matches(".*\\/.*td>")) {
                                insideTd = true;
                            }
                        }
                    } else {
                        if (lowerLine.contains("</td")) {
                            if (lowerLine.matches(".*/td>.*<td.*")) {
                                insideTd = true;
                                currentCol++;
                            } else {
                                insideTd = false;
                            }
                        } else if (insideCorrectTable) {
                            if (currentCol == releaseCol) {
                                if (!(image != null && image.getOsName() != null
                                        && image.getOsName().equals("IOS-XE") && image.getOsVersion() != null)) {
                                    image.setOsVersion(line.trim());
                                }
                            } else if (currentCol == pformCol) {
                                pformSet.add(line.trim().toLowerCase());
                            }
                        }
                        if (line.contains("Release")) {
                            releaseCol = currentCol;
                            rlsFound = true;
                        }
                        if (line.contains("Platform")) {
                            pformCol = currentCol;
                            pformFound = true;
                        }
                    }
                    if (rlsFound && pformFound) {
                        insideCorrectTable = true;
                    }
                }
            }
        }
        if (!pformSet.isEmpty()) {
            image.setApplicablePlatforms(pformSet.toArray(new String[pformSet.size()]));
        }
        if (nextLink != null) {
            populateImagePropertiesFromCCOInternal(image, imageName, nextLink, false, false);
        }
    }

    // Pasrsing CCO output(From Feature Navigator ) : {"totalCount":
    // "1","imageList":{"image":[{"imageId":1577323,"image":"c3750-ipbasek9-mz.122-53.SE1.bin","platformId":"217","releaseId":"30589","platform":"CAT3750",
    /*
     * "trainName":"12.2SE","featureSetId":"448","featureSet":"IP BASE","dram":"128","flash":"16","productCode":"null",
     * "releaseNumber":"12.2(53)SE1","softwareType":"null","deploymentStatus":"ED","osType":"IOS",
     * "baseImageName":"c3750-ipbasek9-mz"
     * ,"orderable":"false","swAdvised":"true","swDeffered":"false","defferedUrl":"null",
     * "swAdvUrl":"http:\/\/www.cisco.com\/web\/software\/DefTracker\/280805679\/SA\/ac104481.html",
     * "swUnavailable":"false","swLicensed":"false","eolStatus":"false"}]}}
     */
    private static void populateImagePropsType3(String[] lines, SoftwareImage image, String imageName)
            throws PariException {

        String line;
        if (lines.length > 0) {
            line = lines[0];
        } else {
            logger.error("Pari Exception while populating Image properties for image: " + imageName);
            throw new PariException(-1, "Pari Exception while populating Image properties for image: " + imageName);
        }

        String imageDets = line.substring(line.indexOf("[") + 1, line.indexOf("]"));
        imageDets = imageDets.substring(imageDets.indexOf("{") + 1, imageDets.indexOf("}"));
        StringTokenizer st = new StringTokenizer(imageDets, ",");
        while (st.hasMoreElements()) {
            String token = (String) st.nextElement();
            String value;
            if (token.contains("osType")) {
                value = token.substring(token.indexOf(":") + 2, token.lastIndexOf("\""));
                image.setOsName(value);
            } else if (token.contains("releaseNumber")) {
                value = token.substring(token.indexOf(":") + 2, token.lastIndexOf("\""));
                image.setOsVersion(value);
            } else if (token.contains("dram")) {
                value = token.substring(token.indexOf(":") + 2, token.lastIndexOf("\""));
                image.setMinRAMSize(Long.valueOf(value));
            } else if (token.contains("flash")) {
                value = token.substring(token.indexOf(":") + 2, token.lastIndexOf("\""));
                image.setMinFlashSize(Long.valueOf(value));
            } else if (token.contains("platform")) {
                value = token.substring(token.indexOf(":") + 2, token.lastIndexOf("\""));
                String[] applicablePlatforms = { value };
                image.setApplicablePlatforms(applicablePlatforms);
            } else if (token.contains("swAdvised")) {
                value = token.substring(token.indexOf(":") + 2, token.lastIndexOf("\""));
                image.setHasAdvisories(Boolean.valueOf(value));
            } else if (token.contains("swDeffered")) {
                value = token.substring(token.indexOf(":") + 2, token.lastIndexOf("\""));
                image.setDeferred(Boolean.valueOf(value));
            } else if (token.contains("baseImageName")) {
                value = token.substring(token.indexOf(":") + 2, token.lastIndexOf("\""));
                image.setBuildName(value);
            } else if (token.contains("featureSet")) {
                value = token.substring(token.indexOf(":") + 2, token.lastIndexOf("\""));
                String[] featureList = { value };
                image.setFeatureList(featureList);
            }

        }

    }

    private static String getHTMLPageType(String[] lines) {
        boolean insideTd = false;
        boolean imageNameFound = false;
        boolean releaseFound = false;
        boolean platformFound = false;
        for (String line : lines) {
            /*
             * {"totalCount":
             * "1","imageList":{"image":[{"imageId":1577323,"image":"c3750-ipbasek9-mz.122-53.SE1.bin","platformId"
             * :"217","releaseId":"30589",
             * "platform":"CAT3750","trainName":"12.2SE","featureSetId":"448","featureSet":"IP BASE"
             * ,"dram":"128","flash":"16","productCode":"null",
             * "releaseNumber":"12.2(53)SE1","softwareType":"null","deploymentStatus"
             * :"ED","osType":"IOS","baseImageName":"c3750-ipbasek9-mz","orderable":"false",
             * "swAdvised":"true","swDeffered":"false","defferedUrl":"null","swAdvUrl":
             * "http:\/\/www.cisco.com\/web\/software\/DefTracker\/280805679\/SA\/ac104481.html",
             * "swUnavailable":"false", "swLicensed":"false","eolStatus":"false"}]}}
             */
            if (line.contains("[") && line.contains("]") && line.contains("image")) {
                return "single_record";
            }
            if (line.contains("The Image Name you entered does not match") || line.contains("No records found")) {
                return "no_image";
            }
            if (line.contains("Your Selections:")) {
                return "single_type";
            }
            if (line.matches(".*<td.*")) {
                if (line.contains("Image Name")) {
                    imageNameFound = true;
                } else if (line.contains("Release")) {
                    releaseFound = true;
                } else if (line.contains("Platform")) {
                    platformFound = true;
                }
                if (!line.matches("/.*>")) {
                    insideTd = true;
                }
            } else if (insideTd) {
                if (line.contains("Image Name")) {
                    imageNameFound = true;
                } else if (line.contains("Release")) {
                    releaseFound = true;
                } else if (line.contains("Platform")) {
                    platformFound = true;
                }
                if (line.matches("/.*>")) {
                    insideTd = false;
                }
            }
            if (imageNameFound && releaseFound && platformFound) {
                return "table_type";
            }
        }
        return "illegal";
    }
}