Clearinghouse. Eric D. Schabell University of Nijmegen, Computing Science Institute, P.O. Box 9010, 6500 GL Nijmegen, The Netherlands

Similar documents
ST-Links. SpatialKit. Version 3.0.x. For ArcMap. ArcMap Extension for Directly Connecting to Spatial Databases. ST-Links Corporation.

Introduction to ArcGIS Server Development

Tryton Technical Training

Replication cluster on MariaDB 5.5 / ubuntu-server. Mark Schneider ms(at)it-infrastrukturen(dot)org

Portal for ArcGIS: An Introduction. Catherine Hynes and Derek Law

From BASIS DD to Barista Application in Five Easy Steps

Introduction to Portal for ArcGIS. Hao LEE November 12, 2015

Biology 559R: Introduction to Phylogenetic Comparative Methods Topics for this week:

Transformation of round-trip web application to use AJAX

Databases through Python-Flask and MariaDB

MapOSMatic, free city maps for everyone!

Leveraging Web GIS: An Introduction to the ArcGIS portal

Portal for ArcGIS: An Introduction

WEB-BASED SPATIAL DECISION SUPPORT: TECHNICAL FOUNDATIONS AND APPLICATIONS

From BASIS DD to Barista Application in Five Easy Steps

Using the EartH2Observe data portal to analyse drought indicators. Lesson 4: Using Python Notebook to access and process data

Bloomsburg University Weather Viewer Quick Start Guide. Software Version 1.2 Date 4/7/2014

Overview. Everywhere. Over everything.

One platform for desktop, web and mobile

BASIC TECHNOLOGY Pre K starts and shuts down computer, monitor, and printer E E D D P P P P P P P P P P

Description of the ED library Basic Atoms

Introduction to Portal for ArcGIS

WEB MAP SERVICE (WMS) FOR GEOLOGICAL DATA GEORGE TUDOR

Reaxys Pipeline Pilot Components Installation and User Guide

ON SITE SYSTEMS Chemical Safety Assistant

Troubleshooting Replication and Geodata Services. Liz Parrish & Ben Lin

Please click the link below to view the YouTube video offering guidance to purchasers:

Arup Nanda Starwood Hotels

DYNAMIC PORTRAYAL AND DIRECT LOCATION METHOD FOR

Geodatabase: Best Practices. Robert LeClair, Senior Instructor

git Tutorial Nicola Chiapolini Physik-Institut University of Zurich January 26, 2015

CHEMICAL INVENTORY ENTRY GUIDE

git Tutorial Nicola Chiapolini Physik-Institut University of Zurich March 16, 2015

Evaluating Physical, Chemical, and Biological Impacts from the Savannah Harbor Expansion Project Cooperative Agreement Number W912HZ

GIS Software. Evolution of GIS Software

TOP MARKET SURVEY INSTRUCTION SHEET. Requirements. Overview

SDS developer guide. Develop distributed and parallel applications in Java. Nathanaël Cottin. version

Arboretum Explorer: Using GIS to map the Arnold Arboretum

Agenda. Status of GI activities. NGII Framework. SDI from the national policy perspective

ArcGIS Enterprise: What s New. Philip Heede Shannon Kalisky Melanie Summers Sam Williamson

ArcGIS Enterprise: What s New. Philip Heede Shannon Kalisky Melanie Summers Shreyas Shinde

M o n i t o r i n g O c e a n C o l o u r P y t h o n p r o c e d u r e f o r d o w n l o a d

git Tutorial Nicola Chiapolini Physik-Institut University of Zurich June 8, 2015

SuperCELL Data Programmer and ACTiSys IR Programmer User s Guide

Data Aggregation with InfraWorks and ArcGIS for Visualization, Analysis, and Planning

Yes, the Library will be accessible via the new PULSE and the existing desktop version of PULSE.

ARGUS.net IS THREE SOLUTIONS IN ONE

Geodatabase Best Practices. Dave Crawford Erik Hoel

Migrating Defense Workflows from ArcMap to ArcGIS Pro. Renee Bernstein and Jared Sellers

Free and Open Source Software for Cadastre and Land Registration : A Hidden Treasure? Gertrude Pieper Espada. Overview

Evaluating Physical, Chemical, and Biological Impacts from the Savannah Harbor Expansion Project Cooperative Agreement Number W912HZ

OECD QSAR Toolbox v.4.1. Tutorial illustrating new options for grouping with metabolism

Outline. What is MapPlace? MapPlace Toolbar & PopUp Menu. Geology Themes 1:5M 1:1M BCGS 1:250,000. Terranes

T R A I N I N G M A N U A L 1. 9 G H Z C D M A P C S 80 0 M H Z C D M A /A M P S ( T R I - M O D E ) PM325

NEW HOLLAND IH AUSTRALIA. Machinery Market Information and Forecasting Portal *** Dealer User Guide Released August 2013 ***

Account Setup. STEP 1: Create Enhanced View Account

Solving Polynomial Systems in the Cloud with Polynomial Homotopy Continuation

ArcGIS Pro: Essential Workflows STUDENT EDITION

Virtual Beach Making Nowcast Predictions

CalWeedMapper. Mapping the Spread of Invasive Plant Species. Karsten Vennemann. Seattle

Notater: INF3331. Veronika Heimsbakk December 4, Introduction 3

Scripting Languages Fast development, extensible programs

rethinking software design by analyzing state

Location Intelligence Infrastructure Asset Management. Confirm. Confirm Mapping Link to ArcMap Version v18.00b.am

USEPA's Comprehensive Geospatial Information Sharing Framework

Write a report (6-7 pages, double space) on some examples of Internet Applications. You can choose only ONE of the following application areas:

Large Scale Evaluation of Chemical Structure Recognition 4 th Text Mining Symposium in Life Sciences October 10, Dr.

The CSC Interface to Sky in Google Earth

An Internet-Based Integrated Resource Management System (IRMS)

Geographical Databases: PostGIS. Introduction. Creating a new database. References

Exploiting Virtual Observatory and Information Technology: Techniques for Astronomy

Preparing Spatial Data

GEOS Chem v7 Adjoint User's Guide

EEOS 381 -Spatial Databases and GIS Applications

Implementing an online spatial database using the GRASS GIS environment

Urban Canopy Tool User Guide `bo`

new interface and features

A GUI FOR EVOLVE ZAMS

Infrastructure Automation with Salt

Manual Railway Industry Substance List. Version: March 2011

Portals: Standards in Action

A decade of geoinformation sharing at ETH Zurich

CREATING A REPORT ON FIRE (April 2011)

Free Open Source Software: FOSS Based GIS for Spatial Retrievals of Appropriate Locations for Ocean Energy Utilizing Electric Power Generation Plants

ISOLATION BY DISTANCE WEB SERVICE WITH INCORPORATION OF DNA DATA SETS. A Thesis. Presented to the. Faculty of. San Diego State University

