Sunday, September 11, 2016

Python parse xml


import sys
import xml.etree.ElementTree as ET

class XmlParser:
    def fixAttrs(self, attrs, c):
        nattrs = {}
        for attr in attrs:
            nattrs[self.buildXmlnsKey(attr, c)] = attrs[attr]
        return nattrs

    def buildXmlnsKey(self, tagtxt, tcounter):
        done = False
        if not tagtxt.startswith("{"):
            return tagtxt
        #print 'Search for: ', tagtxt, ' in ', tcounter
        if self.nsmap.has_key(str(tcounter)):
            nslmap = self.nsmap[str(tcounter)]
            #print 'nslmap-->', nslmap
            for obj in nslmap:
                if done is False:
                    for key in obj.keys():
                        kstr = '{' + key + '}'
                        #print 'key--->', key, ', --->', kstr
                        if tagtxt.startswith(kstr) and done is False:
                            done = True
                            kval = obj[key]
                            #print 'need to replace to: ', kval
                            if len(kval):
                                tagtxt = tagtxt.replace(kstr, kval+':', 1)
                            else:
                                tagtxt = tagtxt.replace(kstr, '', 1)

        if done is False and tcounter > 0:
            tcounter = tcounter - 1
            return self.buildXmlnsKey(tagtxt, tcounter)
        return tagtxt
                        

    def xmlToDict(self, node, dictclass = None):
        if dictclass is None:
            dictclass = {}
        self.ncounter = self.ncounter + 1
        if len(node):        
            if node.attrib:
                #print node.attrib
                dictclass['<<attr>>'] = self.fixAttrs(node.attrib, self.ncounter);            
            for child in node:
                tagtxt = self.buildXmlnsKey(child.tag, self.ncounter)
                newItem = self.xmlToDict(child)
                #tagtxt = child.tag
                if dictclass.has_key(tagtxt):
                    if type(dictclass[tagtxt]) is type([]):
                        dictclass[tagtxt].append(newItem)
                    else:
                        oldItem = dictclass[tagtxt];
                        dictclass[tagtxt] = [];
                        dictclass[tagtxt].append(oldItem);
                        dictclass[tagtxt].append(newItem);
                else:
                    dictclass[tagtxt] = newItem
        else:
            if node.text is None:
                text = ''
            else:
                text = node.text.strip()

            
            if node.attrib:
                #print fixAttrs(node.attrib, ncounter)
                dictclass['<<attr>>'] = self.fixAttrs(node.attrib, self.ncounter)
                dictclass['<<value>>'] = text;
            else:
                dictclass = text;

        return dictclass

    def printDic(self, dic, pos = None):
        if pos is None:
            pos = 0
        for key in dic.keys():
            #print 'key--->', key
            if dic[key] is None:
                print self.getLenStr(pos), key, ''
            elif type(dic[key]) is type({}):
                npos = pos + 1
                print self.getLenStr(pos) + str(key), '{'
                self.printDic(dic[key], npos)
                print self.getLenStr(pos) + '}'
            elif type(dic[key]) is type([]):
                npos = pos + 1
                print self.getLenStr(pos) + str(key), '['
                self.printList(dic[key], npos)
                print self.getLenStr(pos) + ']'
            else:
                print self.getLenStr(pos) + str(key), ': ', dic[key]

    def printList(self, dic, pos = None):
        if pos is None:
            pos = 0
        lindex = -1
        for obj in dic:
            lindex = lindex + 1            
            if obj is not None:
                if type(obj) is type({}):
                    print self.getLenStr(pos) + str(lindex)+'. {'
                    npos = pos + 1
                    self.printDic(obj, npos)
                    print self.getLenStr(pos) + '}'
                elif type(obj) is type([]):
                    print self.getLenStr(pos) + str(lindex)+'. ['
                    npos = pos + 1
                    self.printList(obj, npos)
                    print self.getLenStr(pos) +']'
                else:
                    print self.getLenStr(pos), str(lindex)+'.', obj

    def getLenStr(self, pos):
        sstr = ''
        while pos > 0:
            sstr = sstr + '   '
            pos = pos - 1
        return sstr

    def __init__(self, fileLocation):
        self.location = fileLocation;

    def parse(self):
        tree = ET.parse(self.location)
        root = tree.getroot()
        self.nsmap = {}
        self.lcounter = 0

        for event, elem in ET.iterparse(self.location, events=('start', 'end', 'start-ns', 'end-ns')):
            if event == 'start-ns':
                #print 'start-ns', lcounter
                a, b = elem
                if b is not None and len(b):
                    #print "A-->", a, ", B-->" , b
                    scounter = self.lcounter + 0
                    if not self.nsmap.has_key(str(scounter)):
                        self.nsmap[str(scounter)] = []
                        self.nsmap[str(scounter)].append({'http://www.w3.org/XML/1998/namespace': 'xml'});
                    self.nsmap[str(scounter)].append({b: str(a)})
            elif event == 'start':
                #print 'start', lcounter
                if not self.nsmap.has_key(str(self.lcounter)) and self.nsmap.has_key(str(self.lcounter - 1)):
                    #print 'exist: ', nsmap[str(lcounter - 1)]
                    self.nsmap[str(self.lcounter)] = self.nsmap[str(self.lcounter - 1)];
                self.lcounter = self.lcounter + 1       

        self.ncounter = 0
        self.dic = self.xmlToDict(root)
        self.dic = {self.buildXmlnsKey(root.tag, 0): self.dic}
        return self.dic;

