Patent Fetcher Button

    {info} This button functions within the Markush data infrastructure. When the button is placed on an Inventions form, it will fetch all the patents associated with the selected invention. From there, it determines the master patent and offers to launch the webpage associated with the patent, or providing a combination of patent websites and patents from the invention. It also provides links to a variety of patent repositories for other countries.

    This script is a good example of using SwingBuilder and GridBagLayout to make clean input pop-ups. This button is on a query form, a dataTree with the necessary table containing the invention information as a secondary child (VMNS is a child of Query/root and Inventions is a child of VMNS). This is also a nice example for finding and using nested child tables.

    /** Patent Fetcher
    
    *
    
    * Usage: Button on a Query form in the Markush Demo Data set, which has the edges of VMNS and then Inventions.
    
    * It can be adapted to other dataTrees by locating the Inventions table among the dataTree
    
    *
    
    * @author Erin Bolstad (ebolstad@chemaxon.com)
    
    * Dec 2011
    
    */
    
    import java.awt.Desktop
    
    import com.im.commons.progress.*
    
    import groovy.swing.SwingBuilder
    
    import javax.swing.SwingUtilities
    
    evaluate = { widget ->
    
     if (SwingUtilities.isEventDispatchThread()) {
    
     Thread.start() {
    
     evaluateImpl(widget)
    
     }
    
     } else {
    
     evaluateImpl(widget)
    
     }
    
    }
    
    evaluateImpl = { widget ->
    
     def rs = widget.form.resultSet
    
     def dataTree = rs.getDataTree()
    
     def VMNSvertex = dataTree.rootVertex.edges.find { it.destination.entity.name == 'VMNS' }
    
     def inventionVertex = VMNSvertex.destination.edges.find { it.destination.entity.name == 'Inventions' }
    
     def inventionEty = inventionVertex.destination.entity
    
     def inventionPatentFld = inventionEty.fields.items.find { it.name == 'Patents' }
    
     def invenV = inventionVertex.getDestination()
    
     def invenVS = rs.getVertexState(invenV)
    
     def invenIds = invenVS.selectedRowsIds
    
     def invenFirstId = invenIds.get(0)
    
     def invenGetData = invenVS.getData([invenFirstId], DFEnvironmentRO.DEV_NULL)
    
     def patArray = invenGetData[invenFirstId][inventionPatentFld.id]
    
     def patMaster = patArray.replace("*", "master")
    
     def patentArray = patMaster.split("\\r?\\n")
    
     patArray = ["-"]
    
     patentArray.eachWithIndex { num, m ->
    
     def trimLocation = num.indexOf("-")
    
     def patentTrimmed = num.subSequence(0, trimLocation)
    
     patArray.add(patentTrimmed)
    
     if (num.contains("master")){
    
     MASTER_PATENT = num
    
     }
    
     }
    
     // Clean the master patent
    
     def masterRemoved = MASTER_PATENT.replace("master", "")
    
     def blanksRemoved = masterRemoved.replace(" ", "")
    
     MASTER_PATENT = blanksRemoved
    
     // master patent now to be matched against resource
    
     def patentToTrim = MASTER_PATENT
    
     def patentAssignment = MASTER_PATENT.substring(0, 2)
    
     switch (patentAssignment) {
    
     case "WO":
    
     def trimLocation = patentToTrim.indexOf("-")
    
     def patentTrimmed = patentToTrim.subSequence(0, trimLocation)
    
     LEAD = "http://www.wipo.int/patentscope/search/en/detail.jsf?docId=" + patentTrimmed
    
     break
    
     case "US":
    
     def trimLocation = patentToTrim.indexOf("-")
    
     def endTrimmed = patentToTrim.subSequence(0, trimLocation)
    
     def patentLength = endTrimmed.length()
    
     def patentTrimmed = endTrimmed.subSequence(2, patentLength)
    
     LEAD = "http://www.patentlens.net/patentlens/patents.html?patnums=US_" + patentTrimmed + "&returnTo=patentnumber.html" + patentTrimmed
    
     break
    
     default:
    
     def trimLocation = patentToTrim.indexOf("-")
    
     def patentTrimmed = patentToTrim.subSequence(0, trimLocation)
    
     LEAD = "http://worldwide.espacenet.com/searchResults?DB=EPODOC&submitted=true&locale=en_EP&ST=singleline&compact=false&DB=EPODOC&query=" + patentTrimmed
    
     break
    
     }
    
     def s = new SwingBuilder()
    
     s.setVariable('myDialog-properties',[:])
    
     def vars = s.variables
    
     patentToTrim = MASTER_PATENT
    
     def trimLocation = patentToTrim.indexOf("-")
    
     def leadButton = patentToTrim.subSequence(0, trimLocation)
    
     def dial = s.dialog(title:'Patent Selection',id:'myDialog',modal:true) {
    
     panel() {
    
     gridBagLayout()
    
     label (text:"Retrieve the lead patent using our best guess to the location:", constraints:gbc(
    
     gridx:0,
    
     gridy:0,
    
     insets:[10,20,10,0]))
    
     button (id:'lead', label:"Lead Patent: $leadButton", constraints:gbc(
    
     gridx:1,
    
     gridy:0,
    
     insets:[10,0,10,20],
    
     anchor:LINE_START),
    
     actionPerformed: {
    
     vars.buttonResult = 'lead'
    
     dispose()})
    
     label(text:"---", constraints:gbc(
    
     gridy:1,
    
     gridwidth:2))
    
     label(text:"Or, select the patent from the invention to view, and the web location", constraints:gbc(
    
     gridy:2,
    
     gridwidth:2,
    
     insets:[10,0,0,0]))
    
     label(text:"Some sites only work with patents from certain countries.", constraints:gbc(
    
     gridy:3,
    
     gridwidth:2,
    
     insets:[0,0,10,0]))
    
     label(text:"Select patent", constraints:gbc(
    
     gridx:0,
    
     gridy:4,
    
     anchor:LINE_END))
    
     comboBox(id:'patents', items:patArray, constraints:gbc(
    
     gridx:1,
    
     gridy:4,
    
     anchor:LINE_START))
    
     label(text:"Select patent repository", constraints:gbc(
    
     gridx:0,
    
     gridy:5,
    
     insets:[0,0,10,0],
    
     anchor:LINE_END))
    
     comboBox(id:'patentLoc', items:['-', 'EP Patent Register', 'PatentScope (WIPO)', 'PatentLens'], constraints:gbc(
    
     gridx:1,
    
     gridy:5,
    
     insets:[0,0,10,0],
    
     anchor:LINE_START))
    
     button(id:'search', label:"Search Patent/Location Combo", constraints:gbc(
    
     gridx:0,
    
     gridy:6,
    
     insets:[0,0,10,0],
    
     anchor:LINE_END),
    
     actionPerformed: {
    
     vars.buttonResult = 'search'
    
     dispose()})
    
     button(id:'cancel', label:"Cancel", constraints:gbc(
    
     gridx:1,
    
     gridy:6,
    
     anchor:LINE_START,
    
     insets:[0,0,10,0]),
    
     actionPerformed: {
    
     vars.buttonResult = 'cancel'
    
     dispose()})
    
     label(text:"---", constraints:gbc(
    
     gridy:7,
    
     gridwidth:2))
    
     label(text:"Some patent sites block external programs, or are not used often.", constraints:gbc(
    
     gridy:8,
    
     gridwidth:2,
    
     insets:[10,0,0,0]))
    
     label(text:"Jump to the country specific patent websites using the menu below.", constraints:gbc(
    
     gridy:9,
    
     gridwidth:2,
    
     insets:[0,0,10,0]))
    
     comboBox(id:'othersites', items:['-', 'JP: IDPL', 'CA: CIPO', 'AU: AusPat', 'KR: Korea', 'HK: PatentSearch', 'TW: Taiwan IPO', 'SG: IPOS', 'DE: DPMA', 'RU: FIPS', 'ID: IPDL'], constraints:gbc(
    
     gridx:0,
    
     gridy:10,
    
     insets:[0,0,10,0],
    
     anchor:LINE_END))
    
     button(id:'otherok', label:"Go To Site", constraints:gbc(
    
     gridx:1,
    
     gridy:10,
    
     insets:[0,0,10,0],
    
     anchor:LINE_START),
    
     actionPerformed: {
    
     vars.buttonResult = 'otherok'
    
     dispose()})
    
     }
    
     }
    
     dial.pack()
    
     dial.setLocationRelativeTo(null)
    
     dial.show()
    
     chosenAction = vars.buttonResult
    
     switch (chosenAction) {
    
     case "cancel":
    
     return
    
     break
    
     case "lead":
    
     def temp = LEAD
    
     GOTOURL = temp
    
     break
    
     case "search":
    
     def patentWebsite = vars.patentLoc.selectedItem
    
     def patentTrimmed = vars.patents.selectedItem
    
     switch (patentWebsite) {
    
     case "EP Patent Register":
    
     GOTOURL = "http://worldwide.espacenet.com/searchResults?DB=EPODOC&submitted=true&locale=en_EP&ST=singleline&compact=false&DB=EPODOC&query=" + patentTrimmed
    
     break
    
     case "PatentScope (WIPO)":
    
     GOTOURL = "http://www.wipo.int/patentscope/search/en/detail.jsf?docId=" + patentTrimmed
    
     break
    
     case "PatentLens":
    
     GOTOURL = "http://www.patentlens.net/patentlens/patents.html?patnums=" + patentTrimmed + "&returnTo=patentnumber.html" + patentTrimmed
    
     break
    
     }
    
     break
    
     case "otherok":
    
     goToLoc = vars.othersites.selectedItem
    
     switch (goToLoc) {
    
     case "JP: IDPL":
    
     GOTOURL = "http://www.ipdl.inpit.go.jp/homepg_e.ipdl"
    
     break
    
     case "CA: CIPO":
    
     GOTOURL = "http://brevets-patents.ic.gc.ca/opic-cipo/cpd/eng/introduction.html"
    
     break
    
     case "AU: AusPat":
    
     GOTOURL = "http://www.ipaustralia.gov.au/auspat/index.htm"
    
     break
    
     case "KR: Korea":
    
     GOTOURL = "http://patent2.kipris.or.kr/pateng/searchLogina.do?next=GeneralSearch"
    
     break
    
     case "HK: PatentSearch":
    
     GOTOURL = "http://ipsearch.ipd.gov.hk/patent/main.jsp?LANG=en"
    
     break
    
     case "TW: Taiwan IPO":
    
     GOTOURL = "http://www.tipo.gov.tw/en/index.aspx"
    
     break
    
     case "SG: IPOS":
    
     GOTOURL = "http://www.epatents.gov.sg/default_redirect.asp"
    
     break
    
     case "DE: DPMA":
    
     GOTOURL = "http://register.dpma.de/DPMAregister/Uebersicht"
    
     break
    
     case "RU: FIPS":
    
     GOTOURL = "http://www1.fips.ru/wps/wcm/connect/content_en/en/main+/"
    
     break
    
     case "ID: IPDL":
    
     GOTOURL = "http://ipdl.dgip.go.id"
    
     break
    
     }
    
     break
    
     }
    
     URI testUrl = new URI(GOTOURL)
    
     Desktop desktop = Desktop.getDesktop()
    
     desktop.browse(testUrl)
    
    }