LED Lighting Facts: Product Submission Guide

Reaxys Medicinal Chemistry Fact Sheet

Karsten Vennemann, Seattle. QGIS Workshop CUGOS Spring Fling 2015

The econ Planning Suite: CPD Maps and the Con Plan in IDIS for Consortia Grantees Session 1

Administering your Enterprise Geodatabase using Python. Jill Penney

WeatherHawk Weather Station Protocol

JOB REQUESTS C H A P T E R 3. Overview. Objectives

Applying the Semantic Web to Computational Chemistry

What s New. August 2013

Quantification of JEOL XPS Spectra from SpecSurf

ProMass Deconvolution User Training. Novatia LLC January, 2013

Web Knowledge Base on Low Energy Nuclear Physics

MapOSMatic: city maps for the masses

Appendix 4 Weather. Weather Providers

The New Horizons Geometry Visualizer: Planning the Encounter with Pluto

Transcription:

Building the PRONIR Conversion Clearinghouse. Eric D. Schabell erics@cs.kun.nl University of Nijmegen, Computing Science Institute, P.O. Box 9010, 6500 GL Nijmegen, The Netherlands PUBLISHED AS: E.D. Schabell. Building the pronir conversion clearinghouse. Technical Report NIII-R0317, Nijmegen Institute for Information and Computing Sciences, University of Nijmegen, Nijmegen, The Netherlands, EU, 2003. Abstract As a vital part of the larger architecture, our document conversion system will need to provide for the transformation of documents to a requested format. The first step on the way to realizing this system is to gather all the various conversion routines in a central location. To achieve this, the Conversion Clearinghouse has been implemented to provide a means for anyone to submit her favorite conversion routines. Our Conversion Clearinghouse also allows anyone to browse through and pick out any of the collected conversions. 1 The following report describes the design and implementation of the various elements that make up our Conversion Clearinghouse. This work is part of the ongoing research project Profile Based Retrieval Of Networked Information Resources (PRONIR). 1 Overview Our design shows a split into Phases, which allow for a working evolution towards the final networked document conversion toolkit. For clarity, an overview of all four Phases will be provided first with a detailed explanation of the initial Phase zero being covered in the rest of this report. 1.1 Phase zero A web based portal will be provide to offer access to a collection of existing one step conversion routines. It will also provide a mechanism for submitting conversion routines for addition to the collection. Finally, this web portal will provide a means for a browsing client to obtain needed conversion tools from the conversion clearinghouse collection. 1 Conversion Clearinghouse: http://www.pronir.nl/clearinghouse. 1

1.2 Phase one Phase one will add to the functionality of the conversion clearinghouse. Here we want to build a simple document conversion system that can make use of the one step conversion tools available in phase zero. A Broker and Server interface will be created to provide the user with a seamless conversion experience. This can occur locally or invisibly via a networked conversion server. The various existing conversions available in the conversion clearinghouse are the starting point for our offered conversion system. This will involve only single step conversions, ones that move a document from one type to another. For example, postscript to pdf format. 1.3 Phase two This phase will expand on the previous one to include additional recipes. A conversion process should not only take a document from a to b, but also provide for possible a to b to... to n. The client will be able to make use of these conversions without regard for quality of the conversion. 1.4 Phase three At this stage, we will provide for a more complex management of the conversion process between a user and one or more servers in the conversion network. The Broker will be expanded to provide for more functionality. The network will be able to host multiple Servers with each participating Server providing a listing of its own conversion services.the Broker will be able to negotiate for the client in a network of conversion servers, attempting to offer the quickest (distance to server) conversion. The Broker will offer the most efficient (quality comes into play) conversion possible. Finally, conversion results should be cached. This caching will not be of the converted document (higher level component caching), but at a more elemental level (low level component caching) as described in [Sch02]. 2 Introduction Our search for a a generic information retrieval software architecture has been outlined previously in [Sch02]. Continuing work on this project has resulted in [GPB03b], [GS03] and [GPB03a]. The ultimate goal of this part of the overall software architecture is to provide a comprehensive document conversion system, one that works both locally and across networked environments. To meet this goal, the four previously defined Phases have been defined to allow for incremental evolution of the provided conversion functionality. This technical report will deal only with the initial Phase zero, which details the setup of a central repository for the existing conversion tools available for a Linux machine. 2

2.1 Phase zero Our first goal will be to create a central repository for the existing conversion tools available for a Linux machine. We call our repository The PRONIR Conversion Clearinghouse and it consists of the following elements: a single conversion will be one-step only, defined as converting a document from one type directly to another and no further. a collection of existing filters and wrappers that can make one-step conversions between document types (ps2pdf for example). provide a means for searching for a conversion based on feature type and representation type information. using a web interface to provide links for the client browsing to obtain the variou s files necessary to implement these conversions. 2.2 Implementation A web based portal has been created which provides access to all of the above mentioned services. It provides access to our collection of existing one step conversion routines, provide a simple web tool for submitting conversions and provide a means for a browsing client to obtain needed conversion tools from the conversion clearinghouse collection. 3 Design This section will outline the requirements, data model, relational database scheme, database scheme and other issues that were encountered during the design phase. 3.1 Requirements Requirements were ascertained through the use of interviews and brainstorming sessions with part of the PRONIR project team. The following shows the functionality that our Conversion Clearinghouse will need to provide: a single conversion will be one-step only, defined as converting a document from one type directly to another and no further. a collection of existing filters and wrappers that can make one-step conversions between document types (ps2pdf for example). provide a means for searching for a conversion based on feature type and representation type information. 2 using a web interface to provide links for the client browsing to obtain the various files necessary to implement these conversions. 2 Feature types and representation types are introduced in [GPB03a]. 3

Based on the above listed needs the following functional requirements were the basis for further development: 1. user can interface with the clearinghouse via web browser. 2. user can submit a new conversion to the clearinghouse. 3. conversions should be browsable by user. 4. browsing queries should always provide as many results as possible. 5. user can obtain a desired conversion tool from the clearinghouse. To support these a web based portal has been created. It provides access to our collection of existing one step conversion routines, provides a simple web tool for submitting conversions and provides a means for browsing clients to obtain conversion tools from the Conversion Clearinghouse collection. 3 3.2 Data Model To support the Conversion Clearinghouse in its retrieval and browsing functionality, a data analysis was conducted. The results were modeled in the entityrelationship (ER) diagram shown in Figure 1. 3.3 Relational Database Scheme Mapping the ER model in Figure 1 to a relational database schema and then normalizing provides a structured data model as show in the following three tables 4 : Package name contact orig-url pronir-url The Package schema has a primary key consisting of the package name and is referenced by the pkg-name attribute from the Routine table. Routine name pkg-name location The Routine schema has a double attribute key name, pkg-name and is referenced by the field routine-name from the Filter table. Filter cmd-string from-feature-type routine-name from-representation-type to-feature-type to-representation-type The Filter schema has a double attribute key cmd-string, routine-name. 3 Conversion Clearinghouse: http://www.pronir.nl/clearinghouse. 4 The bold fields denote primary keys, the italics denote foreign keys. 4