if __name__ == "__main__":
    xmlObj = XmlParser('xml7.xml');
    theXmlDictionary = xmlObj.parse()
    xmlObj.printDic(theXmlDictionary);

Suppose you have the xml as file:


<?xml version="1.0"?>
<lib:library
    xmlns:lib="http://eric.van-der-vlist.com/ns/library"
    xmlns:hr="http://eric.van-der-vlist.com/ns/person">
    <lib:book id="b0836217462" available="true">
        <lib:isbn>0836217462</lib:isbn>
        <lib:title xml:lang="en">Being a Dog Is a Full-Time Job</lib:title>
        <hr:author id="CMS">
            <hr:name>Charles M Schulz</hr:name>
            <hr:born>1922-11-26</hr:born>
            <hr:dead>2000-02-12</hr:dead>
        </hr:author>
        <lib:character id="PP">
            <hr:name>Peppermint Patty</hr:name>
            <hr:born>1966-08-22</hr:born>
            <lib:qualification>bold, brash and tomboyish</lib:qualification>
        </lib:character>
        <lib:character id="Snoopy">
            <hr:name>Snoopy</hr:name>
            <hr:born>1950-10-04</hr:born>
            <lib:qualification>extroverted beagle</lib:qualification>
        </lib:character>
        <lib:character id="Schroeder">
            <hr:name>Schroeder</hr:name>
            <hr:born>1951-05-30</hr:born>
            <lib:qualification>brought classical music to the Peanuts strip</lib:qualification>
        </lib:character>
        <lib:character id="Lucy">
            <hr:name>Lucy</hr:name>
            <hr:born>1952-03-03</hr:born>
            <lib:qualification>bossy, crabby and selfish</lib:qualification>
        </lib:character>
    </lib:book>
    <Purchase>
        <PurchaseId>AAAAA</PurchaseId>
        <PurchaseType>ONLINE</PurchaseType>
    </Purchase>
    <Purchase>
        <PurchaseId>BBBBB</PurchaseId>
        <PurchaseType>OFFLINE</PurchaseType>
    </Purchase>
    <Purchase paid='True'>
        <Purchase age='30'>
            <Purchase>HMM 1</Purchase>
            <Purchase>HMM 2</Purchase>
        </Purchase>
    </Purchase>
</lib:library>

Output would be like this:

