Patent Fetcher Button

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 ([email protected])
* 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)
}