Figure 1: Conversion Clearinghouse entity-relationship (ER) data model 5

3.4 Database choices When looking at our choices to implement our data model, we decided to keep it within the Free Software databases. Keeping in mind that it is a search for a generic architecture it was decided not to limit the implementation choices. Two options in the form of setup scripts are provided for the following databases: 1. Postgresql [Pos03] 2. MySQL [MyS03] Here is an example of the table definitions for an implementation using MySQL as the database for a Conversion Clearinghouse: MySQL table definitions CREATE TABLE Package (name VARCHAR(20) NOT NULL, contact VARCHAR(20) NOT NULL, orig-url VARCHAR(40), pronir-url VAR- CHAR(40), PRIMARY KEY (name) CREATE TABLE Routine (name VARCHAR(20) NOT NULL, pkg-name VARCHAR (30) NOT NULL REFERENCES Package(name), location VARCHAR(30) NOT NULL, PRIMARY KEY (name, pkg-name) ) CREATE TABLE Routine (name VARCHAR(20) NOT NULL, pkg-name VARCHAR (30) NOT NULL REFERENCES Package(name), location VARCHAR(30) NOT NULL, PRIMARY KEY (name, pkg-name) ) 3.5 Implementation The web interface was developed through the use of the Rapid Application Development (RAD) methodology. The first interface was quickly prototyped in Perl and through the various iterations of user analysis it evolved into the site it is at: http://www.pronir.nl/clearinghouse An overview of the possible screens a user can encounter during a visit to the Conversion Clearinghouse is shown in Figure 2. 1. Intro Screen - displays three choices (listing of database, submit a conversion, retrieve a conversion) in the form of check boxes with a submit button for the user to indicate her choice. 2. Listing - if the user request to retrieve information about a specific conversion, then a new screen will be provided. This screen will provide pull-down menu buttons for the following fields: conversion name, from aspect, to aspect, from type, to type. 3. Listing Results - a new screen that displays the results of the user selected options in the previous Listing screen. 6

Figure 2: User screen flow experience 4. Submitting - if the user request to submit a conversion, then a new screen will be displayed with the following fields for user input: name of conversion, from aspect, to aspect, from type, to type, execution command, package name, URL to package source. Each field will have it s own explanation text to inform the user as to what type of input is required. This screen provides a submit button for the user to indicate submission of the provided fields. 5. Submit Results - the screen is updated with a sent or denied message, depending on the results of the users attempt to submit a conversion. 6. Retrieving - if the user requests to retrieve information about a specific conversion, a new screen will be provided. This screen will provide a pull down menu listing all available conversion routines from which the user can make a selection. 7. Retrieval Results - a new screen, providing information from the conversion database as to the package needed for the conversion type selected. The user can download any listed packages from this screen by selecting one. For a more detailed look at the code itself, the reader is referred to section 4. 7

3.6 System requirements The running of the pronir clearinghouse phase zero will require at least the following components (this is the environment in which it was created and tested): Linux or Unix system that supports all of the following. Perl 5.8.0 Perl modules used in cgi scripts (imported; CGI, DBI, Mail::Sendmail and depending on database choice; DBD-Pg for Postgresql or DBD-mysql for MySQL). Apache 2.0.44 or higher with CGI support. MySQL 4.0.12 (must have 4.0 or higher to use the UNION feature in our queries). Postgresql 7.3.3 Note that you have a choice to make between MySQL and Postgresql. 3.7 Developers setup This section will detail the various locations of the source code tree and how to access it for development purposes. First off the Perl cgi scripts are all located in an off-site Code Version System (CVS). To check out the code you will need to have CVS installed on your system. You will also need an account on the CVS host machine, this can be arranged through Eric Schabell, erics@cs.kun.nl or Kees Leune, kees@uvt.nl. Once you have an account, you can check out the pronir module with the following command: cvs-dmaximux.uvt.nl:/home/cvscheckoutpronir The phase zero clearinghouse source code tree and documentation can be found in the following directories: pronir/prj/pronir-clearinghouse/src pronir/prj/pronir-clearinghouse/docs 4 Implementation In this section the coded implementations of the previously shown design will be provided. Where these implementations are related to a certain screen as shown in Figure 2, it will be noted in the caption supplied at the top of each code frame. All code examples have been cleaned of the integrated documentation formating tags. It should be noted that care was taken to document the code completely. 8

! / usr / bin / p e r l Tw PROGRAM NAME c l e a r i n g h o u s e Author : E r i c S c h a b e l l Date : 2002 12 23 E Mail : e r i c s @ c s. kun. nl Changelog : 20030624 R e l e a s e 1. 0 use s t r i c t ; use vars $VERSION ; use CGI qw ( : a l l ) ; $VERSION = "1.0" ; Listing 1: Clearinghouse Intro S e t t h e s e t o r e f l e c t t h e s e r v e r b e i n g used. my $submit url = "http://localhost/cgi-bin/submit_conversion" ; my $ l i s t u r l = "http://localhost/cgi-bin/listing_request" ; my $obtain url = "http://localhost/cgi-bin/obtain_conversion" ; my $ l i s t c h o i c e = "Browse available conversions" ; my $submit choice = "Submit a conversion routine" ; my $obtain choice = "Obtain a conversion routine" ; my $submit button = "options" ; Apparently e v e r y c g i s c r i p t runs i t s e l f a g a i n a f t e r submit b u t t o n i s p r e s s e d, so w i l l make t h e c h e c k s f o r s e l e c t i o n f i r s t and i f t h i s i s t h e f i r s t run i t w i l l p r i n t t h e f r o n t page t o a l l o w f o r u s e r i n p u t. Otherwise i t w i l l r e a c t t o t h e b u t t o n s e l e c t e d and p r o c e s s t h e u s e r s r e q u e s t... < sigh >, web development... w h e e e e e.... i f ( param ( $submit button ) = / ˆ $submit choice /) { print r e d i r e c t ( $submit url ) ; e l s i f ( param ( $submit button ) = / ˆ $ l i s t c h o i c e /) { print r e d i r e c t ( $ l i s t u r l ) ; e l s i f ( param ( $submit button ) = / ˆ $ o b t a i n c h o i c e /) { print r e d i r e c t ( $ o b t a i n u r l ) ; else { print header, start html ( t i t l e=> Welcome to - The PRONIR Conversion Clearinghouse!, author=> erics@cs.kun.nl, bgcolor=> lightgrey ), "<CENTER>\n", h1 ( ***** PRONIR Conversion Clearinghouse ***** ), "</CENTER>\n" ; print header ( ) ; print hr, start form, p, h2 ( Please select an option: ), radio group( name=>$submit button, values=>[ $ l i s t c h o i c e, $submit choice, $ o b t a i n c h o i c e ], d e f a u l t=> - ), p, submit, end form, hr, 9

end html ; sub print header { h e a d e r and f o o t e r. print "<!-- Download links at the top of the page -->", "<table width=\"100%\" border=\"2\">", "<th width=\"100%\" colspan=4 height=\"2%\" rowspan=1 align=\"center\" nowrap>", "<a href=\"clearinghouse\" target=\"_new\">conversion_clearinghouse -</a>", "<a href=\"http://www.pronir.nl\" target=\"_new\"> Pronir_Home - </a>", "<a href=\"http://www.pronir.nl/pub/spws/download.html\" target=\"_new\"> Download -</a>", "<a href=\"http://www.pronir.nl/pub/spws/docs/\" target=\"_new\"> Documentation -</a>", "<a href=\"http://www.pronir.nl/pub/spws/call.html\" target=\"_new\"> Call for Interest </a>", "</th>", "</table>", "</CENTER>\n" ; end c l e a r i n g h o u s e.! / usr / bin / p e r l Tw PROGRAM NAME l i s t i n g r e q u e s t Author : E r i c S c h a b e l l Date : 2003 01 08 E Mail : e r i c s @ c s. kun. nl Changelog : 20030624 R e l e a s e 1. 0 use s t r i c t ; use vars $VERSION ; use CGI qw ( : a l l ) ; use DBI ; Listing 2: Listing Request $VERSION = "1.0" ; S e t t h e s e t o r e f l e c t t h e s e r v e r b e i n g used. my $clearinghouse db = "clearinghouse" ; my $db driver = "dbi:pg:dbname" ; or DBI : mysql : d a t a b a s e f o r MySQL. my $ d b h o s t = pgsql c l e a r i n g h o u s e. s c i. kun. nl ; my $ d b u s e r = c l e a r i n g h o u s e u s e r ; my $db pw = ClearAtHouse ; my $db host = "localhost" ; my $db user = "pronir" ; my $db pw = "pron!r" ; D i s p l a y t h e v a r i o u s c o n v e r s i o n t a b l e s. my $from feature = "From_Feature" ; my $from rep = "From_Representation" ; my $to feature = "To_Feature" ; my $to rep = "To_Representation" ; my ( @ from feature list, @ from representation list, @ t o f e a t u r e l i s t, @ t o r e p r e s e n t a t i o n l i s t ) = ( ) ; my $ f f e a t u r e s e l e c t = "SELECT DISTINCT from_feature_type FROM Filter 10

ORDER BY from_feature_type" ; my $ f r e p r e s e n t a t i o n s e l e c t = "SELECT DISTINCT from_representation_type FROM Filter ORDER BY from_representation_type" ; my $ t f e a t u r e s e l e c t = "SELECT DISTINCT to_feature_type FROM Filter ORDER BY to_feature_type" ; my $ t r e p r e s e n t a t i o n s e l e c t = "SELECT DISTINCT to_representation_type FROM Filter ORDER BY to_representation_type" ; Apparently e v e r y c g i s c r i p t runs i t s e l f a g a i n a f t e r submit b u t t o n i s p r e s s e d, so w i l l make t h e c h e c k s f o r s e l e c t i o n f i r s t and i f t h i s i s t h e f i r s t run i t w i l l p r i n t t h e f r o n t page t o a l l o w f o r u s e r i n p u t. Otherwise i t w i l l r e a c t t o t h e b u t t o n s e l e c t e d and p r o c e s s t h e u s e r s r e q u e s t... < sigh >, web development... w h e e e e e.... i f ( param ( ) ) { my $ f f = param ( $from feature ) ; my $fr = param ( $from rep ) ; my $ t f = param ( $ t o f e a t u r e ) ; my $tr = param ( $to rep ) ; print r e d i r e c t ( "http://localhost/cgi-bin/ results_listing?from_f=$ff&from_r=$fr&to_f=$tf&to_r=$tr" ) ; else { my $dbh = DBI >connect ( "$db_driver=$clearinghouse_db;host=$db_host", $db user, $db pw, { RaiseError = > 1); D i s p l a y query page. print header, start html ( t i t l e=> Welcome to - The PRONIR Conversion Clearinghouse!, author=> erics@cs.kun.nl, bgcolor=> lightgrey ), "<CENTER>\n", h1 ( ***** Browsing the PRONIR Conversion Clearinghouse ***** ) ; print header ( ) ; print hr ; Setup l i s t s f o r s e l e c t i o n menu s. From F e a t u r e L i s t i n g. my $ s t h f f e a t u r e l i s t = $dbh >prepare ( $ f f e a t u r e s e l e c t ) ; $ s t h f f e a t u r e l i s t >execute ( ) ; while (my $ r e f = $ s t h f f e a t u r e l i s t >fetchrow hashref ( ) ) { @ from feature list = ( @ from feature list, $ref >{ from_feature_type ) ; $ s t h f f e a t u r e l i s t >f i n i s h ( ) ; From R e p r e s e n t a t i o n L i s t i n g. my $ s t h f r e p r e s e n t a t i o n l i s t = $dbh >prepare ( $ f r e p r e s e n t a t i o n s e l e c t ) ; $ s t h f r e p r e s e n t a t i o n l i s t >execute ( ) ; while (my $ r e f = $ s t h f r e p r e s e n t a t i o n l i s t >fetchrow hashref ( ) ) { @ f r o m r e p r e s e n t a t i o n l i s t = ( @ from representation list, $ref >{ from_representation_type ) ; $ s t h f r e p r e s e n t a t i o n l i s t >f i n i s h ( ) ; To F e a t u r e L i s t i n g. 11

my $ s t h t f e a t u r e l i s t = $dbh >prepare ( $ t f e a t u r e s e l e c t ) ; $ s t h t f e a t u r e l i s t >execute ( ) ; while ( my $ r e f = $ s t h t f e a t u r e l i s t >fetchrow hashref ( ) ) { @ t o f e a t u r e l i s t = ( @ t o f e a t u r e l i s t, $ref >{ to_feature_type ) ; $ s t h t f e a t u r e l i s t >f i n i s h ( ) ; To R e p r e s e n t a t i o n L i s t i n g. my $ s t h t r e p r e s e n t a t i o n l i s t = $dbh >prepare ( $ t r e p r e s e n t a t i o n s e l e c t ) ; $ s t h t r e p r e s e n t a t i o n l i s t >execute ( ) ; while ( my $ r e f = $ s t h t r e p r e s e n t a t i o n l i s t >fetchrow hashref ( ) ) { @ t o r e p r e s e n t a t i o n l i s t = ( @ t o r e p r e s e n t a t i o n l i s t, $ref >{ to_representation_type ) ; $ s t h t r e p r e s e n t a t i o n l i s t >f i n i s h ( ) ; print start form, h2 ( Choose the Feature and/or Representation types that represent your conversion wishes: ), br ( Conversion, b ( FROM FEATURE ), type: ), popup menu( name=>$from feature, values=>\@ from feature list, d e f a u l t=> * ), br ( Conversion, b ( FROM REPRESENTATION ), type: ), popup menu( name=>$from rep, values=>\@ from representation list, d e f a u l t=> * ), p, br ( Conversion, b ( TO FEATURE ), type: ), popup menu( name=>$to feature, values=>\@ t o f e a t u r e l i s t, d e f a u l t=> * ), br ( Conversion, b ( TO REPRESENTATION ), type: ), popup menu( name=>$to rep, values=>\@ t o r e p r e s e n t a t i o n l i s t, d e f a u l t=> * ), p, submit, end form, hr, end html ; $dbh >disconnect ( ) ; p r i n t h e l p ( ) ; sub p r i n t h e l p { print "<Font=-5>\n", ( Definitions: ), br, em( Feature Types -> ), ( related to a document type such as "full-content", "keywords" or a * meaning that the conversion is able to handle any type. ), br, em( Representation Types -> ), ( related to the underlying aspect of a given document, such as "ps", "pdf", "cmd" such as the unix pipe, * for any or just plain text "ascii". ), hr ; return ; sub print header { 12

h e a d e r and f o o t e r. print "<!-- Download links at the top of the page -->", "<table width=\"100%\" border=\"2\">", "<th width=\"100%\" colspan=4 height=\"2%\" rowspan=1 align=\"center\" nowrap>", "<a href=\"clearinghouse\" target=\"_new\"> Conversion_Clearinghouse -</a>", "<a href=\"http://www.pronir.nl\" target=\"_new\"> Pronir_Home -</a>", "<a href=\"http://www.pronir.nl/pub/spws/download.html\" target=\"_new\"> Download -</a>", "<a href=\"http://www.pronir.nl/pub/spws/docs/\" target=\"_new\"> Documentation -</a>", "<a href=\"http://www.pronir.nl/pub/spws/call.html\" target=\"_new\"> Call for Interest </a>", "</th>", "</table>", "</CENTER>\n" ; end l i s t i n g r e q u e s t. Listing 3: Results Listing! / usr / bin / p e r l Tw PROGRAM NAME r e s u l t s l i s t i n g Author : E r i c S c h a b e l l Date : 2003 02 07 E Mail : e r i c s @ c s. kun. nl Changelog : 20030711 Bug f i x in ORDER BY, nu name was t a b l e column name. use s t r i c t ; use vars $VERSION ; use CGI qw ( : a l l ) ; use DBI ; $VERSION = "1.0" ; s e t t h e s e u r l s t o r i g h t l o c a t i o n s! my $GNU URL = "Check your local GNU mirror." ; my $PRONIR URL = "http://www.pronir.nl/pub/spws/mirror/" ; my $clearinghouse db = "clearinghouse" ; my $db driver = "dbi:pg:dbname" ; or DBI : mysql : d a t a b a s e f o r MySQL. my $ d b h o s t = pgsql c l e a r i n g h o u s e. s c i. kun. nl ; my $ d b u s e r = c l e a r i n g h o u s e u s e r ; u s e r only s e l e c t a c c e s s t o db. my $db pw = ClearAtHouse ; my $db host = "localhost" ; my $db user = "pronir" ; u s e r only has s e l e c t a c c e s s t o d a t a t a b l e s. my $db pw = "pron!r" ; my $dbh = DBI >connect ( "$db_driver=$clearinghouse_db;host=$db_host", $db user, $db pw, { RaiseError = > 1); print header, "<CENTER>\n", start html ( t i t l e=> Welcome to - The PRONIR Conversion Clearinghouse!, author=> erics@cs.kun.nl, bgcolor=> lightgrey ), h1 ( ***** Browsing the PRONIR Conversion Clearinghouse ***** ), "</CENTER>\n" ; print header ( ) ; print hr ; process query ( param ( from_f ), param ( from_r ), param ( to_f ), param ( to_r ) ) ; 13

print header ( ) ; print end html ; $dbh >disconnect ( ) ; S u b r o u t i n e : p r o c e s s q u e r y. sub process query { my $from feature = s h i f t ; my $from rep = s h i f t ; my $ t o f e a t u r e = s h i f t ; my $to rep = s h i f t ; my ( $ff, $fr, $tf, $ t r ) ; for ( $from feature ) { i f (/\ * /) { $ f f = "*" e l s i f (/ key words/) { $ f f = "*" e l s i f (/ f u l l content /) { $ f f = "*" else { $ f f = $from feature for ( $from rep ) { i f (/\ * /) { $ f r = "*" else { $ f r = $from rep for ( $to feature ) { i f (/\ * /) { $ t f = "*" e l s i f (/ key words/) { $ t f = "*" e l s i f (/ f u l l content /) { $ t f = "*" else { $ t f = $ t o f e a t u r e for ( $to rep ) { i f (/\ * /) { $ t r = "*" else { $ t r = $to rep submit query ( $ff, $fr, $tf, $tr ) ; Subroutine : submit query. sub submit query { my $ f f = s h i f t ; my $ f r = s h i f t ; my $ t f = s h i f t ; my $ t r = s h i f t ; my $ i = 0 ; c o u n t e r my $ s e l e c t = "SELECT DISTINCT Routine.*, Filter.from_feature_type, Filter.from_representation_type, Filter.to_feature_type, Filter.to_representation_type, Package.pronir_url FROM Routine, Filter, Package WHERE " ; my $query = $ s e l e c t ; work out t h e From Format f i r s t. i f (! ( $ f f = / \ * / ) ) { t h e f e a t u r e t y p e has been m o d i f i e d. i f (! ( $ f r = / \ * / ) ) { t h e r e p t y p e has a l s o been m o d i f i e d. 14

$query = $query. "Filter.from_feature_type= $ff AND " ; $query = $query. "Routine.name = Filter.routine_name AND Routine.pkg_name = Package.name " ; $query = $query. "UNION " ; $query = $query. $ s e l e c t ; $query = $query. "Filter.from_representation_type= $fr AND " ; $query = $query. "Routine.name = Filter.routine_name AND Routine.pkg_name = Package.name " ; $ i ++; else { only t h e f e a t u r e t y p e has been m o d i f i e d. $query = $query. "Filter.from_feature_type= $ff AND " ; $query = $query. "Routine.name = Filter.routine_name AND Routine.pkg_name = Package.name " ; $ i ++; e l s i f (! ( $ f r = / \ * / ) ) { only t h e r e p t y p e has been m o d i f i e d. $query = $query. "Filter.from_representation_type= $fr AND " ; $query = $query. "Routine.name = Filter.routine_name AND Routine.pkg_name = Package.name " ; $ i ++; else { b o t h t y p e s a r e *, go t o TO t y p e s. now work our the To Format. i f (! ( $ t f = / \ * / ) ) { t h e f e a t u r e t y p e has been m o d i f i e d. i f (! ( $ t r = / \ * / ) ) { t h e r e p t y p e has a l s o been m o d i f i e d. i f ( $ i > 0) { $query = $query. " UNION " ; $query = $query. $ s e l e c t ; $query = $query. "Filter.to_feature_type= $tf AND " ; $query = $query. "Routine.name = Filter.routine_name AND Routine.pkg_name = Package.name " ; $query = $query. "UNION " ; $query = $query. $ s e l e c t ; $query = $query. "Filter.to_representation_type= $tr AND " ; $query = $query. "Routine.name = Filter.routine_name AND Routine.pkg_name = Package.name " ; $ i ++; else { only t h e f e a t u r e t y p e has been m o d i f i e d. i f ( $ i > 0) { $query = $query. " UNION " ; $query = $query. $ s e l e c t ; $query = $query. "Filter.to_feature_type= $tf AND " ; $query = $query. "Routine.name = Filter.routine_name AND Routine.pkg_name = Package.name " ; $ i ++; e l s i f (! ( $ t r = / \ * / ) ) { only t h e r e p t y p e has been m o d i f i e d. 15

i f ( $ i > 0) { $query = $query. " UNION " ; $query = $query. $ s e l e c t ; $query = $query. "Filter.to_representation_type= $tr AND " ; $query = $query. "Routine.name = Filter.routine_name AND Routine.pkg_name = Package.name " ; $ i ++; else { b o t h t y p e s a r e *, so do n o t h i n g. i f ( $ i = = 0 ) { D i s p l a y i n g c o m p l e t e l i s t i n g o f c o n v e r s i o n s. $query = $query. "Routine.name = Filter.routine_name AND Routine.pkg_name = Package.name " ; $query = $query. "ORDER BY name" ; display ( $query ) ; S u b r o u t i n e : d i s p l a y. sub display { my $received = s h i f t ; my $sth query = $dbh >prepare ( $received ) ; $sth query >execute ( ) ; print h2 ( These conversion routines might help you with your conversion: ), "<TABLE width=90% border=5>\n", "<TR>\n", "<td width=200><b>name</td>\n", "<td width=200><b>package Name</td>\n", "<td width=200><b>from Feature Type</td>\n", "<td width=200><b>from Representation Type</td>\n", "<td width=200><b>to Feature Type</td>\n", "<td width=200><b>to Representation Type</td>\n", "<td width=200><b>pronir URL</td>\n", "<\TR>\n" ; while ( my $ref = $sth query >fetchrow hashref ( ) ) { print "<TR>\n", "<td width=200>$ref->{ name </td>\n", "<td width=200>$ref->{ pkg_name </td>\n", "<td width=200>$ref->{ from_feature_type </td>\n", "<td width=200>$ref->{ from_representation_type </td>\n", "<td width=200>$ref->{ to_feature_type </td>\n", "<td width=200>$ref->{ to_representation_type </td>\n" ; i f ( $ref >{ pronir_url = /\$PRONIR/) { print "<td width=300> <a href=\"${pronir_url$ref->{ pkg_name.tar.bz2\" >Download pkg here</a></td>\n" ; else { print "<td width=300><a href=\"$ref-> { pronir_url $ref->{ pkg_name.tar.bz2\" >Download pkg here</a></td>\n" ; print "</TR>\n" ; print "</TABLE>\n", 16

br, em( *If this table is empty, there were no results matching your selections... ) ; $sth query >f i n i s h ( ) ; sub print header { h e a d e r and f o o t e r. print "<!-- Download links at the top of the page -->", "<table width=\"100%\" border=\"2\">", "<th width=\"100%\" colspan=4 height=\"2%\" rowspan=1 align=\"center\" nowrap>", "<a href=\"clearinghouse\" target=\"_new\" >Conversion_Clearinghouse -</a>", "<a href=\"http://www.pronir.nl\" target=\"_new\"> Pronir_Home -</a>", "<a href=\"http://www.pronir.nl/pub/spws/download.html\" target=\"_new\"> Download -</a>", "<a href=\"http://www.pronir.nl/pub/spws/docs/\" target=\"_new\"> Documentation -</a>", "<a href=\"http://www.pronir.nl/pub/spws/call.html\" target=\"_new\"> Call for Interest </a>", "</th>", "</table>", "</CENTER>\n" ; end r e s u l t s l i s t i n g.! / usr / bin / p e r l Tw PROGRAM NAME s u b m i t c o n v e r s i o n Author : E r i c S c h a b e l l Date : 2003 01 06 E Mail : e r i c s @ c s. kun. nl Changelog : 20030624 R e l e a s e 1. 0 use s t r i c t ; use vars $VERSION ; use CGI qw ( : a l l ) ; use Mail : : Sendmail ; $VERSION = "1.0" ; Listing 4: Submitting Conversion P l e a s e s e t a v a l i d s e r v e r h e r e. unshift @{$Mail : : Sendmail : : mailcfg{ smtp, smtp-srv.cs.kun.nl ; kun u n s h i f t @{$Mail : : Sendmail : : m a i l c f g { smtp, kubsus. kub. nl ; uvt s e t u r l s f o r c o r r e c t s e r v e r environment. my $ d i s p l a y s u b m i t u r l = h t t p : / / l o c a l h o s t / cgi bin / d i s p l a y s u b m i t ; CGI html form below. my @ t y p e l i s t = ( "", "ps", "ascii", "pdf" ) ; my @ a s p e c t l i s t = ( "", "*", "full-content", "keywords" ) ; my $type from menu value = "From Type" ; my $aspect from menu value = "From Aspect" ; my $type to menu value = "To Type" ; my $aspect to menu value = "To Aspect" ; 17

c r e a t e s u b m i s s i o n form. print header, start html ( t i t l e=> Welcome to - The PRONIR Conversion Clearinghouse!, author=> pronir-conversion@cs.kun.nl, bgcolor=> lightgrey ), ( "<CENTER>\n" ), h1 ( ***** PRONIR Conversion Submit Form ***** ), ( "</CENTER>\n" ) ; print header ( ) ; print hr, ( "To submit a conversion to the PRONIR Clearinghouse, please fill in the following form." ), br ( "This form will be submitted to our administration, you will be contacted upon acceptance/denial." ), p( "Thank you for contributing to the PRONIR project!" ), hr, start form, h3 ( Conversion submission form: ), ( Please fill in the name of the conversion tool/application: ), t e x t f i e l d ( name=> name, size =>37), p( Please enter the location of the source or website (URL):, t e x t f i e l d ( name=> source site, s i z e = >37)), p( Please enter your contact e-mail, only valid entries will be sent:, t e x t f i e l d ( name=> address, s i z e = >31)), p, submit, end form, hr, end html ; i f ( param ( ) ) { The only i m p o r t a n t s e c u r i t y measure i s t o e n s u r e t h a t t h e e m a i l i s v a l i d and not messing with s t r a n g e c h a r a c t e r s ( l i k e * < > ). my $mail from = param ( address ) ; my $tool name = param ( name ) ; my $location = param ( source site ) ; i f ( ( not $mail from ) or ( $mail from! / \@/ ) ) { print h2 ( Please enter a valid e-mail address... ) ; e l s i f ( $mail from = t r /;<>? * &$! [ ] % { : / / ) { print h2 ( Please enter a valid e-mail address and quit being sneaky... ) ; e l s i f ( not $tool name ) { print h2 ( Please enter the name of the conversion tool/application... ) ; e l s i f ( ( not $ l o c a t i o n ) or ( $ l o c a t i o n! / http :\/\/\w+\.\w+/)) { print h2 ( Please enter a valid URL as the sources location... ) ; else { my %mail = ( To => pronir-conversion@cs.kun.nl, From => pronir-clearinghouse@cs.kun.nl, Bcc => Someone <him@there. com >, Someone e l s e h e r @ t h e r e. com, Subject => "A PRONIR Clearinghouse submission from $mail_from", X-Mailer = > "Pronir Clearinghouse Mail::Sendmail submission", Message => "conversion tool: $tool_name source location: $location submit from : $mail_from" 18

) ; i f ( sendmail %mail ) { print h2 ( Mail sent to PRONIR Clearinghouse! ) ; can turn t h i s on f o r l o g g i n g by w r i t i n g t o f i l e. p r i n t \ n\$mail : : Sendmail : : l o g s a y s :\ n, $Mail : : Sendmail : : l o g ; else { print h2 ( "Error sending mail: $Mail::Sendmail::error" ) ; sub print header { h e a d e r and f o o t e r. print "<!-- Download links at the top of the page -->", "<table width=\"100%\" border=\"2\">", "<th width=\"100%\" colspan=4 height=\"2%\" rowspan=1 align=\"center\" nowrap>", "<a href=\"clearinghouse\" target=\"_new\">conversion_clearinghouse -</a>", "<a href=\"http://www.pronir.nl\" target=\"_new\"> Pronir_Home -</a>", "<a href=\"http://www.pronir.nl/pub/spws/download.html\" target=\"_new\"> Download -</a>", "<a href=\"http://www.pronir.nl/pub/spws/docs/\" target=\"_new\"> Documentation -</a>", "<a href=\"http://www.pronir.nl/pub/spws/call.html\" target=\"_new\"> Call for Interest </a>", "</th>", "</table>", "</CENTER>\n" ; end submit converion.! / usr / bin / p e r l Tw PROGRAM NAME o b t a i n c o n v e r s i o n Author : E r i c S c h a b e l l Date : 2003 01 08 E Mail : e r i c s @ c s. kun. nl Changelog : 20030624 R e l e a s e 1. 0 use s t r i c t ; use vars $VERSION ; use CGI qw ( : a l l ) ; use DBI ; $VERSION = "1.0" ; Listing 5: Retrieving Conversions my @ c o n v e r s i o n l i s t = ( ) ; my $conversion names = "Conversions" ; my $clearinghouse db = "clearinghouse" ; my $db driver = "dbi:pg:dbname" ; or DBI : mysql : d a t a b a s e f o r MySQL. my $ d b h o s t = pgsql c l e a r i n g h o u s e. s c i. kun. nl ; my $ d b u s e r = c l e a r i n g h o u s e u s e r ; my $db pw = ClearAtHouse ; my $db host = "localhost" ; my $db user = "pronir" ; 19

my $db pw = "pron!r" ; my $ l i s t s e l e c t = "SELECT DISTINCT name FROM Routine" ; Apparently e v e r y c g i s c r i p t runs i t s e l f a g a i n a f t e r submit b u t t o n i s p r e s s e d, so w i l l make t h e c h e c k s f o r s e l e c t i o n f i r s t and i f t h i s i s t h e f i r s t run i t w i l l p r i n t t h e f r o n t page t o a l l o w f o r u s e r i n p u t. Otherwise i t w i l l r e a c t t o t h e b u t t o n s e l e c t e d and p r o c e s s t h e u s e r s r e q u e s t... < sigh >, web development... w h e e e e e.... i f ( param ( ) ) { else { my $cl = param ( $conversion names ) ; print r e d i r e c t ( "http://localhost/cgi-bin/obtaining_results?conversion=$cl" ) ; Setup l i s t f o r s e l e c t i o n menu. my $dbh = DBI >connect ( "$db_driver=$clearinghouse_db;host=$db_host", $db user, $db pw, { RaiseError = > 1); my $ s t h l i s t = $dbh >prepare ( $ l i s t s e l e c t ) ; $ s t h l i s t >execute ( ) ; while (my $ r e f = $ s t h l i s t >fetchrow hashref ( ) ) { @ conversion list = ( @ conversion list, $ref >{ name ) ; $ s t h l i s t >f i n i s h ( ) ; print header, start html ( t i t l e=> Welcome to - The PRONIR Conversion Clearinghouse!, author=> erics@cs.kun.nl, bgcolor=> lightgrey ), "<CENTER>\n", h1 ( ***** Obtaining a conversion from the PRONIR Conversion Clearinghouse ***** ), "</CENTER>\n" ; print header ( ) ; print hr, start form, h2 ( To obtain a conversion, please select from the list below: ), p, br ( Clearinghouse conversions: ), popup menu( name=>$conversion names, values=>\@ conversion list, d e f a u l t=> - ), p, submit, end form, hr, end html ; $dbh >disconnect ( ) ; sub print header { h e a d e r and f o o t e r. print "<!-- Download links at the top of the page -->", "<table width=\"100%\" border=\"2\">", "<th width=\"100%\" colspan=4 height=\"2%\" rowspan=1 align=\"center\" nowrap>", "<a href=\"clearinghouse\" target=\"_new\">conversion_clearinghouse -</a>", "<a href=\"http://www.pronir.nl\" target=\"_new\"> Pronir_Home -</a>", "<a href=\"http://www.pronir.nl/pub/spws/download.html\" target=\"_new\"> Download -</a>", 20

"<a href=\"http://www.pronir.nl/pub/spws/docs/\" target=\"_new\"> Documentation -</a>", "<a href=\"http://www.pronir.nl/pub/spws/call.html\" target=\"_new\"> Call for Interest </a>", "</th>", "</table>", "</CENTER>\n" ; end o b t a i n c o n v e r s i o n. =head1 Obtain Conversion F<obtain conversion > CGI s c r i p t t h a t allows a user to s e l e c t a conversion routine from the PRONIR Conversion Clearinghouse. =head1 Version This document r e f e r s to version <1.0> of F<obtain conversion >, released on 2 4. 0 6. 2 0 0 3. =head1 Usage Can be reached via a submit from the the F<clearinghouse > f i l e via URL/cgi bin/ clearinghouse and s e l e c t i n g the obtain a conversion routine option. =head1 Description F<obtain conversion > gives the user a pull down menu from which to s e l e c t an available conversion routine from the conversions available. =head2 Overview This s c r i p t allows for conversion routine s e l e c t i o n. =head1 Environment Not r e l i a n t on any environment variables. =head1 Bugs Description of known bugs ( and any workarounds ). Please send any information about bugs to < erics@ cs. kun. nl >. =head1 F i l e s This f i l e i s reached from the F<clearinghouse > f i l e and will lead to the F<o b t a i n i n g r e s u l t s > f i l e. =head1 See Also Documentation for F<clearinghouse > and F<o b t a i n i n g r e s u l t s >. =head1 Author Eric D. Schabell erics@cs. kun. nl =head1 Copyright Copyright ( c ) 2 0 0 3, Eric D. Schabell. All Rights Reserved. This module i s free software. I t may be used, redistributed and/or modified under the same terms as Perl i t s e l f. =cut! / usr / bin / p e r l Tw PROGRAM NAME o b t a i n i n g r e s u l t s Listing 6: Retrieval Results 21

Author : E r i c S c h a b e l l Date : 3003 02 14 E Mail : e r i c s @ c s. kun. nl Changelog : 20030624 R e l e a s e 1. 0 use s t r i c t ; use vars $VERSION ; use CGI qw ( : a l l ) ; use DBI ; $VERSION = "1.0" ; my $clearinghouse db = "clearinghouse" ; my $db driver = "dbi:pg:dbname" ; or DBI : mysql : d a t a b a s e f o r MySQL. my $ d b h o s t = pgsql c l e a r i n g h o u s e. s c i. kun. nl ; my $ d b u s e r = c l e a r i n g h o u s e u s e r ; my $db pw = ClearAtHouse ; my $db host = "localhost" ; my $db user = "pronir" ; my $db pw = "pron!r" ; my $PRONIR URL = "http://www.pronir.nl/pub/spws/mirror/" ; my $conversion name = param ( conversion ) ; my $dbh = DBI >connect ( "$db_driver=$clearinghouse_db;host=$db_host", $db user, $db pw, { RaiseError = > 1); my $query = "SELECT DISTINCT Routine.*, Filter.from_representation_type, Filter.to_representation_type, Package.pronir_url FROM Filter, Routine, Package WHERE Routine.name= $conversion_name AND Routine.pkg_name = Package.name AND Routine.name = Filter.routine_name" ; my $sth query = $dbh >prepare ( $query ) ; $sth query >execute ( ) ; print header, start html ( t i t l e=> Welcome to - The PRONIR Conversion Clearinghouse!, author=> erics@cs.kun.nl, bgcolor=> lightgrey ), "<CENTER>\n", h1 ( ***** Obtaining a conversion from the PRONIR Conversion Clearinghouse ***** ), "</CENTER>\n" ; print header ( ) ; print hr, h2 ( To obtain the selected conversion, see information below: ), "<FONT=+5>" ; while ( my $ r e f = $sth query >fetchrow hashref ( ) ) { print "<FONT=+5>", "<TABLE width=70% border=0>\n", "<TR>\n", "<TD width=300>", em( Conversion name -> ), "<TD width=300>", b ( "$ref->{ name " ), "<TD>\n", "</TR>\n", "<TR>\n", "<TD width=300>", em( Package containing conversion -> ), 22

"<TD width=300>", b ( "$ref->{ pkg_name " ), "<TD>\n", "</TR>\n", "<TR>\n", "<TD width=300>", em( Converts from -> ), "<TD width=300>", b ( "$ref->{ from_representation_type " ), "<TD>\n", "</TR>\n", "<TR>\n", "<TD width=300>", em( Converts to -> ), "<TD width=300>", b ( "$ref->{ to_representation_type " ), "<TD>\n", "</TR>\n" ; for ( $ref >{ pronir_url ) { i f (/\$PRONIR/) {print "<TR>\n", "<TD width=300>", em( Clearinghouse package location -> ), "<TD width=300>", ( <a href= ), ( "${PRONIR_URL$ref->{ pkg_name.tar.bz2" ), ( >Clearinghouse Mirror Download.</a> ), ( "\n" ), "<TD>\n", "</TR>\n" else {print "<TR>\n", "<TD width=300>", em( Clearinghouse package location -> ), "<TD width=300>", ( <a href= ), ( "$ref->{ orig_url $ref->{ pkg_name.tar.bz2" ), ( >Clearinghouse Mirror Download.</a> ), ( "\n" ), "<TD>\n", "</TR>\n" $sth query >f i n i s h ( ) ; print end html ; $dbh >disconnect ( ) ; end o b t a i n i n g r e s u l t s. sub print header { h e a d e r and f o o t e r. print "<!-- Download links at the top of the page -->", "<table width=\"100%\" border=\"2\">", "<th width=\"100%\" colspan=4 height=\"2%\" rowspan=1 align=\"center\" nowrap>", "<a href=\"clearinghouse\" 23

target=\"_new\">conversion_clearinghouse -</a>", "<a href=\"http://www.pronir.nl\" target=\"_new\"> Pronir_Home -</a>", "<a href=\"http://www.pronir.nl/pub/spws/download.html\" target=\"_new\"> Download -</a>", "<a href=\"http://www.pronir.nl/pub/spws/docs/\" target=\"_new\"> Documentation -</a>", "<a href=\"http://www.pronir.nl/pub/spws/call.html\" target=\"_new\"> Call for Interest </a>", "</th>", "</table>", "</CENTER>\n" ; end o b t a i n i n g r e s u l t s. References [GPB03a] B. van Gils, H.A. Proper, and P. van Bommel. A conceptual model for information suppy. Technical Report NIII-R0313, Nijmegen Institute for Information and Computing Sciences, University of Nijmegen, Nijmegen, The Netherlands, EU, 2003. Accepted for publication in Data & Knowledge Engineering. [GPB03b] B. van Gils, H.A. Proper, and P. van Bommel. Towards a general theory for information supply. In C. Stephanidis, editor, Proceedings of the 10th International Conference on Human-Computer Interaction, pages 720 724, Crete, Greece, EU, 2003. ISBN 0805849300 [GS03] B. van Gils and E.D. Schabell. User-profiles for information retrieval. In Proceedings of the 15th Belgian-Dutch Conference on Artificial Intelligence (BNAIC 03), Nijmegen, The Netherlands, October 2003. [MyS03] MySQL Website, 2003. http://www.mysql.com [Pos03] Postgres SQL Website, 2003. http://www.postgresql.org [Sch02] Eric D. Schabell. Resource access in generic information retrieval systems. Master s thesis, Vrije Universiteit, Amsterdam, Netherlands, 2002. 24