lib:library {
   Purchase [
      0. {
         PurchaseId :  AAAAA
         PurchaseType :  ONLINE
      }
      1. {
         PurchaseId :  BBBBB
         PurchaseType :  OFFLINE
      }
      2. {
         <<attr>> {
            paid :  True
         }
         Purchase {
            <<attr>> {
               age :  30
            }
            Purchase [
                0. HMM 1
                1. HMM 2
            ]
         }
      }
   ]
   lib:book {
      hr:author {
         <<attr>> {
            id :  CMS
         }
         hr:name :  Charles M Schulz
         hr:born :  1922-11-26
         hr:dead :  2000-02-12
      }
      <<attr>> {
         available :  true
         id :  b0836217462
      }
      lib:title {
         <<attr>> {
            xml:lang :  en
         }
         <<value>> :  Being a Dog Is a Full-Time Job
      }
      lib:isbn :  0836217462
      lib:character [
         0. {
            <<attr>> {
               id :  PP
            }
            hr:name :  Peppermint Patty
            hr:born :  1966-08-22
            lib:qualification :  bold, brash and tomboyish
         }
         1. {
            <<attr>> {
               id :  Snoopy
            }
            hr:name :  Snoopy
            hr:born :  1950-10-04
            lib:qualification :  extroverted beagle
         }
         2. {
            <<attr>> {
               id :  Schroeder
            }
            hr:name :  Schroeder
            hr:born :  1951-05-30
            lib:qualification :  brought classical music to the Peanuts strip
         }
         3. {
            <<attr>> {
               id :  Lucy
            }
            hr:name :  Lucy
            hr:born :  1952-03-03
            lib:qualification :  bossy, crabby and selfish
         }
      ]
   }
}

Friday, September 9, 2016

An educational story according to workers & managers in an organization

এক দেশে ছিলো এক পিপড়া। সে প্রতিদিন ৯টায় অফিসে ঢুকতো। তারপর কারো সঙ্গে সময় নষ্ট না করে সঙ্গে সঙ্গে কাজে বসে যেত।
সে যে পরিমাণ কাজ করত, তাতে কোম্পানির উৎপাদন হতো প্রচুর এবং এর ফলে সে আনন্দের সঙ্গেই জীবন নির্বাহ করত।
ওই অফিসের সিইও সিংহ অবাক হয়ে দেখত, এই পিঁপড়াটি কোনো ধরনের সুপারভিশন ছাড়াই প্রচুর কাজ করছে। সিংহ ভাবল, পিঁপড়াকে যদি কারও সুপারভিশনে দেওয়া হয়, তাহলে সে আরও বেশি কাজ করতে পারবে।
কয়েক দিনের মধ্যেই সিংহ একটি তেলাপোকাকে পিঁপড়ার সুপারভাইজার হিসেবে নিয়োগ দিল। সুপারভাইজার হিসেবে এই তেলাপোকাটির ছিল দীর্ঘদিনের অভিজ্ঞতা, আর সে দুর্দান্ত রিপোর্ট লিখতে পারত।
তেলাপোকাটি প্রথমেই সিদ্ধান্ত নিল, এই অফিসে একটি অ্যাটেনডেন্স সিস্টেম থাকা উচিত।
কয়েক দিনের মধ্যেই তেলাপোকার মনে হলো, তার একজন সেক্রেটারি দরকার, যে তাকে রিপোর্ট লিখতে সাহায্য করবে। … সে একটা মাকড়সাকে নিয়োগ দিল এই কাজে যে সব ফোনকল মনিটর করবে, আর নথিপত্র রাখবে।
সিংহ খুব আনন্দ নিয়ে দেখল যে তেলাপোকা তাকে প্রতিদিনের কাজের হিসাব দিচ্ছে আর সেগুলো বিশ্লেষণ করছে গ্রাফের মাধ্যমে। ফলে খুব সহজেই উৎপাদনের ধারা সম্পর্কে ধারণা নেওয়া যাচ্ছে এবং সিংহ সেগুলো বোর্ড মিটিংয়ে ‘প্রেজেন্টেশন’ আকারে পেশ করে বাহবা পাচ্ছে।
কিছুদিনের মধ্যেই তেলাপোকার একটি কম্পিউটার ও লেজার প্রিন্টার প্রয়োজন হলো এবং এগুলো দেখভালের জন্য আইটি ডিপার্টমেন্ট গঠন করল। আইটি বিশেষজ্ঞ হিসেবে নিয়োগ পেল মাছি।
আমাদের কর্মী পিঁপড়া, যে প্রতিদিন অফিসে এসে প্রচুর কাজ করে মনের সুখে গান গাইতে গাইতে বাসায় ফিরত, তাকে এখন প্রচুর পেপার ওয়ার্ক করতে হয়, সপ্তাহের চার দিনই নানা মিটিংয়ে হাজিরা দিতে হয়।
নিত্যদিন এসব ঝামেলার কারণে কাজে ব্যাঘাত ঘটায় উৎপাদন কমতে লাগল, আর সে বিরক্ত হতে লাগল।
সিংহ সিদ্ধান্ত নিল, পিঁপড়া যে বিভাগে কাজ করে, সেটাকে একটা আলাদা ডিপার্টমেন্ট ঘোষণা করে সেটার একজন ডিপার্টমেন্ট প্রধান নিয়োগ দেওয়ার এটাই উপযুক্ত সময়।
সিংহ ঝিঁঝিপোকাকে ওই ডিপার্টমেন্টের প্রধান হিসেবে নিয়োগ দিল। ঝিঁঝিপোকা প্রথম দিন এসেই তার রুমের জন্য একটা আরামদায়ক কার্পেট ও চেয়ারের অর্ডার দিল।
কয়েক দিনের মধ্যেই অফিসের জন্য স্ট্র্যাটেজিক প্ল্যান তৈরি করতে ঝিঁঝি পোকার একটি কম্পিউটার ও ব্যক্তিগত সহকারীর প্রয়োজন হলো। কম্পিউটার নতুন কেনা হলেও ব্যক্তিগত সহকারী হিসেবে ঝিঁঝিপোকা নিয়োগ দিল তার পুরোনো অফিসের একজনকে।
পিঁপড়া যেখানে কাজ করে, সেখানে আগে ছিল চমৎকার একটা পরিবেশ। এখন সেখানে কেউ কথা বলে না, হাসে না। সবাই খুব মনমরা হয়ে কাজ করে।
ঝিঁঝিপোকা পরিস্থিতি উন্নয়নে সিংহকে বোঝাল, ‘অফিসে কাজের পরিবেশ’ শীর্ষক একটা স্টাডি খুব জরুরি হয়ে পড়েছে।
পর্যালোচনা করে সিংহ দেখতে পেল, পিঁপড়ার বিভাগে উৎপাদন আগের তুলনায় অনেক কমে গেছে।
কাজেই সিংহ কয়েক দিনের মধ্যেই স্বনামখ্যাত কনসালট্যান্ট পেঁচাকে অডিট রিপোর্ট এবং উৎপাদন বাড়ানোর উপায় বাতলে দেওয়ার জন্য নিয়োগ দিল।
পেঁচা তিন মাস পিঁপড়ার ডিপার্টমেন্ট মনিটর করল, সবার সঙ্গে ওয়ান টু ওয়ান কথা বলল। তারপর বেশ মোটাসোটা একটা রিপোর্ট পেশ করল সিংহের কাছে। ওই রিপোর্টের সারমর্ম হলো, এই অফিসে প্রয়োজনের তুলনায় কর্মী বেশি। কর্মী ছাঁটাই করা হোক।
পরের সপ্তাহেই বেশ কয়েকজন কর্মী ছাঁটাই করা হলো। বলুন তো, কে সর্বপ্রথম চাকরি হারাল?
ওই হতভাগ্য পিঁপড়া। কারণ, পেঁচার রিপোর্টে লেখা ছিল, ‘এই কর্মীর মোটিভেশনের ব্যাপক অভাব রয়েছে এবং সর্বদাই নেতিবাচক আচরণ করছে, যা অফিসের কর্মপরিবেশ নষ্ট করছে।
এবার ভাবুন তো, আপনার পজিশানটা কী আপনার অর্গানাইজেশনে?

