« December 2011 | Main | March 2012 »
February 28, 2012
Jython servlet and JSP for AJAX slide presentations
Servlet Code:
from javax.servlet.http import HttpServlet
from java.util import ArrayList
from java.util import HashMap
import re
import string
from just import just
class presentationXML(HttpServlet):
def doGet(self,request,response):
self.doPost (request,response)
def doPost(self,request,response):
response.setContentType ("text/plain")
presentation_id = request.getParameter('presentation_id')
presentation = self.get_presentation(presentation_id)
prezs = presentation.get('rows')
top_slide = prezs.get(0)
request.setAttribute("top_title", top_slide['title'])
request.setAttribute("top_author", top_slide['author'])
request.setAttribute("top_desc", top_slide['description'])
slides = self.get_slides(presentation_id)
rows = slides.get('rows')
columns = slides.get('columns')
request.setAttribute("columns", columns)
request.setAttribute("rows", rows)
disp = request.getRequestDispatcher('presentation.xml.jsp')
disp.forward(request, response)
def build_slide(self, slide):
title = slide['title']
body = slide['body']
slide_list = ""
for i in body.split("\n"):
(tag, line) = i.split(':')
slide_list = slide_list + "\n<" + tag + '><span class="red">»</span> ' + line + "</" + tag + ">"
return {'title' : title, 'slide_list' : slide_list, 'example_url' : slide['example_url'] }
def get_slides(self, pres_id):
juice = just()
reply = juice.sql("select * from slides.slide where presentation_id = " + str(pres_id) + " order by sort_order asc")
slides = []
for row in reply['rows']:
slide = self.build_slide(row)
slides.append(slide)
return( self.jhash(slides, ['title', 'slide_list', 'example_url' ]) )
def get_presentation(self, pres_id):
juice = just()
reply = juice.sql("select * from slides.presentation where presentation_id = " + str(pres_id) + "limit 1")
return( self.jhash(reply['rows'], reply['columns']) )
def jhash(self, rows, columns):
results = HashMap()
jrows = ArrayList()
jcols = ArrayList()
for row in rows:
res = HashMap()
for col in columns:
jcols.add(col)
res.put(col, row[col])
jrows.add(res)
results.put('columns', jcols)
results.put('rows', jrows)
return results
JSP:
<?xml version="1.0" encoding="UTF-8"?>
<%@ page contentType="text/xml" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<?xml-stylesheet type="text/xsl" href="xslt/ajax-s-html.xml"?>
<ajax-s>
<pages>
<page>
<br/>
<br/>
<h2>${top_title}</h2>
<h3>${top_desc}</h3>
<h4><span class="red">»</span> ${top_author}</h4>
</page>
<c:forEach items="${rows}" var="row">
<page>
<h2>${row['title']}</h2>
<dl>
<c:out value="${row['slide_list']}" escapeXml="false"/>
</dl>
<c:if test="${row['example_url'] != ''}">
<p style="text-align: right"><a target="__newwin" href="${row['example_url']}">e.g. <span class="red">»</span></a></p>
</c:if>
</page>
</c:forEach>
</pages>
</ajax-s>
DB Query Bean
import re
import string
import com.ziclix.python.sql as sql
class just:
def sql(self, skewl):
description, results = self.query(skewl)
cols = []
final = {}
final['rows'] = []
final['columns'] = []
for i in description:
cols.append(i[0])
for i in results:
row = list(i)
r = {}
count = 0
for c in row:
r[cols[count]] = c
count = count + 1
final['rows'].append(r)
final['columns'] = cols
return final
def query(self, q):
dburl, user, pw, drv = ("jdbc:postgresql://localhost:5432/roo","*****","*****","org.postgresql.Driver")
db = sql.zxJDBC.connect(dburl, user, pw, drv)
cursor = db.cursor()
cursor.datahandler = sql.handler.PostgresqlDataHandler(cursor.datahandler)
cursor.execute(q)
columns = cursor.description
results = cursor.fetchall()
return (columns, results)
Posted by pj at 03:05 PM | Comments (0)
LOM OAI-PMH Harvester in Python
import oaipmh
import os
import re
import sys
import string
import time
import httplib
import urllib
import libxml2
from read_config import read_config
import do_sql
#from read_file import read_file
from MySQLdb.cursors import DictCursor
#from split import split
from string import split
import ConfigParser
import lom_handlers
import normalize_harvest
debug = 1
harvest = {}
repository_definitions_map = read_config('repository_definitions.ini', debug)
time.sleep(5)
# Namespaces to be stripped out from the about section and replaced with a single default one
# ie. oaiabout:
namespace_list = ['rdn_dc','dcterms','dc','meg','rdnterms']
identifier_list = []
harvest_type = ''
try:
repository_handle = sys.argv[1]
except:
MissingArgumentError = "\nUsage:\n\npython %s \n" % sys.argv[0]
raise MissingArgumentError
try:
harvest_type = sys.argv[2]
except:
MissingArgumentError = "\nUsage:\n\npython %s \n" % sys.argv[0]
raise MissingArgumentError
def get_last_harvest_date(repository_handle):
sql = "select max(date_format(harvest_date,'%Y-%m-%dT%H:%i:%sZ')) as last_harvest_date from harvests where harvest_type = 'daily' and repository_handle = '" + repository_handle + "'"
response = do_sql.do_sql_query('ltsn01_harvester',sql,debug)
do_sql.check_status(response, debug)
results = response['results']
return results[0]['last_harvest_date']
def get_xpath_map():
sql = 'select * from xpath_map'
response = do_sql.do_sql_query('ltsn01_harvester',sql,debug)
do_sql.check_status(response, debug)
results = response['results']
return results
def do_xpath_query(xml, xpath, label, identifier):
# We need to strip out namespaces from the about section
# for our xpath to work, as we will be adding ones back in
for ns in namespace_list:
xml = string.replace(xml, ns + ':','')
label = string.replace(label, ns + ':','')
xpath = string.replace(xpath, ns + ':','oaiabout:')
xpath = string.replace(xpath, '//about','//oaiabout:about')
final_dict = {}
parsed_doc = libxml2.parseDoc(xml)
if string.find(xpath, 'oaiabout') == -1:
#xpath_elements = split('/', xpath)
xpath_elements = split(xpath,'/')
xpath = ''
del xpath_elements[0]
del xpath_elements[0]
nspace = '/lom:'
for el in xpath_elements:
xpath = xpath + nspace + el
xpath = '/' + xpath
xpath = string.replace(xpath, 'lom:@','@')
xpath = string.replace(xpath, 'about:@','@')
if debug == 1:
print xpath
ctx = parsed_doc.xpathNewContext()
ctx.xpathRegisterNs("lom", "http://ltsc.ieee.org/xsd/LOMv1p0")
ctx.xpathRegisterNs("oaiabout", "http://www.openarchives.org/OAI/2.0/")
final_dict[label] = [node.content for node in ctx.xpathEval(xpath)]
parsed_doc.freeDoc()
if debug == 1:
print final_dict
return final_dict
def classification_parser(xml, debug):
# Special parser for the horribly nested classification section.
# In order to get the proper nesting we need three passes:
# 1) Grab the classification nodes
# 2) For each classification node parse the taxonPaths
# 3) For each taxonPath parse out the taxons
parsed_doc = libxml2.parseDoc(xml)
ctx = parsed_doc.xpathNewContext()
ctx.xpathRegisterNs("lom", "http://ltsc.ieee.org/xsd/LOMv1p0")
ctx.xpathRegisterNs("xsi", "http://www.w3.org/2001/XMLSchema-instance")
xpath="//lom:lom/lom:classification"
class_list = [ node for node in ctx.xpathEval(xpath)]
count = 0
node_values = []
for snode in class_list:
if debug == 1: print snode.serialize()
node_dict = {}
new_doc = libxml2.parseDoc(snode.serialize())
ctx = new_doc.xpathNewContext()
xpath="//classification/purpose/source"
node_dict['classification_purpose_source'] = [ node.content for node in ctx.xpathEval(xpath)]
xpath="//classification/purpose/value"
node_dict['classification_purpose_value'] = [ node.content for node in ctx.xpathEval(xpath)]
xpath="//classification/taxonPath"
# Serialize the node back into XML for parse once again :)
xml_path_list = [ node.serialize() for node in ctx.xpathEval(xpath)]
node_dict['classification_taxonPaths'] = []
for xml_path in xml_path_list:
path = {}
new_new_doc = libxml2.parseDoc(xml_path)
ctx = new_new_doc.xpathNewContext()
xpath="//taxonPath/source/string"
path['source_string'] = [ node.content for node in ctx.xpathEval(xpath)]
xpath="//taxonPath/taxon/id"
path['taxon_id'] = [ node.content for node in ctx.xpathEval(xpath)]
xpath="//taxonPath/taxon/entry/string"
path['taxon_entry_string'] = [ node.content for node in ctx.xpathEval(xpath)]
node_dict['classification_taxonPaths'].append(path)
node_values.append(node_dict)
count = count + 1
return node_values
if harvest_type == 'daily':
harvest_from = get_last_harvest_date(repository_handle)
else:
harvest_from = '2003-01-01T00:00:00Z'
lom_handlers.clear_tables(debug)
print "\n##Going to harvest the %s repository##\n" % repository_handle
try:
repository_definition = repository_definitions_map[repository_handle]
except:
BadHandleExceptionMessage = "Sorry there's no such repository definition as " + repository_handle + " in repository_definitions.ini:\n" + str(repository_defs.keys())
raise BadHandleExceptionMessage
repository_domain = repository_definition['repository_domain']
uri_path = repository_definition['uri_path']
repository_uri = "http://%s%s" % (repository_domain,uri_path)
sesh = oaipmh.ServerProxy(repository_uri)
server_id = sesh.identify()
print server_id.repositoryName()
print server_id.adminEmails()
metadata_formats = sesh.listMetadataFormats()
if debug == 1:
for format in metadata_formats:
print format
all_identifiers = sesh.listIdentifiers(metadataPrefix='oai_dc', from_='2003-01-01T00:00:00Z')
all_ids_list = []
for header in all_identifiers:
this_id = header.identifier()
all_ids_list.append(this_id)
identifiers = sesh.listIdentifiers(metadataPrefix='oai_dc', from_=harvest_from)
xpath_map = get_xpath_map()
print xpath_map
sys.exit
xpath_query_list = {}
for map in xpath_map:
xpath_query_list[map['xpath_query']] = 1
for header in identifiers:
this_record = {}
print "\n\n"
this_id = header.identifier()
identifier_list.append(this_id)
print "\n %s" % this_id
time.sleep(2)
#sesh = httplib.HTTPConnection(repository_domain)
#sesh.connect()
#sesh.request('GET',uri_path + '?verb=GetRecord&metadataPrefix=lom&identifier=' + this_id)
#response = sesh.getresponse()
response = urllib.urlopen(repository_uri + '?verb=GetRecord&metadataPrefix=lom&identifier=' + this_id)
xml = response.read()
# Fix for Nik's dodgy classification section
xml = string.replace(xml, 'taxonpath', 'taxonPath')
neat_xml = lom_handlers.mysql_tidy(xml)
reply = do_xpath_query(xml, '//lom/general/title/string', 'main_title', this_id)
main_title = lom_handlers.mysql_tidy(reply['main_title'][0])
sql = "insert into xml_store(oai_identifier,xml_document,record_main_title) values('%s','%s','%s')" % (this_id,neat_xml,main_title)
if debug == 1: print sql
response = do_sql.do_sql('ltsn01_harvester',sql,debug)
do_sql.check_status(response, debug)
for query in xpath_query_list.keys():
label = query
label = string.replace(label,'//','')
label = string.replace(label,'oaiabout:','')
label = string.replace(label,'/','_')
label = string.replace(label,'@','_')
reply = do_xpath_query(xml, query, label, this_id)
for ns in namespace_list:
label = string.replace(label, ns + ':','')
this_record[label] = reply[label]
if debug == 1:
print "\nThis record:\n", this_record
time.sleep(5)
lom_resource_id = lom_handlers.add_main_title(this_id, debug, this_record)
lom_handlers.add_title_added_entries(lom_resource_id, debug, this_record)
lom_handlers.add_keywords(lom_resource_id, debug, this_record)
lom_handlers.add_ISBNs(lom_resource_id, debug, this_record)
lom_handlers.store_poi(lom_resource_id, debug, this_record)
lom_handlers.lom_extra_languages(lom_resource_id, debug, this_record)
lom_handlers.add_general_value(lom_resource_id, debug, 'lom_general_description_string', 'general_description', this_record)
lom_handlers.add_general_value(lom_resource_id, debug, 'lom_general_coverage_string', 'general_coverage', this_record)
lom_handlers.add_general_value(lom_resource_id, debug, 'lom_technical_otherPlatformRequirements_string', 'technical_otherPlatformRequirements', this_record)
lom_handlers.add_authors(lom_resource_id, debug, this_record)
lom_handlers.add_about(lom_resource_id, debug, this_record)
lom_handlers.add_publishers(lom_resource_id, debug, this_record)
lom_handlers.add_locations(lom_resource_id, debug, this_record)
lom_handlers.add_formats(lom_resource_id, debug, this_record)
lom_handlers.add_lr_types(lom_resource_id, debug, this_record)
lom_handlers.add_educational_contexts(lom_resource_id, debug, this_record)
lom_handlers.add_general_value(lom_resource_id, debug, 'lom_educational_description_string', 'educational_description', this_record)
lom_handlers.add_general_value(lom_resource_id, debug, 'lom_rights_description_string', 'rights_description', this_record)
if this_record['lom_rights_copyrightAndOtherRestrictions_value']:
if this_record['lom_rights_copyrightAndOtherRestrictions_value'][0] == 'Yes' or this_record['lom_rights_copyrightAndOtherRestrictions_value'][0] == 'yes':
lom_handlers.add_set_value(lom_resource_id, debug, 1, 'rights_restricted')
lom_handlers.add_relations(lom_resource_id, debug, this_record)
class_list = []
class_list = classification_parser(xml, debug)
this_record['lom_classification'] = class_list
harvest[this_id] = this_record
if debug == 1:
print class_list
time.sleep(3)
lom_handlers.add_classification(lom_resource_id, debug, class_list)
# Put the entry in the harvests logging table
harvest_identifiers = string.join(identifier_list, '::')
all_ids = string.join(all_ids_list, '::')
if harvest_type == 'daily':
pass
else: harvest_type = 'complete'
sql = "insert into harvests(harvest_identifiers, all_identifiers, harvest_dictionary, harvest_type, repository_handle) values('" + harvest_identifiers + "','" + all_ids + "','" + lom_handlers.mysql_tidy(str(harvest)) + "','" + harvest_type + "','" + repository_handle + "')"
response = do_sql.do_sql('ltsn01_harvester',sql,debug)
do_sql.check_status(response, debug)
normalize_harvest.normalize_data(debug)
normalize_harvest.handle_deletions(repository_handle, debug)
Posted by pj at 02:54 PM | Comments (0)
Example OOP PHP Code
<?php
abstract class pid_entity{
function details(){
global $r;
$r['dbname'] = 'uebs';
$r['schema'] = 'pid';
if(!$this->id){ return false; }
if(!$this->table){ return false; }
$reply = just::sql(sprintf('select * from %s.%s where %s_id = %d',$r['schema'] , $this->table, $this->table, $this->id));
$this->details = $reply['first_row'];
$this->row = $this->details;
}
function create(){
if(!$this->table){ return false; }
global $r;
$r['dbname'] = 'uebs';
$r['schema'] = 'pid';
$this->id = just::add($this->table);
}
function set(){
if(!$this->table){ return false; }
global $r;
$r['dbname'] = 'uebs';
$r['schema'] = 'pid';
if(!$this->id){ $this->create(); }
$reply = just::update($this->table, $r, $this->id);
$_SESSION['pid_set'] = $reply;
$this->details();
$this->row = $this->details;
return $reply['status'];
}
function annotate(){
global $r;
$r['dbname'] = 'uebs';
$r['schema'] = 'pid';
$id = just::add('note');
$r[$this->table.'_id'] = $this->id;
$reply = just::update('note', $r, $id);
return $reply['status'];
}
function get_notes(){
global $r;
$r['dbname'] = 'uebs';
$r['schema'] = 'pid';
$reply = just::sql(sprintf('select notes, to_timestamp(insert_date) as ts, insert_date from %s.note where expired_date is null and %s_id = %d order by insert_date desc', $r['schema'], $this->table, $this->id ));
return $reply['rows'];
}
}
interface pid_entity_if{
function details();
function create();
function set();
function add_child($object);
function get_children();
function calculate_start();
function calculate_end();
function annotate();
function get_notes();
}
class project extends pid_entity implements pid_entity_if{
public $id;
public $title;
public $percent_complete;
public $start_date;
public $end_date;
public $children;
public $table = 'project';
function __construct($key){
if($key > 0){
$this->id = $key;
$this->details();
}
}
function add_child($object){}
function get_children(){}
function calculate_start(){}
function calculate_end(){}
}
class phase extends project{
public $id;
public $title;
public $percent_complete;
public $start_date;
public $end_date;
public $children;
public $table = 'phase';
function __construct($phase_id){
parent::__construct($phase_id);
}
}
class work_package extends project{
public $id;
public $title;
public $percent_complete;
public $start_date;
public $end_date;
public $children;
public $table = 'work_package';
function __construct($wp_id){
parent::__construct($wp_id);
}
}
class deliverable extends project{
public $id;
public $title;
public $percent_complete;
public $start_date;
public $end_date;
public $children;
public $table = 'deliverable';
function __construct($del_id){
parent::__construct($del_id);
}
}
/* End of /waf/classes/project_initiation.php */
DB Model:
drop table if exists pid.project;
create table pid.project
(
project_id serial unique not null,
project_type_id integer null,
name text null,
purpose text null,
background text null,
assumptions text null,
constraints text null,
risks text null,
insert_by integer null,
insert_date bigint null,
update_by integer null,
update_date bigint null,
expired_date bigint null,
primary key (project_id)
);
alter table pid.project drop project_type_id;
drop table if exists pid.phase;
create table pid.phase
(
phase_id serial unique not null,
phase_type_id integer null,
project_id integer null,
phase_sort decimal null,
name text null,
description text null,
insert_by integer null,
insert_date bigint null,
update_by integer null,
update_date bigint null,
expired_date bigint null,
primary key (phase_id)
);
alter table pid.phase drop phase_type_id;
drop table if exists pid.work_package;
create table pid.work_package
(
work_package_id serial unique not null,
work_package_type_id integer null,
phase_id integer null,
dependent_on_package_id integer null,
name text null,
package_sort decimal null,
description text null,
start_date bigint null,
length_days decimal null,
completion_date bigint null,
insert_by integer null,
insert_date bigint null,
update_by integer null,
update_date bigint null,
expired_date bigint null,
primary key (work_package_id)
);
alter table pid.work_package drop work_package_type_id;
drop table if exists pid.staff;
create table pid.staff
(
staff_id serial unique not null,
staff_type_id integer null,
insert_by integer null,
insert_date bigint null,
update_by integer null,
update_date bigint null,
expired_date bigint null,
primary key (staff_id)
);
alter table pid.staff drop staff_type_id;
drop table if exists pid.note;
create table pid.note
(
note_id serial unique not null,
note_type_id integer null,
project_id integer null,
phase_id integer null,
work_package_id integer null,
notes text null,
insert_by integer null,
insert_date bigint null,
update_by integer null,
update_date bigint null,
expired_date bigint null,
primary key (note_id)
);
alter table pid.note drop note_type_id;
drop table if exists pid.deliverable;
create table pid.deliverable
(
deliverable_id serial unique not null,
deliverable_type_id integer null,
work_package_id integer null,
name text null,
delivery_date bigint null,
insert_by integer null,
insert_date bigint null,
update_by integer null,
update_date bigint null,
expired_date bigint null,
primary key (deliverable_id)
);
alter table pid.deliverable drop deliverable_type_id;
drop table if exists pid.work_package_status;
create table pid.work_package_status
(
work_package_status_id serial unique not null,
work_package_status_type_id integer null,
insert_by integer null,
insert_date bigint null,
update_by integer null,
update_date bigint null,
expired_date bigint null,
primary key (work_package_status_id)
);
drop table if exists pid.work_package_status_type;
create table pid.work_package_status_type
(
work_package_status_type_id serial unique not null,
name text null,
description text,
insert_by integer null,
insert_date bigint null,
update_by integer null,
update_date bigint null,
non_deletable boolean not null default true,
expired_date bigint null,
primary key (work_package_status_type_id) );
drop table if exists pid.upload_file;
create table pid.upload_file
(
upload_file_id serial unique not null,
upload_file_type_id integer null,
project_id integer null,
phase_id integer null,
work_package_id integer null,
file_name text null,
file_mime_type text null,
file_length bigint null,
file_data bytea null,
insert_by integer null,
insert_date bigint null,
update_by integer null,
update_date bigint null,
expired_date bigint null,
primary key (upload_file_id)
);
alter table pid.upload_file drop upload_file_type_id;
drop table if exists pid.project_staff_link;
create table pid.project_staff_link
(
project_staff_link_id serial unique not null,
project_id integer null,
staff_id integer null,
insert_by integer null,
insert_date bigint null,
update_by integer null,
update_date bigint null,
expired_date bigint null,
primary key(project_staff_link_id)
);
Windows .ini file:
[schema] default = pid [table_list] project = 0 phase = 0 work_package = 0 staff = 0 note = 0 deliverable = 0 work_package_status = 1 upload_file = 0 [upload_file] project_id = integer phase_id = integer work_package_id = integer file_name = text file_mime_type = text file_length = bigint file_data = bytea [work_package_status] work_package_id [note] project_id = integer phase_id = integer work_package_id = integer notes = text [deliverable] work_package_id = integer name = text delivery_date = bigint [work_package] phase_id = integer dependent_on_package_id = integer name = text package_sort = decimal name = text description = text start_date = bigint length_days = decimal completion_date = bigint [project] name = text purpose = text background = text assumptions = text constraints = text risks = text [phase] project_id = integer phase_sort = decimal name = text description = text [staff] [link_tables] project:staff = 0 ;programme:course = 0
Posted by pj at 02:37 PM | Comments (0)
February 22, 2012
Request forwarding to JSP from Jython
Using JSP for HTML layout for a Jython ServletPosted by pj at 04:35 PM | Comments (0)