( সংগৃহীতঃ বিদেশি গল্পের অবলম্বনে )



Sunday, August 21, 2016

Common tasks to increase internet speed on windows


  • Disable auto update your operating system. For windows go to "Control Panel/Windows Update" and turn off auto update.
  • Uninstall unnecessary toolbar like Ask Toolbar, iLivid etc.
  • Go to "start menu" and type "run" in search box and select "run". Then type "gpedit.msc" in "run" box and type enter. Now go to "Computer Configuration/Administrative Templates/Network". Now double click on "QoS Packet Scheduler". Again double click on "Limit reservable bandwidth". After open the dialog enable "Bandwidth limit" and set value as "0". Restart your computer and start use.

Thursday, August 11, 2016

Groovy call a closure with parameters

Closure closureTest = { def args1 = null, def args2 = null ->
    /* do something you wish */
}

/* Call above closure as like: */
closureTest.call() /* It will pass args1 & args2 both null */
closureTest("value_args1") /* It will pass args2 null */
closureTest(null, "value_args2") /* It will pass args1 null */
closureTest("value_args1", "value_args2") /* It will pass both args1 & args2 value */

/* You can check number of parameters accept by a closure as like: */
closureTest.maximumNumberOfParameters

Wednesday, August 3, 2016

Grails track hibernate transaction begin, flush, commit and rollback status

Package: org.springframework.orm.hibernate4
Class: HibernateTransactionManager

Hibernate evict an persistent object from hibernate session

package com.pkm.evict_entity

import grails.util.Holders
import org.hibernate.SessionFactory

/**
 * Created by pritom on 3/08/2016.
 */
class EvictEntityInstance {
    public static void _evict(def domainInstance) {
        getBean(SessionFactory).currentSession.evict(domainInstance)
    }

    public static <T> T getBean(Class<T> requiredType) {
        try {
            return Holders.applicationContext.getBean(requiredType)
        }
        catch (Exception e) {
            return null
        }
    }
}

Monday, August 1, 2016

Salesforce PDF Viewer with custom PDF page

1. First create a apex class with following contents:

global with sharing class QuoteCustomPdfGenerator {
    private ApexPages.StandardController sc;
    public Quote q {get; private set;}
    public String id {get; private set;}

    public QuoteCustomPdfGenerator(ApexPages.StandardController controller) {
        this.sc = sc;
        this.id = ApexPages.currentPage().getParameters().get('Id');
        this.q = [SELECT Id,Name From Quote WHERE Id=:this.id];
    }
    
    public PageReference viewPdf() {
        return null;
    }

    webService static String createQuotePdf(String Id) {
        try {
            PageReference pageRef = new PageReference('/apex/QuoteCustomPdfView?Id='+Id);
            Blob content = pageRef.getContent();
            QuoteDocument doc = new QuoteDocument(Document = content, QuoteId = Id);
            insert doc;

            return 'SUCCESS';
        } 
        catch(exception ex) {
           System.debug('--- Error ----------'+ ex);
           return ex.getMessage();
        }
    }
}

2. Now create a visualforce page with following contents (Name of visualforce page="QuoteCustomPdfView"):

<apex:page standardController="Quote" extensions="QuoteCustomPdfGenerator" action="{!viewPdf}" renderAs="pdf">
    This is my custom pdf for the quote=[[{!q.Name}]]
</apex:page>

3. Create a local js file with following contents:

function SaveQuoteAsCustomPDF(quoteId) {
    try {
        var res = sforce.apex.execute("QuoteCustomPdfGenerator","createQuotePdf",{Id : quoteId});
        if(res=='SUCCESS') {
            window.location.reload();
        }
        else {
            alert('Error in attaching file ----'+ res);
        }
    }
    catch(er) {
        alert(er);
    }
}

4. Upload the js file in static resource section with name = "SaveQuoteAsCustomPDF".
5. After upload done click on view and copy the url from browser.
6. Now create a custom button under Quote section in setup with following configurations
6.1: "Display Type" = "Detail Page"
6.2: "Behavior" = "Execute JavaScript"
6.3: "Content Source" = "OnClick JavaScript"
6.4: Put the following contents in the box below:

{!REQUIRESCRIPT("/soap/ajax/24.0/connection.js")}
{!REQUIRESCRIPT("/soap/ajax/24.0/apex.js")}
{!REQUIRESCRIPT("/resource/1470022474000/SaveQuoteAsCustomPDF")} /* Location from step 5 */

var pdfOverlay = QuotePDFPreview.quotePDFObjs['quotePDFOverlay'];
pdfOverlay.dialog.buttonContents = '<input value=\"Save Quote As PDF\"  class=\"btn\" name=\"save\" onclick=\"SaveQuoteAsCustomPDF(\'{!Quote.Id}\');\" title=\"Save Quote As PDF\" type=\"button\" /><input value=\"Close\"  class=\"btn\" name=\"cancel\" onclick=\"QuotePDFPreview.getQuotePDFObject(\'quotePDFOverlay\').close();\" title=\"Close\" type=\"button\" />';

pdfOverlay.setSavable(true);
pdfOverlay.setPDFContents('/apex/QuoteCustomPdfView?Id={!Quote.Id}',null,null);
pdfOverlay.display();

7. Add the button in quote page layout.
8. View details of a quote & click the button you added on step 7.