You are on page 1of 205

D

DEPARTAMENTO EPARTAMENTO
DE DE
I
INGENIERA NGENIERA
DE DE
S
SISTEMAS ISTEMAS
Y Y
A
AUTOMTICA UTOMTICA
E ESCUELA SCUELA T TCNICA CNICA S SUPERIOR UPERIOR DE DE I INGENIEROS NGENIEROS E.S.I. E.S.I.
U UNIVERSIDAD NIVERSIDAD DE DE S SEVILLA EVILLA
P PROYECTO ROYECTO F FIN IN DE DE C CARRERA ARRERA
SISTEMA DE GESTIN DOCUMENTAL A
TRAVS DE INTERNET
I INGENIERA NGENIERA DE DE T TELECOMUNICACIN ELECOMUNICACIN
A AUTOR UTOR: C : CARLOS ARLOS A ALBERTO LBERTO G GARCA ARCA LVAREZ LVAREZ
T TUTOR UTOR: E : EDUARDO DUARDO F FERNNDEZ ERNNDEZ C CAMACHO AMACHO
SEVILLA, FEBRERO DE 2007
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
2
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
NDICE DEL PROYECTO "SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE
INTERNET"
1. Anlisis de Antecedentes............................................................................................. 6
1.1. Bases de Datos..................................................................................................... 6
1.1.1. MySQL........................................................................................................... 6
1.1.2. PHP............................................................................................................... 9
1.1.3. HTML.......................................................................................................... 10
1.2. Mtodos d!cati"os........................................................................................... 11
1.2.1. Matla#......................................................................................................... 12
1.2.2. Mic$oso%t &is!al St!dio .'T.................................................................... 1(
2. Anlisis de )acti#ilidad............................................................................................ 21
3. *#+eti"os del P$oyecto.............................................................................................. 22
3.1. Act!ali,aci-n A!to.tica de Bases de Datos.................................................. 22
3.2. /e0!isitos P$e"ios 1a$a la Act!ali,aci-n A!to.tica.................................... 22
3.2.1. MySQL Se$"e$............................................................................................ 23
3.2.2. MySQL 2ont$ol 2ente$.............................................................................. 26
3.2.3. A1ac3e 4e# Se$"e$.................................................................................... 25
3.2.6. PHP............................................................................................................ 29
3.2.7. 8$o!19e#................................................................................................... 33
3.2.7.1. 2o1ia Local del Sitio 4e#................................................................... 36
3.2.7.2. /esta!$aci-n de la Base de Datos..................................................... 36
3.2.7.2.1. :nt$od!cci-n al 2o.ando ;.ys0ld!.1;.................................... 36
3.2.7.2.2. /esta!$aci-n de la Base de Datos a T$a"s de Mys0ld!.1..... 3(
3.2.7.3. st$!ct!$a del Sitio 4e#.................................................................... 60
3.2.7.6. /elaci-n ent$e las Ta#las de la Base de Datos.................................. 60
3.3. 2ont$ol /e.oto de P$ocesos en Tie.1o /eal Mediante Matla#<Tc1<:1........67
3.6. /e0!isitos P$e"ios 1a$a el 2ont$ol /e.oto..................................................... 67
3.6.1. Mic$oso%t &is!al .'T................................................................................ 67
3.6.2. Matla# 6.7.................................................................................................. 66
6. Metodolo=>a.............................................................................................................. 65
6.1. Act!ali,aci-n A!to.tica de Bases de Datos................................................... 65
6.1.1. Paso 1 ? &alidaci-n.................................................................................... 69
6.1.2. Paso 2 ? Selecci-n de %ic3e$os e :nse$ci-n de /!tas................................. 70
6.1.3. Paso 3 ? Selecci-n de 2a.1os de la Act!ali,aci-n................................... 73
6.1.6. Paso 6 ? 2o.1leci-n de nt$adas 1a$a Act!ali,aci-n............................ 77
6.1.7. )ic3e$o de :ncl!si-n 8ene$al..................................................................... 60
6.2. 2ont$ol /e.oto de P$ocesos en Tie.1o /eal .ediante Matla#<T2P<:P....... 61
6.2.1. st$!ct!$a 8ene$al del Siste.a de 2ont$ol /e.oto................................ 63
6.2.2. Se$"i=a$..................................................................................................... 66
6.2.2.1. :nte$%a, 4e#....................................................................................... 66
6.2.2.2. A1licaci-n Se$"ido$ en Se$"i=a$........................................................ 65
6.2.3. 'eo@ite....................................................................................................... 69
6.2.3.1. Blo0!e T!nnin= ASB)!nctionC............................................................. 69
6.2.3.2. A1licaci-n Matla#............................................................................... 51
3
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
6.2.3.3. A1licaci-n 2liente............................................................................... 52
6.2.3.6. A1licaci-n Se$"ido$............................................................................ 56
6.2.6. D#icaci-n y P!esta a P!nto de los P$o=$a.as......................................... 57
6.2.7. +e.1lo 2o.1leto de 2ont$ol /e.oto...................................................... 55
7. /es!ltados @1e$i.entales...................................................................................... (6
7.1. Siste.a de Act!ali,aci-n de Bases de Datos.................................................... (6
7.2. 2ont$ol /e.oto de Dna Planta a T$a"s de Dna :nte$%a, 4e# Dsando
Matla#...................................................................................................................... (5
6. 2onco$dancia nt$e /es!ltados y *#+eti"os........................................................... ((
6.1. Siste.a de Act!ali,aci-n de Bases de Datos.................................................... ((
6.2. 2ont$ol /e.oto de Planta Mediante Matla#<T2P<:P.................................... ((
5. 2oncl!siones............................................................................................................. (9
5.1. Act!ali,aci-n A!to.tica de Base de Datos.................................................... (9
5.2. 2ont$ol /e.oto de Siste.as .ediante Matla#<Si.!linE............................... 90
(. )!t!$as Me+o$as AL>neas de :n"esti=aci-nC............................................................. 91
9. Bi#lio=$a%>a............................................................................................................... 93
10. Ane@os..................................................................................................................... 96
10.1. 2ontenidos del 2DB/o................................................................................... 96
10.2. Man!al de DsoF Siste.a de Act!ali,aci-n de Bases de Datos...................... 96
10.2.1. :nstalaci-n................................................................................................ 96
10.2.2. Dsando el Siste.a de Act!ali,aci-n de Bases de Datos......................... 96
10.2.2.1. Act!ali,a$ Base de Datos.................................................................. 95
10.2.2.2. dita$ )ic3e$o de De%inici-n de P!#licaciones............................... 9(
10.2.2.3. 2$ea$ 2o1ia de Se=!$idad de la Base de Datos...............................99
10.2.2.6. /esta!$a$ 2o1ia de Se=!$idad de la Base de Datos....................... 99
10.3. Man!al de DsoF Siste.a de 2ont$ol /e.oto............................................... 100
10.3.1. :nstalaci-n.............................................................................................. 100
10.3.2. Dsando el 2ont$ol /e.oto..................................................................... 101
10.6. 2-di=o )!ente................................................................................................ 103
10.6.1. Siste.a de Act!ali,aci-n de Bases de Datos......................................... 103
10.6.1.1. D1date.3t.l..................................................................................... 103
10.6.1.2. Paso1.131......................................................................................... 107
10.6.1.3. Paso2.131........................................................................................ 106
10.6.1.6. Paso3.131......................................................................................... 111
10.6.1.7. P$ocG%iles.131.................................................................................. 125
10.6.1.6. BacE!1.131...................................................................................... 130
10.6.1.5. P!#sGedito$.131.............................................................................. 137
10.6.1.(. )!nctions.inc.131............................................................................ 135
10.6.1.9. )!nctions.ste13.131........................................................................ 166
10.6.1.10. Hel1.3t.l....................................................................................... 165
10.6.2. 2ont$ol /e.oto de P$ocesos .ediante Matla#<T2P<:P.......................150
10.6.2.1. T!nnin=.as1@.cs.............................................................................. 150
10.6.2.2. c1Gse$"e$Gse$"i=a$........................................................................ 156
10.6.2.3. T!nnin=.c........................................................................................ 1(7
10.6.2.6. Sendtose$"i=a$.............................................................................. 191
10.6.2.7. c1GclientGneo@ite............................................................................ 193
10.6.2.6. c1Gse$"e$Gneo@ite.......................................................................... 19(
4
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
5
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
1 ANLISIS DE ANTECEDENTES .
1.1 BASES DE DATOS .
Hoy en da las bases de datos son la base de muchos sistemas de almacenamiento de
informacin. Sin ellas, la informacin de que se dispone se encontrara desperdigada,
ilocalizable en las situaciones de necesidad, con las consiguientes repercusiones que ello
tiene en una sociedad de la informacin como es aquella en la que nos encontramos.
Una posible definicin de "base de datos" es "conjunto de datos que pertenecen al
mismo conteto almacenados sem!nticamente para su posterior uso". "as bases de datos
permiten, por tanto, almacenar y clasificar los datos de forma ordenada. #s por ello que se
antojan una herramienta necesaria y de uso obligado en la mayora de sistemas actuales.
#l incon$eniente que presentan es su mantenimiento. #l tiempo de mantenimiento de
una base de datos aumenta eponencialmente con el $olumen de datos a actualizar.
#ste incon$eniente se agra$a si con la misma informacin hay que actualizar distintas
bases de datos. #s ine$itable tener que actualizar una base de datos, pero el problema de
actualizar $arias con la misma informacin %o con informacin similar& se paliara en gran
medida si se dispusiera de un sistema con cierta inteligencia que realizara el tras$ase de
informacin de una base de datos a las dem!s.
'icho sistema inteligente debe emplear tecnologas especficas que soporten el manejo
de bases de datos. #ntre ellas se encuentran (yS)", *H* o H+(", cuyas caractersticas
se abordan en los siguientes apartados.
1.1.1 MYSQL.
(yS)" es un sistema de gestin de base de datos, multihilo y multiusuario.
(yS)" es un sistema de administracin de bases de datos. Una base de datos es una
coleccin estructurada de datos. #sta puede ser desde una simple lista de compras a una
galera de pinturas hasta el $asto $olumen de informacin en un red corporati$a. *ara
agregar, acceder a y procesar datos guardados en un computador, se necesita un
administrador como (yS)" Ser$er. 'ado que los ordenadores son muy buenos manejando
6
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
grandes cantidades de informacin, los administradores de bases de datos juegan un papel
central en computacin, como aplicaciones independientes o como parte de otras
aplicaciones.
S)" %Standard )uery "anguage& es un lenguaje estandarizado de base de datos
relacionantes, el cual nos permite realizar tablas y obtener datos de ella de manera muy
sencilla. ,racias a -l podemos realizar di$ersos tipos de operaciones sobre una base de
datos.
S)" trabaja con una estructura de dos capas, o sea, con una estructura cliente.ser$idor.
#l cliente comienza el proceso mediante el en$o de una consulta, el ser$idor la recibe, la
procesa y de$uel$e un resultado. #l cliente es el que realiza la mayor parte de la tarea ya
que se encarga de mostrar los datos por pantalla, presentar informes tabulados, imprimir,
guardar, etc, dejando al ser$idor libre para otras tareas.
(yS)" es un sistema de administracin relacional de bases de datos. Una base de
datos relacional archi$a datos en tablas separadas en $ez de colocar todos los datos en un
gran archi$o. #sto permite $elocidad y fleibilidad. "as tablas est!n conectadas por
relaciones definidas que hacen posible combinar datos de diferentes tablas sobre pedido.
(yS)" es soft/are de cdigo abierto %open source&. 0uente abierta significa que es
posible para cualquier persona usarlo y modificarlo. 1ualquier persona puede bajar el cdigo
fuente de (yS)" y usarlo sin pagar. 1ualquier interesado puede estudiar el cdigo fuente y
ajustarlo a sus necesidades. (yS)" usa el ,*" %,2U ,eneral *ublic "icense& para definir
qu- puede hacer y qu- no puede hacer con el soft/are en diferentes situaciones.
Un aspecto importante en el dise3o de una base de datos reside en la eleccin de los
ndices y e$itando hacer escaneos completos de las tablas.
"os ndices son usados para encontrar r!pidamente los registros que tengan un
determinado $alor en alguna de sus columnas. Sin un ndice, (yS)" tiene que iniciar la
b4squeda con el primer registro y leer a tra$-s de toda la tabla para encontrar los registros
rele$antes. 54n en tablas peque3as, de unos 6777 registros, es por lo menos 677 $eces
m!s r!pido leer los datos usando un ndice que haciendo una lectura secuencial.
1uando (yS)" trata de responder una consulta, eamina una $ariedad de estadsticas
acerca de los datos, y decide cmo buscar los que deseamos de la manera m!s r!pida. Sin
embargo, como se acaba de mencionar, cuando en una tabla no eisten ndices en los
cuales pueda auiliarse (yS)" para resol$er una consulta, se tendr!n que leer todos los
registros de la tabla de manera secuencial. #sto es com4nmente llamado un 8escaneo
7
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
completo de una tabla9, y es muchas $eces algo que se debe e$itar.
#n particular, se deben e$itar las escaneos completos de tablas por las siguientes
razones:
Sobrecarga de 1*U: #l proceso de comprobar cada uno de los registros en una
tabla es insignificante cuando se tienen pocos datos, pero puede con$ertirse en un
problema a medida que $a aumentando la cantidad de registros en nuestra tabla.
#iste una relacion proporcional entre el numero de registros que tiene una tabla y la
cantidad de tiempo que le toma a (yS)" re$isarla completamente.
1oncurrencia: (ientras (yS)" est! leyendo los datos de una tabla, -ste la
bloquea, de tal manera que nadie m!s puede escribir en ella, aunque s pueden
leerla. 1uando (yS)" est! actualizando o eliminando filas de una tabla, -ste la
bloquea, y por lo tanto nadie puede al menos leerla.
Sobrecarga de disco: #n una tabla muy grande, un escaneo completo consume
una gran cantidad de entrada.salida en el disco. #sto puede alentar
significati$amente el ser$idor de bases de datos, especialmente si se tiene un disco
;'# algo antiguo.
#n resumen, lo mejor es intentar que los escaneos completos de tablas sean minimos
%especialmente si la aplicacin necesita escalabilidad en tama3o, n4mero de usuarios, o
ambos&.
#s en estos casos donde la indeacin puede ayudar. 'e manera simple, un ndice le
permite a (yS)" determinar si un $alor dado coincide con cualquier fila en una tabla.
1uando se indea una columna en particular, (yS)" crea otra estructura de datos %un
ndice& que usa para almacenar informacin etra acerca de los $alores en la columna
indeada. "os $alores indeados son llamados frecuentemente cla$es. 5unque -sta es la
manera simple de eplicar los ndices, realmente es un poco mas complejo, ya que (yS)"
almacena todas las cla$es del ndice en una estructura de datos de !rbol. #sta estructura de
datos de !rbol le permite a (yS)" encontrar cla$es muy r!pidamente.
1uando (yS)" determine la eistencia de un ndice en una columna, lo usar! en $ez de
hacer un escaneo completo de la tabla. #sto reduce de manera importante los tiempos de
1*U y las operaciones de entrada.salida en disco, a su $ez que se mejora la concurrencia
porque (yS)" bloquear! la tabla 4nicamente para obtener las filas que necesite %en base a
lo que encontr en el ndice&. 1uando tenemos grandes cantidades de datos en nuestras
tablas, la mejora en la obtencion de los datos puede ser muy significati$a.
8
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
1.1.2 PHP.
*H* es un lenguaje de programacin usado generalmente para la creacin de
contenidos de sitios /eb. #l nombre es el acrnimo recursi$o de "*H*: Hypertet
*reprocessor" %inicialmente "*H* +ools" o "*ersonal Home *age +ools"& y se trata de un
lenguaje interpretado usado para la creacin de aplicaciones para ser$idores, o creacin de
contenido din!mico para sitios /eb.
"a interpretacin del cdigo en lenguaje *H* y su ejecucin se da en el ser$idor, en el
cual se encuentra almacenado el script, y el cliente slo recibe el resultado de la ejecucin.
1uando el cliente hace una peticin al ser$idor para que le en$e una p!gina /eb, generada
por un script *H*, el ser$idor ejecuta el int-rprete de *H*, el cual procesa el script
solicitado que generar! el contenido de manera din!mica, pudiendo modificar el contenido a
en$iar, y regresa el resultado al ser$idor, el cual se encarga de regres!rselo al cliente.
*H* permite la conein a diferentes tipos de ser$idores de bases de datos, entre ellos
el que interesa para el presente proyecto %(yS)"&.
*H* tambi-n tiene la capacidad de ser ejecutado en distintos sistemas operati$os, entre
los que se incluyen <indo/s y "inu %los dos sistemas operati$os sobre los que se prueba
el script realizado aqu&.
"os principales usos de *H* son los siguientes:
*rogramacin de p!ginas /eb din!micas, habitualmente en combinacin con el
motor de bases de datos (yS)", aunque cuenta con soporte nati$o para otros
motores, incluyendo el est!ndar ='>1, lo que ampla en gran medida sus
posibilidades de conein.
*rogramacin en consola, al estilo de *erl o Shell scripting.
1reacin de aplicaciones gr!ficas independientes del na$egador, por medio de la
combinacin de *H* y ,+? %,imp +ool ?it&, lo que permite desarrollar aplicaciones
de escritorio en los sistemas operati$os en que est! soportado.
"as $entajes de *H* son que se trata de un lenguaje multiplataforma, posee capacidad
de conein con la mayora de los manejadores de bases de datos que se utilizan en la
actualidad, permite leer y manipular datos desde di$ersas fuentes %incluyendo los datos que
pueden ingresar los usuarios desde formularios H+("&, posee capacidad de epandir su
potencial utilizando la enorme cantidad de mdulos %tambi-n conocidos como "etensiones"&
9
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
de que dispone, es libre, se encuentra muy bien documentado y por 4ltimo nos permite crear
formularios /eb.
"a mayora de estas $entajas ser!n eplotadas para la realizacin del script de
actualizacin de la p!gina /eb.
1.1.3 HTML.
H+(" %acrnimo ingl-s de "Hyper+et (ar@up "anguage"& es un lenguaje de marcacin
dise3ado para estructurar tetos y presentarlos en forma de hiperteto, que es el formato
est!ndar de las p!ginas /eb. ,racias a ;nternet y a los na$egadores del tipo ;nternet
#plorer, =pera, 0irefo o 2etscape, el H+(" se ha con$ertido en uno de los formatos m!s
populares que eisten para la construccin de documentos y tambi-n de los m!s f!ciles de
aprender.
H+(" es una aplicacin de S,(" conforme al est!ndar internacional ;S= AABC. DH+("
es una reformulacin de H+(" E como aplicacin D(" 6.7, y que supone la base para la
e$olucin estable de este lenguaje. 5dem!s, DH+(" permite la compatibilidad con los
agentes de usuario que ya admitan H+(" E siguiendo un conjunto de reglas.
#l lenguaje H+(" puede ser creado y editado con cualquier editor de tetos b!sico,
como puede ser el >loc de 2otas de <indo/s %o Notepad&, o cualquier otro editor que
admita teto sin formato como ,2U #macs, (icrosoft <ordpad, +et*ad, Fim, 2otepadGG,
etc.
#isten adem!s, otros programas para la realizacin de sitios <eb o edicin de cdigo
H+(", como por ejemplo (icrosoft 0ront*age, el cual tiene un formato b!sico parecido al
resto de los programas de =ffice. +ambi-n eiste el famoso soft/are de (acromedia %que
adquiri la empresa 5dobe& llamado 'ream/ea$er, siendo uno de los m!s utilizados en el
!mbito de dise3o y programacin <eb. #stos programas se les conoce como editores
<HS;<H, o <hat Hou See ;s <hat Hou ,et %en espa3ol: 8lo que $es es lo que obtienes9&.
#sto significa que son editores que $an mostrando el resultado de lo que se est! editando
en tiempo real a medida que se $a desarrollando el documento. 5hora bien, esto no significa
una manera distinta de realizar sitios /eb, sino que una forma un tanto m!s simple ya que
estos programas, adem!s de tener la opcin de trabajar con la $ista preliminar, tiene su
propia seccin H+(" la cual $a generando todo el cdigo a medida que se $a trabajando.
1ombinar estos dos m-todos resulta muy interesante, ya que de alguna manera se
10
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
ayudan entre s. *or ejemploI si se est! editando todo en H+(" y de pronto se ol$ida alg4n
cdigo o etiqueta, simplemente hay que dirigirse al editor $isual o <HS;<H, y continuar ah
la edicin, o $ice$ersa, ya que hay casos en que es m!s r!pido y f!cil escribir directamente
el cdigo de alguna caracterstica que se quiera adherirle al sitio, que buscar la opcin en el
programa mismo.
H+(" utiliza etiquetas o marcas, que consisten en bre$es instrucciones de comienzo y
final, mediante las cuales se determinan la forma en la que debe aparecer en el na$egador
el teto, as como tambi-n las im!genes y los dem!s elementos, en la pantalla del
ordenador.
+oda etiqueta se identifica porque est! encerrada entre los signos 8menor que9 y 8mayor
que9 %J y K, respecti$amente&, y algunas tienen atributos que pueden tomar alg4n $alor. #n
general las etiquetas se aplicar!n de dos formas especiales:
Se abren y se cierran, como por ejemplo: JbKnegritaJ.bK que se $era en el
na$egador como negrita.
2o pueden abrirse y cerrarse, como JhrK que se $era en su na$egador como una
lnea horizontal %aunque en el nue$o est!ndar DH+(" 6.7 se escribe de la forma Jhr
.K, cerr!ndose de forma correcta en este nue$o est!ndar, es decir, que para cerrar
una etiqueta que no tiene cierre en H+(", se antepone una barra inclinada al signo
8mayor que9&.
=tras que pueden abrirse y cerrarse, como por ejemplo JpK.
1.2 MTODOS EDUCATIVOS .
Hoy por hoy, las pr!cticas de laboratorio son un cuello de botella en cualquier carrera de
ingeniera. "a escasez de recursos y la limitacin del uso de -stos debido a la gran cantidad
de alumnos que llenan las aulas constituyen un gra$e impedimento para el aprendizaje de
los alumnos.
Una posible ayuda ante este problema sera poner esta tecnologa al alcance del alumno
en cualquier momento y desde cualquier sitio. "as tecnologas de la informacin que
proporciona internet permiten esto.
#l acceso a tra$-s de una /eb al material disponible en los laboratorios permitira el
acceso a los recursos de forma ordenada y con una mayor eficiencia.
"as $entajas que este tipo de acceso traeran consigo podran $erse reflejadas en, por
11
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
ejemplo, pr!cticas de control sobre sistemas fsicos disponibles en un laboratorio. "os
controladores pueden implementarse en programas especficos de control como pueden ser
"abFie/ o (atlab %a tra$-s de Simulin@&. 1onectando de alguna forma estos programas con
una interfaz /eb que permitiera a los usuarios conectarse desde sus propios hogares
mediante un nombre de usuario y una contrase3a, -stos podran realizar el control de forma
alternati$a a la asistencia a clase.
"as $entajas son ob$ias: si a un alumno le faltase tiempo para realizar las pr!cticas en el
tiempo asignado en laboratorio, siempre podra ampliar el tiempo disponible realizando
dichas pr!cticas a tra$-s de una interfaz /eb desde su propia casa.
2o obstante, las des$entajas tampoco son ineistentes: por una parte, hay que crear
dicha interfaz, a3adirle las restricciones necesarias para que los controladores
implementados no produzcan malfuncionamientos en el sistema de pruebas, crear un
sistema de $alidacin de usuarios, etc.
"as tecnologas m!s comunes para el control de procesos o m!quinas en los
laboratorios son (atlab y "abFie/. (atlab, a tra$-s de su herramienta Simulin@, permite
implementar controladores para simulacin o para pruebas en tiempo real a tra$-s del
paquete Leal +ime <or@shop, y es el programa en el que se centrar! el presente proyecto.
*or otra parte, puesto que es necesaria la programacin de una interfaz, se ha elegido el
paquete de programacin (icrosoft Fisual Studio .2#+ para la consecucin de una interfaz
/eb basada en 5S* que implemente $alidacin de usuarios y permite el control remoto.
1.2.1 MATLAB .
(atlab es la abre$iatura de "(atri "aboratory" %laboratorio de matrices&. #s un programa
de matem!ticas creado por "+he (ath<or@s" en 6CAE. #st! disponible para las plataformas
Uni, <indo/s y (ac.
#s un soft/are muy usado en uni$ersidades, centros de in$estigacin y por ingenieros.
#n los 4ltimos a3os ha incluido muchas m!s capacidades, como la de programar
directamente procesadores digitales de se3ales, crear cdigo FH'" y otras.
(atlab es un programa de c!lculo num-rico, orientado a matrices y $ectores. *or tanto,
desde el principio hay que pensar que todo lo que se pretenda hacer con -l, ser! mucho
m!s r!pido y efecti$o si se piensa en t-rminos de matrices y $ectores.
*osee una interfaz f!cil de usar: su $entana principal se di$ide en tres partes principales:
12
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
el historial de comandos %todos los comandos insertados en la $entana de comandos
ordenados cronolgicamente por orden de insercin&, el espacio de trabajo %que muestra
todas las $ariables creadas en el entorno de trabajo de (atlab, as como el espacio ocupado
por las mismas y sus $alores& y la $entana de comandos, que es la parte m!s interesante
para el usuario, ya que es en ella donde se ejecutan las rdenes deseadas y se in$ocan las
funciones necesarias para realizar los c!lculos deseados.
"as capacidades de (atlab se pueden ampliar toolboes. 1ada uno de los toolboes %o
cajas de herramientas& se han creado con una finalidad concreta. #stos toolboes son
paquetes de funciones especializadas. 5s, se encuentran los siguientes toolboes:
1ontrol System +oolbo: este paquete proporciona herramientas para
sistem!ticamente analizar, dise3ar y afinar %sintonizar& sistemas de control lineales.
Se puede especificar el modelo lineal del sistema, representar sus respuestas
temporal y frecuencial para entender el comportamiento del sistema, sintonizar los
par!metros del controlador utilizando t-cnicas automatizadas e interacti$as, y
$erificar los requisitos de rendimiento, tales como tiempo de subida y m!rgenes de
ganancia.fase. Un conjunto de interfaces gr!ficas de usuario basadas en flujo de
trabajo %/or@flo/& guan al usuario en cada paso del proceso de dise3o y an!lisis.
Lobust 1ontrol +oolbo: la caja de herramientas de control robusto es una
coleccin de funciones y herramientas que ayudan al usuario a analizar y dise3ar
sistemas de control con $arias entradas y salidas %(;(= o (ulti;nputM(ulti=utput&
con elementos 8inciertos9. Se pueden construir modelos de sistemas "+; inciertos
que contengan tanto par!metros como din!micas inciertas. Se pueden conseguir
herramientas para analizar los m!rgenes de estabilidad de sistemas (;(= y el
rendimiento en el peor caso posible.
#ste toolbo incluye una seleccin de herramientas de sntesis de control que
computa controladores que optimizan el rendimiento en el peor caso y que identifica
los $alores de los par!metros para el peor caso. *ermite simplificar y reducir el orden
los modelos complejos con herramientas de reduccin de modelos que minimizan los
lmites de error aditi$o y multiplicati$o. *roporciona herramientas para implementar
m-todos de control a$anzados como H

, H
N
, desigualdades de matrices lineales %"(;
o "inear (atri ;nequalities&,...
0requency 'omain System ;dentification +oolbo: el toolbo de identificacin de
sistemas en el dominio de la frecuencia %0';'#2+& proporciona herramientas
especializadas para identificar sistemas S;S= %singleMinput.singleMoutput& de
13
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
din!mica lineal a partir de respuestas temporales o medidas de la respuesta
frecuencial del sistema. "os m-todos del dominio frecuencial sostienen el modelado
en tiempo continuo, que puede ser un fuerte complemento y altamente preciso para
los m-todos de tiempo discreto m!s com4nmente usados. "os m-todos del toolbo
se pueden aplicar a problemas tales como el modelado de sistemas electrnicos,
mec!nicos y ac4sticos.
"a caja de herramientas de identificacin de sistemas en el dominio frecuencial
est! construida completamente en (atlab, y todas las funciones se encuentran
disponibles en la $entana de comandos o a tra$-s de interfaces gr!ficas de usuario.
0uzzy "ogic +oolbo: la caja de herramientas de lgica difusa es una coleccin de
funciones construidas en el entorno de c!lculo num-rico (atlab. *roporciona
herramientas para crear y editar sistemas borrosos en el marco de (atlab, o si se
prefiere, integrar el sistemas borrosos en simulaciones con Simulin@. *ueden incluso
construirse programas 1 autnomos que llamen a sistemas borrosos construidos con
(atlab. #ste toolbo se basa en herramientas de interfaz gr!fica de usuario %,U;&
para ayudar a realizar las tareas, aunque tambi-n se puede trabajar desde la lnea
de comandos, esto ya es a eleccin del usuario.
Higher =rder Spectral 5nalisys +oolbo: se trata de un conjunto de ficheros ( que
implementan una $ariedad de algoritmos de procesamiento de se3al a$anzados para
la estimacin de espectros, olyespectros, bicoherencia, 8crossMcumulants9 y 8autoM
cumulants9 %incluyendo correlaciones&, y c!lculo de distribuciones temporalM
frecuenciales. >asados en estos, tambi-n implementa algoritmos para identificacin
de sistemas ciegos param-tricos y no param-tricos, estimacin de tiempos de
retardo, recuperacin de armnicos, enganche de fase, estimacin de la direccin de
llegada, estimacin de par!metros de modelos no lineales de Folterra y prediccin
lineal adaptati$a.
;mage *rocessing +oolbo: este toolbo proporciona un etenso conjunto de
algoritmos est!ndares de referencia y herramientas gr!ficas para procesamiento,
an!lisis, y $isualizacin de im!genes, y para desarrollo de algoritmos. Se pueden
restaurar im!genes degradadas o con ruido, mejorar im!genes para una mayor
comprensin, etraer caractersticas, analizar formas y teturas, ... "a mayora de
funciones de esta caja de herramientas est!n escritas en el lenguaje abierto de
(atlab.
(odel *redecti$e 1ontrol +oolbo: esta caja de herramientas permite dise3ar,
14
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
analizar y simular modelos de controladores predicti$os que est!n basados en
modelos de plantas creados en (atlab o deducidos de un modelo linealizado de
Simulin@. "os modelos de controladores predicti$os ayudan a optimizar el
rendimiento de sistemas de control (;(= %$arias entradas y $arias salidas& que
est!n sujetos a restricciones en las entradas y las salidas.
(u 5nalisis and Synthesis +oolbo: coleccin de funciones %comandos&
desarrollados principalmente para el an!lisis y sntesis de sistemas de control, con
-nfasis en la cuantificar los efectos de la incertidumbre. "as !M+ools porporcionan un
conjunto consistente de estructuras de datos para el tratamiento unificado de
sistemas ya sea en el dominio del tiempo, en el dominio de la frecuencia o en el
espacio de estados. "as !M+ools tambi-n dan a los usuarios de (atlab acceso a
desarrollos recientes en teora de control, a saber, control ptimo H

y t-cnicas de
an!lisis y sntesis m. #ste paquete permite sofisticados resultados de perturbacin
de matricesy t-cnicas de control ptimo para sol$entar problemas de dise3o de
control. #l soft/are de dise3o de control, tal como las !M+ools, proporciona un
$nculo entre la teora de control y la ingeniera de control.
25, 0oundation +oolbo: la 25, 0oundation +oolbo consta de m!s de NE7
ficheros .( que cubren muchos temas, entre los que se incluyen optimizacin,
ecuaciones diferenciales ordinarias y parciales, cuadratura y estadstica. #sta
OtoolboO tambi-n incorpora nue$a funciones de gran inter-s para tareas especficas
como resolucin de problemas de $alores de contorno, realizacin de cuadraturas
adaptati$as unidimensional y multidimensional, ajuste de cur$as y superficies y
acceder directamente a los algoritmos "5*51? para resolucin de ecuaciones
lineales.
2eural 2et/or@ +oolbo: la caja de herramientas de redes neuronales etiende
(atlab con herramientas para dise3ar, implementar, $isualizar y simular redes
neuronales. "as redes neuronales son inestimables para las aplicaciones donde el
an!lisis formal sera difcil o imposible, tales como el reconocimiento de patrones o el
control e identificacin de sistemas no lineales. #ste toolbo proporciona un
ehausti$o soporte para muchos paradigmas comprobados de redes, as como
interfaces gr!ficas que posibilitan el dise3o y la gestin de las redes. #l dise3o
etensible, abierto y modular del toolbo simplifica la creacin de redes y funciones
personalizadas.
2onlinear 1ontrol 'esign +oolbo: permite optimizar el comportamiento de los
15
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
sistemas modelados en Simulin@ personalizando los par!metros de dise3o por medio
de optimizaciones num-ricas. Se puede optimizar el rendimiento en bucle cerrado de
sistemas de control, desde controladores *;' hasta arquitecturas multiMbucle. Se
pueden epresar f!cilmente los requisitos de dise3o en t-rminos de tiempo de
subida, tiempo de establecimiento, lmites de saturacin, rizado,... *ermite modificar
los coeficientes de los algoritmos de procesamiento de se3al y de comunicacin, y
alcanzar caractersticas de comportamiento tales como consumo del pico de
potencia, rango de mo$imiento mec!nico o p-rdida de paquetes de datos.
#n conjuncin con Simulin@, puede usarse para poner a punto sistemas de control
lineales multiMbucle. Se pueden especificar di$ersos requisitos en el dominio del
tiempo y la frecuencia %incluyendo ganancia y m!rgenes de fase& en las gr!ficas de
respuesta del bucle abierto %y cerrado&, y optimizar los par!metros del sistema de
control para hacer cumplir estos requisitos.
=ptimization +oolbo: el toolbo de optimizacin etiende el entorno de c!lculo
t-cnico de (atlab con herramientas y algoritmos ampliamente utilizados para
optimizacin est!ndar y a gran escala. #stos algoritmos resuel$en problemas
continuos y discretos con y sin restricciones. #sta caja de herramientas incluye
funciones para programacin lineal, programacin cuadr!tica, optimizacin no lineal,
mnimos cuadrados no lineales, ecuaciones no lineales, optimizacin multiMobjeti$o y
programacin entera binaria.
Signal *rocessing +oolbo: este paquete es una coleccin de algoritmos
est!ndares de la industria para procesamiento de se3ales analgicas y digitales.
*roporciona una interfaz gr!fica de usuario para dise3o y an!lisis interacti$o y
funciones en lnea de comandos para desarrollo de algoritmos a$anzados.
S;(U";2?: Simulin@ es una plataforma para simulacin multidominio y dise3o
basado en modelo para sistemas din!micos. *roporciona un entorno gr!fico
interacti$o y un conjunto personalizable de bloques de libreras, y puede etenderse
para aplicaciones m!s especficas.
S;(U";2? Leal +ime <or@shop: Leal +ime <or@shop es una etensin de las
capacidades de Simulin@ y (atlab que autom!ticamente genera paquetes y compila
cdigo fuente de modelos de Simulin@ para crear aplicaciones soft/are en tiempo
real sobre una $ariedad de sistemas. *roporcionando un entorno de generacin de
cdigo para conseguir prototipos y desarrollos r!pidos, Leal +ime <or@shop es el
fundamento para las capacidades de generacin de produccin de cdigo. Punto con
16
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
otras herramientas y componentes, L+< %Leal +ime <or@shop& proporciona:
,eneracin de cdigo autom!tica adaptada para di$ersas plataformas destino.
Un camino r!pido y directo del dise3o del sistema a la implementacin.
;ntegracin con (atlab y Simulin@.
Una intefaz de usuario gr!fica simple.
Una arquitectura abierta y un proceso de construccin etensible.
Spline +oolbo: se trata de una coleccin de funciones para ajuste, interpolacin,
etrapolacin y $isualizacin de datos. "os splines son polinomios sua$es a trozos
que pueden ser usados para representar funciones en grandes inter$alos, donde no
sera pr!ctico una polinomio de aproimacin simple.
Statistics +oolbo: proporciona a los ingenieros, cientficos, in$estigadores,
analistas financieros y estadsticos un etenso conjunto de herramientas para
e$aluar y comprender sus datos. ;ncluye funciones y herramienta interacti$as para
analizar datos histricos, datos de modelado, sistemas simulados, desarrollo de
algoritmos estadsticos, y estadstica para aprender y ense3ar.
Symbolic (ath +oolbo: esta caja de herramientas combina las matem!ticas
simblicas y las capacidades aritm-ticas de precisin $ariable del motor simblico de
(aple con las capacidades num-ricas y de $isualizacin de (atlab. 1on este
toolbo, pueden usarse la sintais y el lenguaje de (atlab para realizar c!lculos
simblicos. #ste toolbo ofrece m!s de 677 funciones simblicas para realizar
operaciones de transformacin de integrales, de c!lculo y algebraicas.
System ;dentification +oolbo: el toolbo de identificacin de sistema permite
construir y e$aluar modelos lineales de sistemas din!micos a partir de datos de
mediciones entradaMsalida. Se pueden usar t-cnicas en el dominio del tiempo o la
frecuencia para ajustar modelos a datos mono o multiMcanales. #sta caja de
herramientas es 4til para modelar sistemas din!micos que no sean f!cilmente
representados por los principios b!sicos, incluyendo subsistemas de motor,
din!micas de $uelo, procesos de termoMfluidos y sistemas electromec!nicos.
#stos conjuntos de herramientas son muy 4tiles, y como se desprenden de las
caractersticas y descripciones anteriores, la mayora est!n orientados al control de sistemas
y dise3o de controladores, que es la razn principal del desarrollo de este proyecto.
17
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
1.2.2 MICROSOFT VISUAL S TUDIO .NET.
Fisual Studio .2#+ es un ;'# %;ntegrated 'e$elopment #n$ironment& o entorno integrado
de desarrollo desarrollado por (icrosoft. #s para el sistema operati$o (icrosoft <indo/s y
est! pensado, principal pero no eclusi$amente, para desarrollar para plataformas <inQN.
Un entorno de desarrollo integrado es un programa compuesto por un conjunto de
herramientas para un programador. *uede dedicarse en eclusi$a a un slo lenguaje de
programacin o bien, puede utilizarse para $arios.
Un ;'# es un entorno de programacin que ha sido empaquetado como un programa de
aplicacin, es decir, consiste en un editor de cdigo, un compilador, un depurador y un
constructor de interfaz gr!fica ,U;. "os ;'#s pueden ser aplicaciones por si solas o pueden
ser parte de aplicaciones eistentes. #l leguaje >asic por ejemplo puede ser usado dentro
de las aplicaciones de (icrosoft =ffice, lo que hace posible escribir sentencias >asic en
forma de macros para <ord.
"os ;'#s pro$een un marco de trabajo amigable para la mayora de los lenguajes de
programacin tales como 1GG, Pa$a, 1R, >asic, =bject *ascal, Felneo, etc.
#n este caso, Fisual Studio .2#+ proporciona soporte para los lenguajes de
programacin >asic, 1GG, 1R y PR. 5dem!s, puede utilizarse para construir aplicaciones
dirigidas a <indo/s %utilizando <indo/s 0orms&, <eb %usando 5S*.2#+ y Ser$icios <eb& y
dispositi$os port!tiles %utilizando .2#+ 1ompact 0rame/or@&.
Fisual Studio .2#+ N77Q incluye una completa gama de funciones, desde modeladores
que ayudan a componer $isualmente las aplicaciones empresariales m!s complejas hasta la
implementacin de una aplicacin en el m!s peque3o de los dispositi$os. Fisual Studio .2#+
y la plataforma .2#+ 0rame/or@ de (icrosoft <indo/s proporcionan una completa
herramienta para dise3ar, desarrollar, depurar e implementar aplicaciones seguras para
<indo/s y <eb.
"os cuatro lenguajes de programacin soportados por esta herramienta de programacin
se describen someramente a continuacin:
1R: es un lenguaje de programacin orientado a objetos desarrollado y
estandarizado por (icrosoft como parte de su plataforma .2#+, que despu-s fue
aprobado como un est!ndar por la #1(5 e ;S=.
Su sintais b!sica deri$a de 1.1GG y utiliza el modelo de objetos de la plataforma
.2#+, el cual es similar al de Pa$a aunque incluye mejoras deri$adas de otros
lenguajes %m!s notablemente de 'elphi y Pa$a&. 1R fue dise3ado para combinar el
18
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
control a bajo ni$el de lenguajes como 1 y la $elocidad de programacin de
lenguajes como Fisual >asic.
5unque 1R forma parte de la plataforma .2#+, -sta es una interfaz de
programacin de aplicacionesI mientras que 1R es un lenguaje de programacin
independiente dise3ado para generar programas sobre dicha plataforma. 5unque
a4n no eisten, es posible implementar compiladores que no generen programas
para dicha plataforma, sino para una plataforma diferente como <inQN o U2;D.
Fisual >asic.2#+ %F>.2#+&: es una $ersin de Fisual >asic enfocada al desarrollo
de aplicaciones .2#+. #l lenguaje de programacin es Fisual >asic, que apareci en
el a3o 6CC6 como una e$olucin del )uic@>asic que fabricaba (icrosoft.
#s un lenguaje de programacin orientado a objetos%*==&, y como no$edades
m!s importantes en la $ersin .2#+, podemos citar la posibilidad de definir !mbitos
de tipo, clases que pueden deri$arse de otras mediante herencia, sobrecarga de
m-todos, nue$o control estructurado de ecepciones o la creacin de aplicaciones
con m4ltiples hilos de ejecucin, adem!s de contar con la etensa librera de .2#+,
con la que es posible desarrollar tanto <indo/s 5pplications y <eb 0orms, as como
un etenso n4mero de clientes para bases de datos. ,racias a estas mejoras en lo
que $endra siendo Fisual >asic B.7 los programadores de este lenguaje pueden
desarrollar aplicaciones m!s robustas que en el pasado con una base slida
orientada a objetos.
Fisual 1GG: es el nombre de una herramienta y un lenguaje de programacin. "a
herramienta forma parte de la suite de programacin de (icrosoft Fisual Studio, que
en su 4ltima $ersin est! disponible para su descarga gratuita en la p!gina de
(icrosoft para uso no profesional.
#l lenguaje de programacin utilizado por esta herramienta, de igual nombre est!
basado en 1GG, y es compatible en la mayor parte de su cdigo con este lenguaje, a
la $ez que su sintais es eactamente igual. #n algunas ocasiones esta
incompatibilidad impide que otros compiladores, sobre todo en otros sistemas
operati$os, funcionen bien con cdigo desarrollado en este lenguaje.
Fisual PR .2#+: es una herramienta para programadores en lenguaje Pa$a que
deseen crear aplicaciones y ser$icios en (icrosoft <indo/s .2#+ 0rame/or@.
#l lenguaje de programacin PR es un lenguaje transicional para programadores
del lenguaje de programacin Pa$a y del lenguaje PGG de (icrosoft, creado con la
19
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
intencin de que ambos puedan usar sus conocimientos actuales para crear
aplicaciones en la plataforma .2#+ de (icrosoft. PR se supone compatible con Pa$a,
tanto a ni$el cdigo fuente, como binario. #n teora, PR puede ser usado para
transicionar aplicaciones que usan bibliotecas de terceros, a4n cuando el cdigo de
-stas no este disponible.
"a utilidad de esta suite de programacin reside en sus capacidades de programacin
/eb y la facilidad de integrar 5S* con cdigo Fisual 1R. Ssta ha sido la combinacin
escogida para el desarrollo de la interfaz /eb del sistema de control remoto.
#l cdigo 5S* permite utilizar las etiquetas comunes H+(" y adem!s permite
implementar consultas a bases de datos del tipo S)" y realizar consultas al ser$idor.
5unque esta opcin no se ha eplotado en el proyecto, siempre permite una futura mejora y
ampliacin de posibilidades %escalabilidad&.
#l cdigo 1R permite dotar al sistema de una mayor funcionalidad que no permite el
lenguaje 5S*. *or un lado, proporciona una mayor facilidad, debido principalmente al
soporte de ayuda disponible con (icrosoft Fisual Studio .2#+, ya que -ste incluye las
denominadas libreras (S'2, que suponen el pilar de la programacin para este paquete.
"as libreras (S'2 constituyen la referencia de la programacin en este entorno, y puesto
que se trata de un lenguaje de muy alto ni$el, ya se encuentran creadas una gran cantidad
de funciones que en conjuncin con el lenguaje de programacin /eb 5S* permite dotar a
la aplicacin de control remoto de una mayor funcionalidad.
*or otra parte, este entorno incluye la mayora de los lenguajes de programacin
ampliamente utilizados en ingeniera. 2o es de etra3ar, por tanto, pensar en la combinacin
de (icrosoft Fisual Studio con (atlab, ya que (atlab posee unas herramientas
denominadas 8funcionesMS9 que permiten al usuario la programacin de sus propias
funciones y bloques funcionales en Simulin@ mediante programacin tradicional en lenguaje
1. *or tanto, esto permite el desarrollo de libreras con (icrosoft Fisual Studio .2#+ para su
posterior uso con (atlab, con todas las $entajas que esto conlle$a. 2o obstante, hay que ser
cautos en el uso de funciones a$anzadas de Fisual 1R de cara a la construccin de libreras
para (atlab, ya que entonces hay que personalizar el proceso de compilado y construccin
de ejecutables y libreras, para que no se produzcan errores en el proceso de lin@ado y
generacin de ficheros objeto.
20
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
2 ANLISIS DE FACTIBILIDAD .
#n la parte referente a la actualizacin autom!tica de un sistema de bases de datos, la
factibilidad sera reducida o muy limitada en el caso de un sistema gen-rico capaz de
actualizar cualquier sistema de bases de datos ante m4ltiples entradas y de distinta ndole.
2o es este el caso presente. Se pretende dise3ar un sistema de actualizacin de bases de
datos orientado a una base de datos concreta, la del grupo de control predicti$o de la
Uni$ersidad de Se$illa. #n lo concerniente al apartado de las entradas del sistema, cabe
mencionar que se limitan a ficheros de teto plano con patrones constantes de definicin de
campos %esto es, cada campo se encuentra separado del anterior de forma un$oca y
constante para todas las nue$as entradas de la base de datos& y de entradas de la base de
datos %cada entrada se encuentra separada de la anterior de forma un$oca y constante, de
forma similar al caso anterior&, as como direcciones de internet que complementen la
informacin de dichos ficheros y directorios para la b4squeda de documentos del tipo 8pdf9
%*ortable 'ocument 0ormat& que contengan informacin rele$ante acerca de las entradas de
la base de datos.
#sta base de datos tiene unas caractersticas concretas, que junto con las
especificaciones concisas de las posibles entradas eistentes, posibilita la realizacin de
esta parte del proyecto.
#n la parte referente al control remoto de una planta a tra$-s de internet mediante el uso
de (atlab y una interfaz /eb, la factilidad es limitada, ya que (atlab no permite el
establecimiento de soc@ets de forma sencilla. Si se intenta abrir un soc@et con Pa$a, el hilo
principal del programa queda bloqueado, impidiendo el correcto control de la planta. Si se
intenta utilizar (atlab Ser$er, entonces se permiten coneiones sobre la planta a tra$-s de
internet, pero cada conein se realiza en un hilo distinto del programa, lo que implicara que
el control no se estara lle$ando a cabo realmente. 2o obstante, haciendo uso de las
funciones S, que permiten el uso de funciones programadas en 1 puede encontrarse una
solucin $iable, haciendo posible la factibilidad de la otra parte del presente proyecto.
21
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
3 OBETIVOS DEL PROYECTO.
3.1 ACTUALI!ACIN AUTOMTICA DE BASES DE DATOS .
#l objeti$o a conseguir con las bases de datos es claro: simplificar el proceso de
actualizacin de una base de datos a partir de informacin disponible en otras fuentes %entre
ellas, otra base de datos&.
Se ha realizado un sistema con cierta "inteligencia" para la actualizacin de bases de
datos a partir de distintos elementos de entrada:
0icheros de teto con la informacin de otras bases de datos: normalmente la
correspondencia entre los datos contenidos en estos ficheros y la estructura de la
base de datos destino no es eactamente la misma, por lo que el sistema debe
generar los campos alternati$os que sean necesarios y que se puedan obtener a
partir de los facilitados.
'irecciones /eb: ofrecen m!s informacin para la actualizacin, complementando
los campos de los ficheros de teto.
'irectorios de ficheros: 4tiles si la base de datos contiene un registro de ficheros,
como pueden ser los artculos publicados en una determinada re$ista.
5 partir de estos elementos se proceder! a la actualizacin de la base de datos,
teni-ndose en cuenta todos ellos para una mejor complecin de la misma.
=tro objeti$o colateral de este proyecto es realizar un sistema de actualizacin fleible,
que permita adaptar el sistema a cualquier otro sistema de bases de datos de forma f!cil y
directa. 1on esto se ofrece la posibilidad de reusar cdigo y ahorrar tiempo de
programacin.
3.2 REQUISITOS PREVIOS PARA LA ACTUALI!ACIN AUTOMTICA.
#l sistema de pruebas para el script de actualizacin es la p!gina /eb del grupo de
control predicti$o de la Uni$ersidad de Se$illa. *ara la gestin de la base de datos y las
posteriores comprobaciones del script, es necesario instalar una determinada batera de
programas, cada uno de ellos con una funcionalidad distinta:
22
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
(yS)" Ser$er: gestor de bases de datos open source.
(yS)" 5dministrator: herramienta de mantenimiento y gestin de bases de datos
S)".
5pache <eb Ser$er: ser$idor /eb para poder $isualizar la p!gina /eb bajo
pruebas.
*H*: lenguaje de programacin que permite la ejecucin de cdigo en un ser$idor
/eb.
3.2.1 MYSQL S ERVER.
(yS)" es un gestor de bases de datos open source %o de otra forma, soft/are libre&. #s
la herramienta utilizada en el ser$idor 2yquist para gestionar las bases de datos, y por ello
aqu se eplicar! someramente una instalacin b!sica, que ser! suficiente para los objeti$os
del proyecto.
"a $ersin aqu utilizada es la est!ndar E.6.6T, para procesadores AT. #l nombre del
fichero necesario para esta instalacin es:
mysql-standard-4.1.16-pc-linux-gnu-i686-glibc23.tar.gz
#l usuario puede instalar cualquier otra $ersin. "a instalacin no $ariar!
significati$amente, sal$o en los n4meros de la $ersin utilizada y en el tipo de -sta %ma o
standard, generalmente&.
"os pasos a seguir para instalacin de (yS)" Standard #dition a tra$-s de un terminal
son los siguientes:
6. 1rear un usuario y un grupo para ejecutar (yS)":
# groupadd mysql
# useradd -g mysql mysql
N. 'escomprimir el archi$o que contiene (yS)" en el directorio "/usr/local/":
# cd /usr/local
# tar -xz /directorio/mysql-standard-4.1.16-pc-linux-gnu-i686-glibc23.tar.gz
2=+5: "/directorio/" hace referencia a la ubicacin en la que se encuentre el
fichero .tar.gz de (yS)". #l usuario deber! cambiarlo por el directorio
apropiado.
Q. Lealizar un enlace simblico al directorio creado por la descompresin del punto
N:
23
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
# ln -s mysql-standard-4.1.16-pc-linux-gnu-i686-glibc23/ mysql
2=+5: con esto se podr! acceder al directorio donde se ha descomprimido el
fichero simplemente mediante la ruta "/usr/local/mysql/".
E. #jecutar el script de instalacin:
# cd mysql
# scripts/mysql!install!db
2=+5: durante el proceso de instalacin se mostrar!n en el terminal di$ersos
mensajes informati$os. Uno de ellos es de especial importancia: el referente
al cambio de la contrase3a del usuario "root", que es el administrador de la
base de datos. #n dicho mensaje se recomienda el cambio de la contrase3a,
que inicialmente se establece a una contrase3a $aca %es decir, ninguna&, a
una contrase3a particular del usuario. (!s adelante se har! una rese3a a
este inciso.
U. 1ambiar el usuario y grupo de los ficheros:
# c"o#n -$ root .
# c"o#n -$ mysql data
# c"grp -$ mysql .
2=+5: #stos comandos pueden $ariar dependiendo de la $ersin de "inu
utilizada. #n el desarrollo de esta beca se utiliz 'ebian Sarge Q.6, y estos
comandos se ejecutaron satisfactoriamente. Hay que asegurarse de que se
establece la asociacin de los grupos bien, puesto que en caso contrario, al
ejecutar (yS)" como se indica en el punto T se obtendr! un error de
escritura en el directorio "data".
T. #jecutar (yS)":
# bin/mysqld!sae --user%mysql &
2=+5: dependiendo de la $ersin a instalar de (yS)", habr! que utilizar
"mysql!sae" o "mysqld!sae". #n la facilitada, hay que usar "mysqld!sae". 5dem!s,
la utilizacin del ampersand %&& al final tiene su base en que de esta forma no
se bloquea el terminal y se permite seguir ejecutando comandos.
2=+5 N: otra forma de arrancar el ser$idor y pararlo, respecti$amente, se
consigue con los siguientes comandos:
# /usr/local/mysql/support-iles/mysql.ser'er start
# /usr/local/mysql/support-iles/mysql.ser'er stop
B. 5hora que ya se est! ejecutando (yS)" es un buen momento para cambiar la
contrase3a del usuario "root". Se facilitan aqu los comandos especficos para este
24
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
fin:
# ./bin/mysqladmin -u root pass#ord (nue'o-pass#ord(
# ./bin/mysqladmin -u root -" debian pass#ord (nue'o-pass#ord(
5hora lo que se $a a hacer es automatizar el arranque del ser$idor con el arranque del
sistema. *ara ello, se copiar! el script de manejo del ser$idor en la ubicacin donde se
encuentren los ficheros de arranque del sistema. #sto se consigue con la siguiente orden:
# cp /usr/local/mysql/support-iles/mysql.ser'er /etc/init.d
#ste script se puede utilizar tanto para arrancar el ser$idor en el inicio del sistema como
para pararlo al apagar el ordenador. *ara ello, se ultimar!n estas dos operaciones creando
unos enlaces simblicos, necesarios para el script:
# cd /etc/rc2.d
# ln -s /etc/init.d/mysql.ser'er )2*mysql
# cd /etc/rc*.d
# ln -s /etc/init.d/mysql.ser'er +2*mysql
#s con$eniente ejecutar el script de inicio y apagado del ser$idor como el usuario "mysql"
y no como el usuario "root" por razones de seguridad. 5 tal efecto, se modificar! el fichero
"mysql.ser'er" que se ha copiado en "/etc/init.d/". Se ha de buscar la siguiente lnea:
,bindir/mysqld!sae --datadir%,datadir --pid-ile%,pid!ile &
y se sustituir! por esta otra:
,bindir/mysqld!sae --datadir%,datadir --pid-ile%,pid!ile --user%mysql &
2=+5: en el fichero de la distribucin facilitada, esta lnea era la lnea 6CC.
Si la instalacin b!sica descrita aqu no proporciona los resultados deseados, se
recomienda consultar el fichero "-.)/011-2-.0$3" que se encuentra en el directorio creado en
el paso N %carpeta de descompresin&.
"a instalacin para el sistema <indo/s es m!s sencilla, en tanto que simplemente
dispone de un ejecutable. *ara instalarlo, descomprimir el fichero 8mysql-4.1.18-win32.zip9
y hacer doble clic@ sobre el instalador 8setup.exe9. 2o se entrar! en detalles de la instalacin
porque es similar a la instalacin para "inu. #n todo caso, puede que se altere el orden de
alguno de los pasos, que la mayora de ellos se realicen de forma gr!fica en forma de
$entanas y que otros no tengan sentido %como el hecho de realizar enlaces simblicos o
programar el autoarranque con el sistema, puesto que se ofrece al usuario la posibilidad de
arrancar el ser$idor (yS)" como un ser$icio del sistema.
25
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
3.2.2 MYSQL CONTROL CENTER.
(yS)" 1ontrol 1enter es una herramienta de bastante ayuda en el mantenimiento y
gestin de la base de datos S)". *ermite, entre otras cosas, crear nue$os usuarios,
modificar las tablas eistentes y a3adir.crear nue$as bases de datos.
"a $ersin aqu utilizada es la 7.C.E, para procesadores AT. #l nombre del fichero
necesario para esta instalacin es:
mysqlcc-*.4.4-linux-glibc23.tar.gz
#l usuario puede instalar cualquier otra $ersin. "a instalacin no $ariar!
significati$amente.
"os pasos a seguir para instalacin de (yS)" 1ontrol 1enter a tra$-s de un terminal
son los siguientes:
6. 'escomprimir el archi$o que contiene (yS)" 1ontrol 1enter en el directorio
"/usr/local/":
# cd /usr/local
# tar -xz /directorio/mysqlcc-*.4.4-linux-glibc23.tar.gz
2=+5: "/directorio/" hace referencia a la ubicacin en la que se encuentre el
fichero .tar.gz de (yS)" 1ontrol 1enter. #l usuario deber! cambiarlo por el
directorio apropiado.
N. Lealizar un enlace simblico al directorio creado por la descompresin del punto
N:
# ln -s mysqlcc-*.4.4-linux-glibc23/ mysqlcc
2=+5: con esto se podr! acceder al directorio donde se ha descomprimido el
fichero simplemente mediante la ruta "/usr/local/mysqlcc/".
Q. #jecutar (yS)" 1ontrol 1enter:
# cd mysqlcc
# ./mysqlcc
E. 5parecer! una $entana con el ttulo "5y)6177 8 $egister )er'er". #n primera instancia,
nos bastar! rellenar los campos eistentes con los siguientes datos:
2ame "#$%"&#'(
2=+5: 5qu se debe poner el nombre que se quiere dar a la conein.
Host name localhost
2=+5: 5qu se debe poner el nombre de la m!quina donde est! el
ser$idor (yS)". "ocalhost indica al programa que se usar! la misma
26
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
computadora donde se est! instalando el programa como ser$idor de
bases de datos, de forma que se conecte a -sta de forma local.
User name root
2=+5: 5qu se debe especificar el nombre del usuario de (yS)" para
conectar con el ser$idor.
*ass/ord 5qu se debe especificar la contrase3a del usuario del campo
anterior. Si se especific como nombre de usuario "root", entonces caben dos
opciones: 6& dejar en blanco si no se ejecut el paso B en la instalacin de
(yS)" N& rellenar este campo con la contrase3a establecida.
U. *ulsar el botn "0dd" %o "09adir"&. 5cto seguido, aparecer! una $entana, que es la
$entana principal de (yS)" 1ontrol 1enter. #n la parte izquierda aparece un men4
titulado "5y)61 )er'ers". #n su interior, aparece "local"ost", que es la conein actual. Si
se despliega, aparecer!n tres submen4s, a saber: ":atabases", ")er'er 0dministration" y
";ser 0dministration". #l primero, ":atabases", al desplegarse muestra las bases de datos
eistentesI el segundo, ")er'er 0dministration" no nos interesaI y el tercero, ";ser
0dministration", sir$e para administrar los usuarios que tendr!n acceso al ser$idor
(yS)". +anto los men4s ":atabases" como ";ser 0dministration" ser!n 4tiles m!s
adelante, en la configuracin de la p!gina /eb.
Si la instalacin b!sica descrita aqu no proporciona los resultados deseados, se
recomienda consultar el fichero "-.)/011.txt" que se encuentra en el directorio creado en el
paso 6 %carpeta de descompresin&.
*ara la instalacin en el sistema <indo/s se propone otro programa, denominado
(yS)" 5dministrator. Se trata de una e$olucin de (yS)" 1ontrol 1enter, y posee m!s
posibilidades de modificacin y mayor cantidad de opciones que el anterior. Su instalacin
tambi-n es m!s sencilla, en tanto que simplemente dispone de un ejecutable. *ara
instalarlo, hacer doble clic@ sobre el instalador 8mysql-administrator-1.1.9-win.msi9.
3.2.3 APACHE "EB S ERVER.
5pache es un ser$idor gratuito y soft/are libre adem!s. Sste ser! el que permitir! las
coneiones remotas desde otras m!quinas y a su $ez permitir! al programador $er las
27
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
p!ginas en proceso de modificacin a tra$-s del na$egador.
"a $ersin aqu utilizada es la N.7.UU, para procesadores AT. #l nombre del fichero
necesario para esta instalacin es:
"ttpd-2.*.<<.tar.gz
#l usuario puede instalar cualquier otra $ersin. "a instalacin no $ariar!
significati$amente. #n este caso se tendr!n que compilar las fuentes del ser$idor 5pache.
"os pasos a seguir para instalacin de 5pache Ser$er a tra$-s de un terminal son los
siguientes:
6. 'escomprimir el archi$o que contiene 5pache Ser$er en el directorio
"/usr/local/src/":
# cd /usr/local/src
# tar -zx /directorio/"ttpd-2.*.<<.tar.gz
2=+5: "/directorio/" hace referencia a la ubicacin en la que se encuentre el
fichero .tar.gz de 5pache Ser$er. #l usuario deber! cambiarlo por el directorio
apropiado.
N. 1onfigurar los fuentes para que la compilacin se adapte al sistema y las
necesidades:
# cd "ttpd-2.*.<<
# ./conigure --preix%/usr/local/apac"e2 --enable-so --#it"-mpm%preor=
2=+5: con esto se compila 5pache Ser$er con las opciones por defecto. "a
opcin "preix" indica dnde se $a a instalar el ser$idor 5pache. "a opcin
"enable-so" sir$e para realizar la carga din!mica de mdulos. #s importante
poner esta opcin para despu-s cargar din!micamente php. "#it"-mpm" es una
opcin necesaria para un correcto funcionamiento con php.
Q. 1ompilar los fuentes:
# ma=e
E. ;nstalar 5pache Ser$er:
# ma=e install
U. 5rrancar 5pache Ser$er:
# cd /usr/local/apac"e2/bin
# .apac"ectl start
T. #sto no es un paso de la instalacin en s, sino una comprobacin de que
funciona correctamente 5pache Ser$er en el sistema. 5brir desde el na$egador /eb
la url:
28
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
"ttp>/local"ost/
Si la instalacin ha tenido -ito, debera mostrarse una p!gina con el siguiente teto al
comienzo:
?- you can see t"is@ it means t"at t"e installation o t"e 0pac"e #eb ser'er sot#are on t"is system #as successul.
3ou may no# add content to t"is directory and replace t"is page.?
*ara proseguir con la siguiente instalacin, que corresponde a php, es con$eniente parar
el ser$idor con la siguiente orden:
# ./apac"ectl stop
donde se ha supuesto que seguimos en el directorio "/usr/local/apac"e2/bin/".
5 continuacin se realizar! una automatizacin similar a la que se lle$ a cabo con el
ser$idor (yS)" para automatizar el arranque y parada del ser$idor 5pache Ser$er al
encender y apagar el ordenador. *ara ello, se debe copiar el script "apac"ectl" al sitio donde
se encuentran los ficheros de arranque del sistema:
# cp /usr/local/apac"e2/bin/apac"ectl /etc/init.d
#ste script se puede utilizar tanto para arrancar el ser$idor en el inicio del sistema como
para pararlo al apagar el ordenador. *ara ello, se ultimar!n estas dos operaciones, creando
unos enlaces simblicos necesarios para el script:
# cd /etc/rc2.d
# ln -s /etc/init.d/apac"ectl )2*apac"ectl
# cd /etc/rc*.d
# ln -s /etc/init.d/apac"ectl +2*apac"ectl
Si la instalacin b!sica descrita aqu no proporciona los resultados deseados, se
recomienda consultar el fichero "-.)/011" que se encuentra en el directorio creado en el paso
6 %carpeta de descompresin&.
"a $ersin para <indo/s se encuentra en el fichero 8apache_2.0.55-win32-x86-
no_ssl.msi9. *ara instalar 5pache para <indo/s simplemente se ha de hacer doble clic@
sobre el instalador anterior y proceder con todos los pasos que $aya solicitando el mismo.
Se ofrecer!, al igual que pasaba con (yS)" Ser$er iniciar este ser$idor como un ser$icio
del sistema. Ssta es la opcin recomendada.
3.2.# PHP.
*H* es un lenguaje de programacin de p!ginas /eb que permite dotarlas de
dinamismo. #ste lenguaje permite la comunicacin entre los na$egadores y los ser$idores
que alojan las p!ginas /eb, permitiendo que aqu-llos soliciten determinados datos,
de$ol$i-ndoselos -ste.
29
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
"a $ersin aqu utilizada es la E.E.N, para procesadores AT. #l nombre del fichero
necesario para esta instalacin es:
p"p-4.4.2.tar.gz
#l usuario puede instalar cualquier otra $ersin. "a instalacin no $ariar!
significati$amente.
"os pasos a seguir para instalacin de php a tra$-s de un terminal son los siguientes:
6. 'escomprimir el archi$o que contiene php en el directorio "/usr/local/src/":
# cd /usr/local/src
# tar -zx /directorio/p"p-4.4.2.tar.gz
2=+5: "/directorio/" hace referencia a la ubicacin en la que se encuentre el
fichero .tar.gz de 5pache Ser$er. #l usuario deber! cambiarlo por el directorio
apropiado.
N. 1onfigurar las fuentes para su posterior instalacin:
# cd p"p-4.4.2
#./conigure --preix%/usr/local/p"p4 --#it"-mysql%/usr/local/mysql --#it"-
apxs2%/usr/local/apac"e2/bin/apxs --#it"-gettextA%:-$B
2=+5: con estas opciones se compilar! php con las opciones por defecto.
"#it"-mysql" incluye el soporte para (yS)", por lo que se le indica el directorio
donde est! instalado dicho ser$idorI "#it"-apxs2" compila el mdulo para
5pache Ser$er N, por lo que se le indica el directorio donde est! instalado
dicha utilidad. *or 4ltimo, se indica tambi-n "#it"-gettext" porque la p!gina del
grupo de control predicti$o hace uso de este mdulo, por lo que, o bien se
incluye ahora, o bien se recompilara php m!s adelante de nue$o.
Q. 1ompilar php:
# ma=e
E. ;nstalar php:
# ma=e install
U. 1opiar el fichero de configuracin de php donde php espera encontrarlo. #ste
directorio es el que se indic en el paso N con la opcin prefi a3andi-ndole el
subdirectorio "/lib/", es decir:
# cp p"p.ini-dist /usr/local/p"p4/lib/p"p.ini
T. Hacer que 5pache Ser$er reconozca los ficheros con etensin 8.p"p9. *ara ello,
a3adir en el fichero "/usr/local/apac"e2/con/"ttpd.con" la siguiente lnea:
30
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
0dd/ype application/x-"ttpd-p"p .p"p
2=+5: en la $ersin facilitada, la lnea se deba a3adir en la lnea AQA.
B. 1omprobar que la instalacin y configuracin de php ha sido correcta. *ara ello,
abrir un editor de tetos %i.e., "gedit"& y crear un fichero llamado "prueba.p"p":
# cd /usr/local/apac"e2/"tdocs/
# gedit prueba.p"p
2=+5: el directorio "/usr/local/apac"e2/"tdocs/" es el directorio en el que busca
5pache Ser$er las p!ginas del host cuando se indican mediante "local"ost".
*or tanto, para referirnos despu-s a ella, habr! que copiar en este directorio
el fichero de prueba, con la finalidad de poder $erlo despu-s.
A. 53adir las siguientes lneas al fichero:
CDp"p
p"pinoEFG
DH
C. 5brir un na$egador /eb e indicar la siguiente url:
"ttp>//local"ost/prueba.p"p
67. Se debera $er una p!gina mostrando distintas caractersticas e informacin
acerca del sistema.
2=+5: si no se $e esta p!gina, probar a reiniciar el ordenador y $ol$er a cargar la
p!gina. 'ebido a que 5pache Ser$er se encuentra iniciado, puede que no tenga
en cuenta las modificaciones al fichero ""ttpd.con" de forma inmediata.
66. *or 4ltimo, tambi-n sera con$eniente realizar una peque3a comprobacin de que
todo lo anteriormente instalado funciona conjuntamente, es decir, crear una p!gina
que mediante funciones php se conecte al ser$idor (yS)" para obtener una
determinada informacin a tra$-s del ser$idor 5pache. *ara ello, editar el fichero
"prueba.php" creado anteriormente e insertar el siguiente contenido:
31
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
CDp"p
// IJemplo de acceso a base de datos 5y)61.
// 7onseguimos la conexiKn.
,lin= % Lmysql!connectE(local"ost(@ (root(@ (root!pass#ord(FG
i EM,lin=F N
exitE(CbHIrrorC/bH> .o se puede conectar con la base de datos. (.mysql!errorEFFG
O
,ddbb % (mysql(G
i EMLmysql!select!dbE,ddbbFF N
exitE?CbHIrrorC/bH> .o se encuentra la base de datos (,ddbb(.?FG
O
// IJecutamos una consulta.
,sql % ()I1I7/ P Q$R5 "elp!=ey#ord(G
,res % Lmysql!queryE,sqlFG
i EM,resF N
exitE?CbHIrrorC/bH> 1a consulta (,sql( "a allado. ?.mysql!errorEFFG
O
// 5ostramos el metadata de la tabla.
ec"o (Ctable border%?1?H(G
ec"o (CtrH Ct"H.ombreC/t"H Ct"H/ipoC/t"H Ct"HSermite .;11C/t"H C/trH(G
,numQields % mysql!num!ieldsE,resFG
or E,i % *G ,i C ,numQieldsG ,i TTF N
,meta % mysql!etc"!ieldE,res@ ,iFG
ec"o (CtrH(G
ec"o ?CtdH,meta-HnameC/tdH?G
ec"o ?CtdH,meta-HtypeC/tdH?G
ec"o ?CtdH,meta-Hnot!nullC/tdH?G
ec"o (C/trH(G
O
ec"o (C/tableH(G
ec"o (CbrH(G
// 5ostramos el contenido de la tabla.
ec"o (Ctable border%?1?H(G
ec"o (CtrH(G
or E,i % *G ,i C ,numQieldsG ,i TTF N
,meta % mysql!etc"!ieldE,res@ ,iFG
ec"o ?Ct"H,meta-HnameC/t"H?G
O
ec"o (C/trH(G
#"ile E,ro# % mysql!etc"!ro#E,resFF N
ec"o (CtrH(G
oreac" E,ro# as ,colF N
ec"o ?CtdH,colC/tdH?G
O
ec"o (C/trH(G
O
ec"o (C/tableH(G
// 1iberamos los recursos y cerramos la conexiKn.
mysql!ree!resultE,resFG
mysql!closeE,lin=FG
DH
2=+5: en la lnea que contiene la funcin "Lmysql!connectE(local"ost(@ (root(@
(root!pass#ord(F" se debe sustituir "root!pass#ord" por la contrase3a del
32
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
administrador %?root?& del ser$idor (yS)".
6N. Si todo ha ido bien, se deberan mostrar algunas tablas.
Si la instalacin b!sica descrita aqu no proporciona los resultados deseados, se
recomienda consultar el fichero "-.)/011" que se encuentra en el directorio creado en el paso
6 %carpeta de descompresin&.
1on esto ya se encuentra configurado el ser$idor /eb al completo. 0altan por pulir
algunos peque3os detalles, pero esto ya depende de las pretensiones del proyecto, de
modo que las modificaciones a realizar se comentar!n cuando se estime con$eniente.
*ara instalar *H* en cualquier $ersin de <indo/s se puede hacer mediante el fichero
comprimido 8php-5.1.2-Win32.zip9. #sta $ersin es m!s moderna que la indicada para
"inu, pero para el sitio empleado para el presente proyecto basta con la $ersin de "inu.
2o obstante, se ha elegido una $ersin m!s moderna para <indo/s. *ara instalar *H* en
<indo/s se ha de descomprimir el fichero anterior y seguir las notas de instalacin
indicadas en el fichero 8install.txt9 que aparece en la carpeta resultante de la
descompresin. *uesto que la $ersin de 5pache instalada es la N.7.UU el apartado a seguir
es el 82. Installation on Windows systems9, subapartado 8Apache 2.0.x on Microsoft
Windows9.
3.2.$ GROUP"EB .
"a primera de las tareas a realizar es el mantenimiento, actualizacin y modificacin del
sitio /eb del grupo de control predicti$o del departamento de sistemas y autom!tica de la
#scuela Superior de ;ngenieros de Se$illa. #sta p!gina es accesible desde la url:
http:..nyquist.us.es.group/eb.inde.php
"o primero que se hizo fue una copia de la p!gina /eb, ya que por razones de seguridad
no era con$eniente la modificacin "in situ" de la p!gina en el propio ser$idor. #sto se realiz
mediante una transferencia ftp. *osteriormente, hubo que configurar la p!gina /eb para su
correcta $isualizacin en el ser$idor configurado en el apartado N de la presente memoria.
#l sitio /eb se encuentra comprimido en el siguiente fichero:
group#eb.rar
33
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
3.2.$.1 COPIA LOCAL DEL S ITIO "EB.
#n primer lugar, para ser coherentes con las rutas utilizadas por el creador original del
sitio /eb, se crearon los siguientes directorios:
# m=dir 'ar
# cd 'ar
# m=dir ###
# rar x group#eb.rar
#ste sitio /eb hace uso de unas libreras de libre distribucin denominadas "p"p"tmllib".
*or ello, hay que realizar un enlace simblico al directorio "p"p"tmllib-2.4.1" que se encuentra
dentro del directorio creado en la descompresin anterior. *ara ello, tecleamos lo siguiente:
# cd group#eb
# ln -s p"p"tmllib-2.4.1/ p"p"tmlib
#ste paso es un requisito de una instalacin pre$ia de dichas libreras, una especie de
$ariable de entorno sin la cual no funcionara correctamente la p!gina /eb.
=tro paso a realizar es cambiar el directorio en el que 5pache Ser$er busca las p!ginas
/eb almacenadas. *or defecto, esta ruta es ".usr/local/apac"e2/"tdocs/", y se debe cambiar a
"/'ar/###/". *ara ello, se debe teclear lo siguiente:
# cd /usr/local/apac"e2/con
# gedit "ttpd.con
>uscamos en este fichero la lnea que contiene el teto ":ocument$oot
?/usr/local/apac"e2/"tdocs?" y la cambiamos por ":ocument$oot ?/'ar/###?"
2tese que al cambiar el fichero de configuracin de 5pache Ser$er, ser! necesario
reiniciar el sistema %o reiniciar el ser$idor 5pache& para que los cambios surtan efecto.
3.2.$.2 RESTAURACIN DE LA BASE DE DATOS .
3.2.$.2.1 INTRODUCCIN AL COMANDO "MYSQLDUMP ".
*ara realizar una copia de seguridad de la base de datos eisten $arios comandos
especficos. #stos comandos son:
34
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
mysqlimport
mysql"otcopy
mysqldump
bac=up table/restore table
lus" table
loc= table
#l comando elegido para la copia de seguridad de la base de datos fue "mysqldump", tanto
por su simplicidad como por su eficacia.
#l comando "mysqldump" del sistema gestor de la base de datos (yS)" sir$e para
hacer copias de seguridad. #ste comando permite hacer la copia de seguridad de una o
m4ltiples bases de datos. 5dem!s, permite que estas copias de seguridad se puedan
restaurar en distintos tipos de gestores de bases de datos, sin la necesidad de que se trate
de un gestor de (yS)". #sto lo consigue creando unos ficheros que contienen todas las
sentencias S)" necesarias para poder restaurar la tabla, que incluyen desde la sentencia
de creacin de la tabla hasta una sentencia "insert" por cada uno de los registros que
forman parte de la misma.
#l comando dispone de una amplia $ariedad de opciones que nos permitir! realizar la
copia de la forma m!s con$eniente para el propsito de la misma. *ara poder restaurar la
copia de seguridad, bastar! con ejecutar todas las sentencias S)" que se encuentran
dentro del fichero, bien desde la lnea de comandos de (yS)" o desde la pantalla de
creacin de sentencias S)" de cualquier entorno gr!fico como puede ser (yS)" 1ontrol
1enter.
"as limitaciones de la restauracin depender!n de las opciones que se hayan
especificado a la hora de hacer la copia de seguridad. *or ejemplo, si se incluye la opcin
"--add-drop-table" al hacer la copia de seguridad, se podr!n restaurar tablas que eisten
actualmente en el ser$idor %borr!ndolas primero&. *or lo que es necesario estudiar primero
los procedimientos que se utilizar!n tanto en la copia como en la restauracin, para que todo
se haga de la forma correcta.
"a sintais de este comando es la siguiente:
mysqldump -u AusuarioB -p Apass#ordB Anombre!base!datosB H Abac=up.sqlB
Hay que tener cuidado al realizar una copia de la base de datos, puesto que alguien
puede estar accediendo a la informacin y estar cambi!ndola. *ara ello, se puede "e$itar"
un acceso inoportuno que pueda dejar el fichero $olcado en un estado inconsistente a tra$-s
de $arias opciones, una de las cuales podra ser "--single-transaction", como se indica en el
siguiente ejemplo:
35
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
#mysqldump --single-transaction -u usuario -p pass#ord base!de!datos H base!de!datos!bac=up.sql
"a base de datos as $olcada se podra recuperar por medio de sentencias S)" en la
lnea de comandos de forma similar:
#mysql -u admin -p pass drupal C drupal!bac=up.sql
5lgunas de las opciones del comando "mysqldump" se muestran a continuacin:
--add-loc=s: 53ade 81R7+ /021I)8 antes y 8;.1R7+ /021I8 despu-s de la copia de cada
tabla.
-0@ --all-databases: 1opia todas las bases de datos. #s lo mismo que utilizar 8--
databases8 seleccionando todas.
-a@--all: ;ncluye todas las opciones de creacin especficas de (yS)".
--allo#-=ey#ords: *ermite la creacin de nombres de columnas que son palabras
cla$e. #sto se realiza poniendo de prefijo a cada nombre de columna el nombre de la
tabla.
-c@ --complete-insert: Utiliza "inserts" incluyendo los nombres de columna en cada
sentencia %incrementa bastante el tama3o del fichero&.
-2@ --databases: *ara copiar $arias bases de datos. #n este caso, no se especifican
tablas. #l nombre de los argumentos se refiere a los nombres de las bases de datos.
Se incluir! ";)I db!name" en la salida antes de cada base de datos.
--delayed: ;nserta las filas con el comando "-.)I$/ :I103I:".
-e@ --extended-insert: Utiliza la sintais de "-.)I$/" multilnea %proporciona sentencias
de "insert" m!s compactas y r!pidas&.
-#@ --debugA%option!stringB: Utilizacin de la traza del programa %para depuracin&.
--"elp: (uestra mensaje de ayuda y termina.
--ields-terminated-by...G --ields-enclosed-by%...G --ields-optionally-enclosed-by%...G --ields-
escaped-by%...G --lines-terminated-by%...: #stas opciones se utilizan con la opcin 8-/9, y
tienen el mismo significado que la correspondiente cl!usula 1R0: :0/0 -.Q-1I.
-Q@ --lus"-logs: #scribe en disco todos los logs antes de comenzar con la copia.
-@ --orce: 1ontin4a aunque se produzca un error de S)" durante la copia.
-"@ --"ost%...: 1opia los datos del ser$idor de (yS)" especificado. #l ser$idor por
defecto es 8local"ost9.
36
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
-l@ --loc=-tables: >loquea todas las tablas antes de comenzar con la copia. "as
tablas se bloquean con "$I0: 1R701" para permitir "inserts" concurrentes en caso de
tablas (y;sam. 1uando se realiza la copia de m4ltiples bases de datos, 8--loc=-tables8
bloquear! la copia de cada base de datos por separado, de forma que esta opcin
no garantiza que las tablase sean consistentes lgicamente entre distintas bases de
datos. "as tablas en diferentes bases de datos se copiar!n en estados
completamente distintos.
-+@ --disable-=eys: Se incluir! en la salida "/PM4**** 01/I$ /021I tb!name :-)021I +I3) P/G" y
"/PM4**** 01/I$ /021I tb!name I.021I +I3) P/G". #sto har! que la carga de datos en un
ser$idor (yS)" E.7 se realice m!s r!pido debido a que los ndices se crear!n
despu-s de que todos los datos hayan sido restaurados.
-n@ --no-create-db: 2o se incluir! en la salida "7$I0/I :0/020)I /PM32312 -Q .R/ IU-)/) P/
db!nameG". #sta lnea se incluye si la opcin "--databases" o "--all-databases" fue
seleccionada.
-t@ --no-create-ino: 2o incluir! la informacin de creacin de la tabla %sentencia
"7$I0/I /021I"&.
-d@ --no-data: 2o incluir! ninguna informacin sobre los registros de la tabla. #sta
opcin sir$e para crear una copia solamente de la estructura de la base de datos.
--opt: "o mismo que "--quic= --add-drop-table --add-loc=s --extended-insert --loc=-tables".
#sta opcin le debera permitir realizar la copia de seguridad de la base de datos de
la forma m!s r!pida y efecti$a.
-p your!pass@ --pass#ordA%your!passB: 1ontrase3a utilizada cuando se conecta con el
ser$idor. Si no se especifica, "%your!pass", "mysqldump" preguntar! la contrase3a.
-S@ --port%...: *uerto utilizado para las coneiones +1*.;*.
--protocol%E/7S V )R7+I/ V S-SI V 5I5R$3F: #specifica el protocolo de conein que se
utilizar!.
-q@ --quic=: 2o almacena en el buffer la sentencia, la copia directamente a la salida.
Utiliza "mysql!use!resultEF" para realizarlo.
-6@ --quote-names: #ntrecomilla las tablas y nombres de columna con los caracteres
OOO.
37
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
-r@ --result-ile%...: Ledirecciona la salida al fichero especificado. #sta opcin se
debera utilizar en (SM'=S, porque pre$iene la con$ersin de nue$a lnea OWnO en
nue$a lnea y retorno de carro OWnWrO.
--single-transaction: Utiliza el comando "2IX-." antes de realizar la copia desde el
ser$idor. #s muy 4til con las tablas ;nno'> y el ni$el de transaccin "$I0:!7R55-//I:",
porque en este modo realizar! la copia de seguridad en un estado consistente sin
necesidad de bloquear las aplicaciones. 1onsultar el manual para m!s detalles.
-) /pat"/to/soc=et@ --soc=et%/pat"/to/soc=et: #l fichero de soc@ets que se especifica al
conectar a 8local"ost9 %que es el host predeterminado&.
--tables: Sobreescribe la opcin "--databases" %-2&.
-/@ --tab%pat"-to-some-directory: 1rea un fichero "table!name.sql" que contiene la
sentencia de creacin de S)", y un fichero "table!name.txt? que contiene los datos de
cada tabla. #l formato del fichero O.txtO se realiza de acuerdo con las opciones "--ields-
xxx" y "--lines--xxx?. 2ota: esta opcin slo funciona si el comando "mysqldump" se
ejecuta en la misma m!quina que el demonio "mysqld"I adem!s, el usuario deber!
tener permisos para crear y escribir el fichero en la ubicacin especificada.
-u nombre!usuario@ --user%nombre!usuario: #l nombre de usuario que se utilizar! cuando
se conecte con el ser$idor, el $alor predeterminado es el del usuario actual.
-'@ --'erbose: Fa mostrando informacin sobre las acciones que se $an realizando
%m!s lento&.
-#@ --#"ere%(clYusula #"ere(: Sir$e para realizar la copia de determinados registros.
-U@ --xml: Lealizar! la copia de seguridad en un documento ml.
-x@ --irst-sla'e: >loquea todas las tablas de todas las bases de datos.
3.2.$.2.2 RESTAURACIN DE LA BASE DE DATOS A TRAVS DE MYSQLDUMP .
'el an!lisis de los ficheros del sitio /eb del grupo de control predicti$o se obtu$ieron los
datos necesarios para el acceso local a la base de datos. Se procedi a la copia de la base
de datos del sitio con el siguiente comando:
38
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
# mysqldump --single-transaction --user%.R52$I!;);0$-R 8-pass#ord%S0))ZR$:
--"ost%.R52$I![R)/ .R52$I!20)I!:0/R) H Q-7[I$R!207+;S.)61
2tese que con esta forma de ejecucin del comando no se tiene en cuenta la
posibilidad de que ya eista una base de datos con ese mismo nombre en el lugar de
destino. *ara solucionar este problema en caso de eistencia de una base de datos con el
mismo nombre que la que se intenta restaurar eisten distintas opciones: 6& borrar
manualmente la base de datos antes de restaurar la copia por medio de una herramienta de
administracin como (yS)" 1ontrol 1enter, N& borrar manualmente la base de datos a
tra$-s de la lnea de comandos de (yS)" o mediante un script, Q& tener en cuenta al
ejecutar "mysqldump" que eiste esta base de datos y a3adir la opcin "--opt" o "--add-drop-
table" para que al recuperar la base de datos a partir de la copia se borre en primer lugar la
base de datos eistente e insertar despu-s la copia.
1on la ejecucin del comando anterior, en el fichero "Q-7[I$R!207+;S.)61" se hallan
almacenadas todas las sentencias necesarias para poder reconstruir la base de datos en
otro ordenador.
5ntes de proceder a la restauracin, en el ordenador destino hay que crear el usuario de
(yS)" tal y como -ste eista en el host original. *ara ello, se abre un terminal y se inicia
(yS)" 1ontrol 1enter:
# cd /usr/local/mysqlcc/
# ./mysqlcc
Una $ez abierto (yS)" 1ontrol 1enter, pulsar con el botn derecho sobre ";ser
0dministration" y escoger la opcin ".e# ;ser". "os datos a insertar en cada uno de los campos
son los siguientes:
Username: nombre del usuario
Host: nombre o direcciKn del "ost
*ass/ord: pass#ord del usuario
1on esto ya se ha creado el nue$o usuario en la base de datos. *odra pensarse que se
podra recuperar la base de datos empleando a otro usuario. #n realidad podra hacerse,
pero entonces habra que modificar los datos almacenados en los ficheros de la p!gina para
que se pudiera realizar la conein con la base de datos, ya que -sta se encontrara
orientada para el usuario original de (yS)". *or simplicidad, debido a que despu-s habr!
que restaurarla en el ser$idor "nyquist.us.es", es preferible dar de alta a este nue$o usuario
con la misma configuracin que tena en el ser$idor 8nyquist.us.es9 en lugar de realizar las
modificaciones oportunas en los ficheros del sitio.
39
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
*ara proceder a restaurar la base de datos, el comando a ejecutar sera:
# mysql --user% .R52$I!;);0$-R --pass#ord%S0))ZR$:
.R52$I!20)I!:0/R) C Q-7[I$R!207+;S.)61
1on esto ya se encuentra el sistema en condiciones de empezar a modificar la base de
datos y lo m!s importante, poder $erla correctamente %ntese que el usuario debe incluir el
nombre de usuario y la cla$e correspondiente&.
3.2.$.3 ESTRUCTURA DEL S ITIO "EB.
#l sitio /eb est! desarrollado haciendo uso de las libreras "phphtmllib". *ara la creacin
de cada p!gina se ha usado una plantilla de ejemplo que traen dichas libreras, denominada
"MyLayoutPage". #sta plantilla genera una p!gina /eb con E zonas de contenido bien
diferenciadas: el encabezado, el pie, el men4 de la izquierda y el contenido de la p!gina.
(odificando el contenido de cada zona a tra$-s de m-todos especficos heredados de la
clase padre se construye cada una de las p!ginas.
3.2.$.# RELACIN ENTRE LAS TABLAS DE LA BASE DE DATOS .
*ara la actualizacin de las tablas de la base de datos haba distintas opciones:
6. ;ntroducir cada una de las publicaciones manualmente, a tra$-s del men4 de
insercin implementado en la propia /eb.
N. #ntender la interrelacin entre las tablas y generar un script php que directamente
modifique las tablas pertinentes a partir del contenido de un fichero de teto.
Se escogi la segunda opcin, por ser m!s generalizada y por ser reutilizable en un
futuro si fuera necesario actualizar de forma masi$a la base de datos.
"a base de datos ",roup/eb" consta de A tablas, algunas de ellas interrelacionadas
entre s. #stas tablas son: authors, boo@s, congress, journals, people, pfcs, phds, sent.
>oo@s: contiene los libros publicados por autores del grupo.
Pournals: contiene los artculos de autores del grupo publicados en re$istas.
1ongress: contiene las ponencias en congresos de autores del grupo.
*fcs: contiene los proyectos fin de carrera de alumnos que han sido tutelados por
miembros del grupo.
40
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
*hds: contiene las tesis de miembros del grupo de control predicti$o.
5uthors: tabla que contiene referencias a los autores de las publicaciones
almacenadas en las cuatro tablas anteriores.
*eople: almacena los datos de todas las personas pertenecientes al grupo que han
sido dadas de alta en el sistema de la p!gina /eb.
Sent: tabla con un registro por cada publicacin en$iada a una direccin de correo
electrnico.
5 continuacin se describir! con m!s detalle cada una de las tablas as como sus
respecti$os campos de informacin.
Tabla "Books":
#sta tabla almacena en cada registro una publicacin en formato libro de un miembro del
grupo. "os campos que se han de rellenar son los siguientes:
;d: campo autoincremental, es la cla$e de la tabla y sir$e para indear los registros.
+itle: ttulo del libro.
5bstract: resumen del contenido del libro.
Leference: referencia de b4squeda bibliogr!fica para el buscador de la /eb del grupo.
#sta referencia se forma con el primer apellido del autor principal, el tipo de publicacin
%en este caso libro, que se indica como ">==?"& y el a3o de publicacin.
*ublisher: editorial del libro.
Hear: a3o de publicacin.
;S>2: n4mero 4nico del libro en el est!ndar internacional.
1ode: puede ser 6 N dependiendo del tipo de publicacin %libro de actas o libro de
teto, respecti$amente&.
Tabla "Journals":
#sta tabla almacena en cada registro un artculo de re$ista de un miembro del grupo. "os
campos que se han de rellenar son los siguientes:
;d: campo autoincremental, es la cla$e de la tabla y sir$e para indear los registros.
41
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
+itle: ttulo del artculo.
5bstract: resumen del artculo.
Leference: referencia de b4squeda bibliogr!fica para el buscador de la /eb del grupo.
#sta referencia se forma con el primer apellido del autor principal, el tipo de publicacin
%en este caso sera una re$ista, que se indica con las siglas de la misma& y el a3o de
publicacin.
Pournal: re$ista.
Hear: a3o de publicacin.
Folume: $olumen de la re$ista.
*ages: p!ginas de la re$ista en las que se public el artculo.
Tabla "Congress":
#sta tabla almacena en cada registro una ponencia de congreso de un miembro del
grupo. "os campos que se han de rellenar son los siguientes:
;d: campo autoincremental, es la cla$e de la tabla y sir$e para indear los registros.
+itle: ttulo de la ponencia del congreso.
5bstract: resumen de la ponencia del congreso.
Leference: referencia de b4squeda bibliogr!fica para el buscador de la /eb del grupo.
#sta referencia se forma con el primer apellido del autor principal, el tipo de publicacin
%en este caso seran se trata de un congreso, que se indica con las siglas del mismo& y el
a3o de publicacin.
>oo@title: nombre del congreso.
Hear: a3o del congreso.
(onth: mes del congreso.
5ddress: direccin fsica del congreso
*ages: p!ginas del libro de actas del congreso en que se encuentra publicada la
ponencia.
42
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
Tabla "Pfcs":
#sta tabla almacena en cada registro un proyecto fin de carrera de un alumno tutelado
por un miembro del grupo. "os campos que se han de rellenar son los siguientes:
;d: campo autoincremental, es la cla$e de la tabla y sir$e para indear los registros.
+itle: ttulo del proyecto fin de carrera.
5uthor: autor del proyecto.
5bstract: resumen del proyecto.
'atepfc: fecha de publicacin del proyecto.
Leference: referencia de b4squeda bibliogr!fica para el buscador de la /eb del grupo.
#sta referencia se forma con el primer apellido del autor principal, el tipo de publicacin
%en este caso sera un proyecto fin de carrera, que se indica con las siglas *01& y el a3o
de publicacin.
Tabla "Phds":
#sta tabla almacena en cada registro una tesis de un miembro del grupo. "os campos
que se han de rellenar son los siguientes:
;d: campo autoincremental, es la cla$e de la tabla y sir$e para indear los registros.
+itle: ttulo de la tesis.
5bstract: resumen de la tesis.
'atephd: fecha de publicacin de la tesis.
Leference: referencia de b4squeda bibliogr!fica para el buscador de la /eb del grupo.
#sta referencia se forma con el primer apellido del autor principal, el tipo de publicacin
%en este caso sera una tesis, que se indica con las siglas *H'& y el a3o de publicacin.
Tabla "Authors":
#sta tabla almacena tantas entradas por publicacin como autores tenga la misma, sea
del tipo que sea. "os campos que se han de rellenar son los siguientes:
;d: campo autoincremental, es la cla$e de la tabla y sir$e para indear los registros.
*eople: campo "id" de la tabla "people" para el autor en cuestin %si -ste pertenece al
43
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
grupo&.
2ame: nombre del autor en caso de que no pertenezca al grupo.
*ublication: campo "id" de la tabla correspondiente a la publicacin almacenada.
+ype: el tipo de la publicacin %re$istaV6, congresoVN, etc&.
2umorder: rele$ancia del autor %autor principalV6, secundarioVN, etc&.
Pobcode: solamente se emplea si se trata de un pfc o un phd, con $alor "a" en caso
de ser el autor de la publicacin o "s" en caso de ser un super$isor.
Tabla "People":
#sta tabla almacena en cada registro un miembro del grupo. "os campos que se han de
rellenar son los siguientes:
;d: campo autoincremental, es la cla$e de la tabla y sir$e para indear los registros.
2ame: 2ombre del miembro.
Surname: 5pellidos del miembro.
"ogin: palabra empleada como "nic@" en el sitio /eb.
*ass/ord: cla$e para entrar en el sitio /eb con el login citado anteriormente.
>ibtetname: 0irma bibliogr!fica del miembro.
Tabla "Sent":
#sta tabla almacena en cada registro un artculo de re$ista de un miembro del grupo. "os
campos que se han de rellenar son los siguientes:
;d: campo autoincremental, es la cla$e de la tabla y sir$e para indear los registros.
2ame: nombre de la persona que solicita un documento.
5ffiliation: afiliacin, institucin.
#mail: correo electrnico.
*ublication: campo "id" de la publicacin solicitada en la tabla en que se encuentre.
+ype: tipo de publicacin %re$istaV6, congresoVN, etc&.
44
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
'ate: fecha y hora de la solicitud.
3.3 CONTROL REMOTO DE PROCESOS EN TIEMPO REAL MEDIANTE MATLAB %TCP%IP.
#l objeti$o que se persigue aqu es desarrollar una forma alternati$a de control de
procesos a tra$-s de internet, utilizando para ello protocolos como +1*.;*.
Hoy en da, la super$isin de procesos a gran escala se lle$a a cabo mediante complejos
sistemas S15'5, que proporcionan una alta fiabilidad y seguridad. #l problema que tienen
estos sistemas es que la compra de licencias es una limitacin debido a su coste.
Una forma m!s eficiente de controlar procesos de menor en$ergadura de forma m!s
simple podra radicar en el control de procesos a tra$-s de (atlab %programa de c!lculo
matem!tico de amplio uso en !mbitos uni$ersitarios y educati$os&. (atlab proporciona
herramientas para realizar c!lculos a tra$-s de interfaces /eb y realizar coneiones remotas
a sistemas, pero ninguna de estas utilidades cumplen los requisitos que aqu se imponen.
Si bien (atlab permite realizar c!lculos de forma remota a tra$-s de na$egadores /eb
mediante su herramienta (atlab Ser$er, tambi-n es cierto que cada c!lculo solicitado
mediante esta herramienta se ejecuta en instancias distintas, de forma que los c!lculos
nunca se realizaran para un mismo proceso en estudio, por lo que esta herramienta no es
4til en este caso.
=tra forma de control remoto reside en el modo eterno de Simulin@. #sta modalidad
permite la conein desde otro ordenador a un modelo de Simulin@, pero solamente permite
una conein y no slo eso, sino que adem!s no permite ning4n control sobre la conein
desde ese ordenador, pudi-ndose conectar cualquier usuario no deseado.
#s por esto que se necesita de un m-todo para realizar un control sobre una
determinada planta o proceso de forma segura, fiable y controlada.
3.# REQUISITOS PREVIOS PARA EL CONTROL REMOTO.
3.#.1 MICROSOFT VISUAL .NET.
#n lo que respecta a la interfaz /eb para el control remoto es necesaria una distribucin
de (icrosoft Fisual .2#+, debido a que -sta se encuentra en un fichero de etensin
45
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
8.aspx9, en el que se halla entremezclado cdigo 5S* con Fisual 1R.
#s $!lida cualquier $ersin, no es necesario que sea la 4ltima %(icrosoft Fisual .2#+
N77Q&. "a instalacin a realizar puede ser la tpica, ya que no se emplean libreras inusuales.
Lecu-rdese en la instalacin seleccionar tambi-n para su instalacin 8;nternet ;nformation
Ser$er9, y configurar adecuadamente el ser$idor para ser$ir p!ginas 5S*.
3.#.2 MATLAB &.$.
"a $ersin probada de (atlab fue la T.U. *uesto que esta parte del proyecto simplemente
incluye una librera de funcin S programada por el autor, no es necesaria una $ersin
reciente, puesto que utiliza funciones b!sicas de 1. 2o obstante, la $ersin con la que se
teste todo el sistema fue la $ersin T.U y no dio fallo alguno.
"a instalacin de (atlab puede ser una instalacin b!sica, esto es, no es necesario
instalar todos los paquetes, puesto que no se hace uso de ellos.
46
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
# METODOLOGA .
#.1 ACTUALI!ACIN AUTOMTICA DE BASES DE DATOS .
"a actualizacin de la base de datos se lle$a a cabo en E sencillos pasos:
#n el primero de ellos, el usuario deber! $alidarse como usuario con los
pri$ilegios adecuados para poder actualizar la base de datos.
#n el segundo, se seleccionar!n los ficheros de teto con la informacin para
actualizar los campos de la base de datos, as como la tabla que actualizar! cada
fichero. 5qu tambi-n se introducir!n las direcciones de las p!ginas /ebs que se
emplear!n en la actualizacin, as como los directorios que contienen los
documentos a subir al ser$idor.
#n el tercero, se especificar!n los campos que contiene cada fichero, as como
los caracteres que delimitan un campo de otro y los que separan una entrada de
otra. +ambi-n se mostrar!n aqu las rutas especificadas en el paso anterior %tanto las
de p!ginas /ebs como los directorios& que sean $!lidas y accesibles.
#n el cuarto paso se mostrar!n todas las entradas procesadas con toda la
informacin recogida. 1ada entrada se mostrar! como un conjunto de campos de
teto, rellenos con la informacin disponible %$acos si -sta no se facilit&, un campo
con el documento a subir %junto con un porcentaje de similitud en la b4squeda& y una
casilla de $erificacin para indicar que la entrada se encuentra completa y se puede
proceder a su actualizacin. 2o se deber! salir de este paso hasta que se hayan
completado todas las entradas y se hayan actualizado.
#s posible que en el cuarto paso no se tengan almacenados los datos de una
determinada publicacin, como una re$ista o un congreso. #n ese caso, en dicho paso
tambi-n se facilitar! un formulario para insertar los datos necesarios para que pueda
procederse a una correcta actualizacin.
#n resumen, el esquema a seguir es el siguiente:
47
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
#n los siguientes apartados se detallar! cada uno de los pasos.
#iste un fichero de funciones general %functions.inc.php& que incluyen cada uno de los
pasos. #n este fichero se definen $ariables cuyo significado se aclarar! aqu, puesto que
interpretan un papel fundamental en el caso de que se desee modificar el script para
utilizarlo con otra base de datos:
$lista_campos_adicionales: array que contiene los nombres de los campos
adicionales %campos fictios necesarios para una actualizacin colateral&. *or ejemplo,
el campo "autores", que no eiste como tal en ninguna tabla, pero que se emplea
para actualizar colateralmente la tabla de autores de las publicaciones. #ste array se
utilizar! para mostrar los nombres de los campos adicionales en las listas
desplegables.
$tabla_campos_adicionales: array que contiene los nombres de las tablas que
actualizar!n los campos adicionales contenidos en "$lista_campos_adicionales". *or
ejemplo, si el campo actualiza la tabla de las tesis, entonces $aldr! "phds", o si las
actualiza todas "all". 2tese que el nombre de la tabla debe ir en el mismo orden
que en "$lista_campos_adicionales".
$var_campos_adicionales: array que contiene los nombres de las $ariables que
48
Ilustracin 1: Flujo del sistema de actualizacin de bases de datos
Validacin
Seleccin de ficheros de actualizacin
Insercin de rutas adicionales
Seleccin de camos de actualizacin
!omlecin de entrada ara actualizacin
"roceder con actualizacin
#$uedan entradas or rocesar%
S&
'o
(in
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
almacenan los campos adicionales. *or ejemplo, el campo "autores" se almacena en
la $ariable "$authors", por lo que en "$var_campos_adicionales" se introduce
"authors".
$lista_campos_undef: array que contiene los nombres de otros campos que no se
utilizan para actualizar la base de datos en s, pero que son necesarios por alguna
razn. *or ejemplo, el campo "separador_campos", que es necesario para separar un
campo de otro dentro del fichero de actualizacin. #stos campos se distinguen de los
adicionales, adem!s, en que se conoce el campo que se $a a actualizar, pero lo que
no se conoce es el $alor.
$tabla_campos_undef: al igual que "$tabla_campos_adicionales", este array se
utiliza para almacenar los nombres de las tablas en las que se utilizar! este
par!metro. *or ejemplo, "separador_campos" se utiliza en todas las tablas, por lo que
se inserta "all" en este array en la posicin correspondiente.
$var_campos_undef: array que contiene los nombres de las $ariables que
almacenan los $alores de los campos no definidos. *or ejemplo, el separador de
campos se almacena en la $ariable de nombre "separador_campo".
$valores_campos_undef: array con los $alores de cada campo seleccionable en la
lista desplegable del campo no definido.
$desc_campos_undef: array con la descripcin de cada campo seleccionable en la
lista desplegable del campo no definido. "a razn de ser de este array y el anterior
es que normalmente los separadores son caracteres especiales, como nue$a lnea
%'\n'& o tabulador %'\t'&, que debido a una caracterstica de *H* se en$an de forma
incorrecta al siguiente formulario %duplica las barras in$ertidas&. *or ello, se en$a un
entero que se utilizar! en un array en el siguiente formulario para obtener el $alor
correcto. 1omo mostrar el entero en la lista desplegable no ofrecera ninguna
informacin al usuario se introduce este array, que contiene una descripcin correcta
de cada uno de los campos no definidos.
#.1.1 PASO 1 ' VALIDACIN.
#l primer paso es el m!s sencillo de todos. 1onsta de una pantalla en la que se
muestran dos campos de teto, uno para el login del usuario y otro para la contrase3a de
-ste.
49
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
"a razn de ser de este paso es bien sencilla y fundamental: si no eistiera este paso,
cualquier usuario podra acceder al sistema y causar destrozos o malfuncionamientos en la
base de datos. #s por ello que se antoja un requisito del sistema $alidar a los usuarios
permitidos al comienzo del proceso, de forma que se asegure el acceso a usuarios con los
permisos necesarios.
#l fichero que implementa este paso es 8update.html9.
#.1.2 PASO 2 ' S ELECCIN DE FICHEROS E INSERCIN DE RUTAS .
#l segundo paso responde a la necesidad del sistema de conocer el origen de la
informacin que se usar! para la actualizacin. *or ello, se muestra en pantalla un
formulario con tres partes bien diferenciadas:
0ormulario de seleccin de ficheros y tablas: el usuario ha de seleccionar los
ficheros de teto que contienen los datos a partir de los cuales se actualizar!n las
tablas de la base de datos y las tablas que -stos actualizan.
50
Ilustracin 2: Captura del paso 1 (Validacin de usuario)
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
0ormulario de insercin de rutas urls: el usuario insertar! en este campo de teto
las distintas direcciones /eb que complementar!n a los ficheros indicados en el paso
anterior.
0ormulario de insercin de rutas locales: el usuario insertar! aqu las rutas que se
encuentren en el ordenador desde el que se realiza la actualizacin que contengan
informacin complementaria para los casos del primer formulario %tablas a
actualizar&.
#l objeti$o es complementar la actualizacin de todas las formas disponibles, para que el
resultado sea el m!s completo y satisfactorio posible.
"as 4nicas formas de complementacin que no se han considerado son:
5ctualizacin a tra$-s del contenido de p!ginas /eb.
5ctualizacin a tra$-s de otra base de datos.
"a razn de no tener en cuenta la actualizacin a partir de otra base de datos es bien
simple. 2ormalmente, los usuarios mantienen las bases de datos introduciendo datos en
-stas a tra$-s de formularios de p!ginas /eb, y por tanto, solamente tienen que $alidarse en
el sistema como usuarios para poder realizar estas modificaciones. Sin embargo, para poder
acceder a una base de datos de forma directa y obtener listados de datos de tablas de la
misma es necesaria la contrase3a del usuario root o maestro, que normalmente es el mismo
usuario que cre la p!gina /eb. #sta contrase3a normalmente se encuentra bien protegida
y el acceso a la misma es muy limitado, de modo que slo lo conoce un grupo reducido de
usuarios, que no suele ser el mismo grupo que intenta actualizar otra base de datos distinta
en otra p!gina distinta.
Lespecto de no tener en cuenta el contenido de una p!gina /eb para complementar los
datos, la razn radica en que, a pesar de haber muchos sistemas automatizados hoy en da
para mostrar informacin de bases de datos en pantalla %listados de los contenidos de bases
de datos en p!ginas /ebs&, toda$a eisten p!ginas que se programan manualmente, y
muchas $eces ni siquiera acceden a bases de datos para la obtencin de la informacin que
muestran, sino que -sta se encuentra embebida %incrustada& en el mismo cdigo de la
p!gina. #l problema que conlle$a esto es que el error humano act4a en casos como el
incorrecto cierre de etiquetas html, o errores tipogr!ficos, de modo que si, por ejemplo, se
buscara el $olumen de una publicacin, habra p!ginas en las que -ste se mostrara
precedido de "Vol.", mientras que en otras podra ser "Volumen", "Volume" o simplemente
"V.". #sto conlle$a una casustica demasiado etensa como para tenerla en cuenta. *or otro
51
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
lado, si cada campo se encontrara embebido en una etiqueta de elemento "<li>" dentro de
una lista "<ul>", utilizando como separador de cada elemento, por ejemplo, ";", y al usuario
casualmente en alg4n caso se le ol$idara insertar dicho separador, entonces resultara en
una actualizacin errnea, y lo mismo pasara si se le ol$idara cerrar la etiqueta de elemento
con "</li>" si se utiliza -sta para discriminar entre entradas distintas.
*or todas estas razones no se han tenido en cuenta estos m-todos de actualizacin.
52
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
#.1.3 PASO 3 ' S ELECCIN DE CAMPOS DE LA ACTUALI!ACIN.
"a finalidad de este tercer paso es clara: el sistema necesita saber qu- campos del
fichero de actualizacin facilitado se corresponden de forma directa con alguno de los
53
Ilustracin 3: Captura del paso 2 (Seleccin de ficeros)
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
campos de las tablas de la base de datos y cu!les son campos a partir de los cuales se
construir!n otros.
#n este paso tambi-n se analizan las rutas facilitadas en el paso anterior, de forma que
se muestran en pantalla solamente aquellas a las que se ha podido acceder %comprobacin
pre$ia antes de proceder a ciegas a su uso&. Se analizan tanto las rutas correspondientes a
direcciones de internet para actualizacin mediante /eb como las correspondientes a rutas
locales para actualizacin mediante ficheros sitos en el mismo ordenador de la actualizacin
%o de la misma red&.
#l diagrama de flujo que recoge la secuencia de ejecucin de este paso se muestra a
continuacin:
54
Ilustracin !: Flujo del proceso de seleccin de campos ("aso 3)
)eco*er informacin de +ase de datos
Su+ir ficheros de actualizacin al ser,idor
"ara cada ta+la
-ostrar camos de la ta+la
-ostrar camos adicionales
-ostrar camos interacti,os
.nalizar urls del aso 2
-ostrar las correctas / accesi+les
-ostrar directorios del aso 2
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
#.1.# PASO # ' COMPLECIN DE ENTRADAS PARA ACTUALI!ACIN.
#l paso E se repite cclicamente, mostrando en pantalla las entradas que restan por
actualizar en la base de datos. ;nicialmente se muestran todas las entradas procesadas a
partir de los ficheros de actualizaciones, di$ididas en los campos finales que actualizar!n la
tabla correspondiente. #n la primera iteracin de este paso, el sistema procede al an!lisis de
todos los ficheros facilitados, y durante este largo proceso, se $a mostrando en pantalla un
mensaje indicando la entrada del documento que se est! analizando, ya que el usuario
podra pensar que el sistema queda colgado en un estado inconsistente %$-ase ilustracin
T&.
*or cada entrada de los ficheros se muestra un cajn de campos editables, entre los que
se encuentran los siguientes elementos:
55
Ilustracin #: Captura del paso 3 (Seleccin de campos)
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
+abla que actualizar!.
1ampos que se usar!n para la actualizacin, mostrados mediante campos de
teto para una posible modificacin si fuera necesaria antes de proceder a la
actualizacin. "a razn de hacer esto radica en que muchas $eces eisten errores
tipogr!ficos en las fuentes de la informacin, y con esto se quiere dar la opcin al
usuario de que corrija dichos fallos. #sto se puede $er f!cilmente en el campo de
fichero pdf que se eplica a continuacin, pues si se encuentra un documento que
tenga un porcentaje de coincidencia entre CUM677W, esto querr! decir que $ara en
alguna.s letra.s, de forma que estos errores son f!cilmente identificables.
0ichero pdf que se subir! al ser$idor: aqu se mostrar!n el fichero pdf que mayor
coincidencia tenga con la publicacin buscada %siempre que tenga un porcentaje de
coincidencia superior al CUW&, si se encuentra en alguna de los directorios o urls
facilitados en el paso N, junto con el porcentaje de coincidencia entre par-ntesis. Si
no se ha encontrado ninguno, se puede indicar un fichero pdf manualmente,
insertando la ruta en el campo de teto o bien busc!ndolo en un directorio local
pulsando en el botn "eaminar". #n el caso de que la b4squeda de$uel$a $arios
documentos con porcentajes de coincidencia superiores al CUW, entonces se
mostrar!n en pantalla todos los resultados y se dar! al usuario la posibilidad de
escoger el resultado correcto %esto suele ocurrir cuando un artculo y una ponencia
de congreso de un mismo autor sobre una misma tem!tica se encuentran a la $ez en
la fuente de la informacin: normalmente coincidir!n en el nombre del artculo, y al
sistema le ser! imposible detectar cu!l es el correcto&.
1asilla de $erificacin de "no especificacin de pdf".
1asilla de $erificacin de "entrada completa".
1asilla de $erificacin de "entrada no deseada" %cuando no se desea a3adir la
entrada a la base de datos&.
#l proceso de actualizacin tiene lugar en este paso de la siguiente forma: se mostrar!n
todas las entradas contenidas en los ficheros de actualizacinI una $ez una entrada est-
completa, se marcar! la casilla de $erificacin de "entrada completa" y el sistema pasar! a
actualizarla, de modo que al $ol$er sobre este paso se mostrar!n todas las entradas que
hubiere antes a ecepcin de las ya actualizadas. +odo esto puede obser$arse en la
ilustracin A.
#n el proceso de actualizacin tambi-n se controla si eiste una entrada igual en la base
56
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
de datos antes de actualizarla, con la finalidad de e$itar duplicidades.
#l fichero 8functions.step3.php9 es un fichero de funciones complementario para el paso
E, debido a que es bastante laborioso, y por claridad del cdigo principal se han etrado la
mayora de funciones independientes y se han incluido en este fichero.
5dem!s, hay un fichero 8proc_files.php9 que realiza todo lo correspondiente a la copia
de ficheros en el ser$idor. *uesto que la copia de ficheros es un proceso largo, el usuario
puede creer que en alg4n momento del proceso el sistema se ha quedado colgado, ha
quedado en un estado inconsistente. *ara soslayar este inco$eniente est! este fichero.
'urante la copia de ficheros muestra en pantalla una barra de progreso %como se muestra
en la ;lustracin B& que indica al usuario qu- fichero se est! copiando, el porcentaje copiado
y el porcentaje del total de ficheros a copiar. 5 su $ez, en el fichero 8paso3.php9 est!
programado que se muestre por pantalla cada una de las entradas que se $an procesando.
#sto significa que en primer lugar se actualiza la base de datos y posteriormente se procede
a la copia de los ficheros.
Una $ez actualizada por completo la base de datos, el sistema mostrar! por pantalla un
mensaje de -ito en la actualizacin, como se muestra en la figura A.
57
Ilustracin $: Captura del paso ! % &nalizando las entradas de los ficeros
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
58
Ilustracin ': Captura del paso ! % Copiando ficeros
Ilustracin (: Captura del paso ! % )ase de datos actualizada
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
59
Ilustracin *: Captura del paso ! % +istado de los art,culos encontrados
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
#.1.$ FICHERO DE INCLUSIN GENERAL .
#l fichero de inclusin general es un fichero que se incluye al comienzo de todos los
ficheros que componen el proceso de actualizacin. #n primer lugar desempe3a una funcin
muy importante porque genera unos arrays a partir de la informacin de la base de datos
especificada que facilitan la migracin hacia otro sistema. #sto es, crea arrays con
informacin sobre los campos de las tablas de las bases de datos y otra informacin que se
emplea en los pasos iniciales de configuracin y que, al ser de car!cter general, permiten a
un usuario a$anzado que desee adaptar el sistema a otra base de datos modificar
solamente el procesado que se hace de los datos de la misma, sin tener que programar
nue$o cdigo para obtener esta informacin. #stos arrays son:
$lista_campos_adicionales: almacena los campos que no aparecen como tales
en las tablas de la base de datos pero que son necesarios porque a partir de ellos se
generar!n otros que s se encuentran en -stas.
$tabla_campos_adicionales: almacena los nombres de las tablas que modificar!n
los campos adicionales recogidos en 8$lista_campos_adicionales9.
$var_campos_adicionales: indica los nombres de los arrays que almacenar!n los
$alores de los campos adicionales tras leerlos de las fuentes de informacin
indicadas.
$lista_campos_undef: estos campos son campos no eistentes en tablas y que no
son necesarios para obtener campos eistentes en la tabla, pero que s son
necesarios para procesar -stos. 5 modo de ejemplo, un campo de este array es
8separador_campos9, el cual indica qu- separador se utilizar! en los ficheros de teto
para separar los campos contenidos.
$tabla_campos_undef: similar a 8$tabla_campos_adicionales9 pero referido a
8$lista_campos_undef9.
$var_campos_undef: similar a 8$var_campos_adicionales9 pero referido a
8$lista_campos_undef9.
$valores_campos_undef: los campos definidos en 8$lista_campos_undef9 no
pueden ser ingresados por el usuario, y necesitan de unos $alores definidos
pre$iamente, permitiendo al usuario elegir uno u otro $alor. #stos $alores
predefinidos se almacenan en este array. *or ejemplo, para el caso del separador de
campos 8separador_campos9, los $alores pueden ser un retorno de carro, un car!cter
nue$a lnea, un tabulador, un punto y coma, ...
60
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$desc_campos_undef: son las descripciones que se mostrar!n en la lista
desplegable del script de actualizacin, de modo que estas etiquetas almacenadas
en el array representar!n lo que el usuario $er!. *or ejemplo, en el caso de un
retorno de carro, aparecera en la lista desplegable 8\r9.
"o que resta de contenido de este fichero es un conjunto de funciones de car!cter
general que son usadas en pr!cticamente todos los pasos del proceso de actualizacin.
#l fichero que implementa estas funciones de car!cter general es 8functions.inc.php9.
#.2 CONTROL REMOTO DE PROCESOS EN TIEMPO REAL MEDIANTE MATLAB %TCP%IP.
"a finalidad de esta parte del proyecto es controlar un sistema a tra$-s de Simulin@, en
tiempo real haciendo uso del toolbo "Leal +ime <or@shop" y de forma remota haciendo
uso del protocolo +cp.;p para transportar datos a tra$-s de red e implementar un sistema
cliente.ser$idor.
#ste sistema se pensaba emplear en la red de ecelencia Hycon, y estaba destinado
para su uso en los eperimentos sobre la planta solar de los laboratorios de la Uni$ersidad
de Se$illa, pero al final no se implement. #stos eperimentos se realizaban desde
uni$ersidades situadas en otros pases, por lo que el control deba hacerse a tra$-s de un
operario situado en el ordenador de control de la planta solar, lle$ando a cabo todas las
acciones deseadas por los usuarios remotos. #l problema que tiene este planteamiento es
que hay que tener una persona dedicada ntegramente a insertar las rdenes de los
usuarios, puesto que -stos no pueden acceder directamente al controlador.
*or ello, se pens en una forma alternati$a de control, bas!ndose en el protocolo +cp.;p.
(atlab dispone de un modo de ejecucin en Simulin@ denominado "modo eterno".
5cti$ando este modo, antes de la ejecucin (atlab compila el modelo de Simulin@,
generando cdigo ejecutable. #ste cdigo ejecutable no es m!s que un ser$idor que
escucha peticiones en un puerto determinado. *ara conectarse, un cliente simplemente
debe ejecutar el mismo fichero de modelo de Simulin@ con el que se compil el ser$idor en
(atlab, e indicar la direccin ip y el puerto en los que se encuentra corriendo el ser$idor.
1on este modo parece en principio que se puede solucionar el problema del control remoto,
pero no es as: con este modo, cualquier usuario puede conectarse a la planta y modificar
par!metros sin ning4n tipo de super$isin, lo que podra redundar en malfuncionamientos de
los equipos, inhabilitacin de los mismos o incluso cat!strofes. *or otra parte, solamente
61
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
puede conectarse un usuario al ser$idor.
*or tanto, el modo eterno del Leal +ime <or@shop ofrece $entajas e incon$enientes,
pero no sir$e para sol$entar el problema en cuestin.
+ampoco se pudo utilizar el programa (atlab Ser$er que implementa el propio (atlab,
debido a que, si bien permite la ejecucin remota de ficheros de (atlab sobre el ordenador
que implementa el ser$idor, -sta se ejecuta en una instancia distinta por peticin, esto es, si
el usuario ejecutase el controlador en (atlab Ser$er, se creara una nue$a instancia de
ejecucin para el nue$o usuario, de forma que se crearan $arias para distintos usuarios,
perdiendo el requisito del control en tiempo real, puesto que no se pueden aplicar $arios
controladores a una misma planta simult!neamente. #ste modo de trabajo es 4til para
realizar simulaciones de forma eterna, pero se necesita un m-todo que incluya la
eclusi$idad de la planta: solamente un usuario puede tener acceso a ella e implementar el
control que desee.
"a solucin fue utilizar funciones S, que pueden ser programadas en 1. "a funcin S
dise3ada consta de un bloque con 6 entrada %que en realidad es irrele$ante, pues no realiza
ninguna funcin, pero que podra tener su utilidad en una posterior facilidad del usuario, esto
es, siempre es m!s cmodo facilitar las referencias iniciales a tra$-s de bloques y
establecer su $alor gr!ficamente, de modo que una futura mejora podra ser establecer
tantas entradas como salidas y facilitar los $alores iniciales de los par!metros a tra$-s de
estas entradas en lugar de mediante la $entana de configuracin del bloque& y 67 salidas. #l
objeti$o es que el usuario pueda establecer los $alores que desee a las salidas del bloque,
pudi-ndolos usar como referencias de otros bloques o incluso para cambiar $alores de
par!metros, como ganancias est!ticas. "a funcin S lee peridicamente un fichero de
intercambio que almacena los $alores a cambiar. Si el usuario desea modificar alguna de las
salidas del bloque, entonces una interfaz /eb act4a de cliente con un ser$idor que se
encuentra en el mismo ordenador que el ejecutable ser$idor de (atlab. #ste ser$idor recibe
la informacin con los par!metros a cambiar y modifica el fichero de intercambio para que al
leerlo el ejecutable ser$idor de (atlab obtenga los nue$os $alores de las salidas.
"as $entajas que ofrece este sistema sobre el modo eterno son $arias:
*osibilidad de controlar el sistema desde cualquier ordenador $a la interfaz /eb.
*osibilidad de implementar restricciones al control remoto mediante programacin
en la funcin S encargada de la lectura promiscua del fichero de intercambio.
*osibilidad de restringir qu- par!metros se pueden modificar.
62
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
*osibilidad de control simult!neo mediante $arios usuarios.
"as des$entajas tambi-n son importantes:
#l protocolo +cp.;p, a pesar de ser robusto, no es in$ulnerable a fallos en la red y
podran perderse las modificaciones de algunos usuarios.
2ecesidad de implementar los bloques de Simulin@ como funciones S si se desea
cambiar par!metros de un bloque, como por ejemplo, la ganancia est!tica de un
sistema de segundo orden %este problema se $er! m!s adelante&.
#n el siguiente apartado se describir!n cada una de las partes que componen el sistema
completo.
#.2.1 ESTRUCTURA GENERAL DEL S ISTEMA DE CONTROL REMOTO.
"a estructura de conein del sistema se muestra a continuacin:
"os elementos in$olucrados son:
=rdenador remoto: se trata de un *1 con conein a internet que acceder! a la
interfaz /eb de control remoto del sistema mediante un na$egador cualquiera.
Ser$igar: es el ser$idor que aloja la interfaz /eb de control remoto. ;mplementa un
63
Ilustracin 1-: .structura /eneral del sistema de control remoto
S0)VI1.)
'023I40
5e+
"a*e
Ser,er
Ser,er
!lient
555
)0-240 "!
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
ser$idor ;;S con sistema operati$o <indo/s D* *rofessional. "a interfaz /eb se
encuentra programada en Fisual 1R %la parte del ser$idor& y 5S* %la parte de la
interfaz /eb&. #sta interfaz /eb es la encargada de mostrar al usuario los $alores
eistentes en el modelo de Simulin@ que se encuentra corriendo actualmente en el
ser$idor 2eoite, as como de recibir los nue$os $alores que los usuarios remotos
deseen modificar y en$iar dichos datos a una aplicacin ser$idor que escucha en un
determinado puerto en 2eoite. 5dem!s, tiene implementado una aplicacin ser$idor
que recibe de 2eoite una representacin del modelo de Simulin@ implementado,
para que se muestre al usuario en la interfaz /eb, el modelo de Simulin@ %fichero
8.mdl9& y el fichero con los $alores de los par!metros.
2eoite: es el ordenador que se encarga del control del sistema. Ser! el que
implemente la ejecucin del modelo en Simulin@ para el control del sistema, por lo
que consta de una aplicacin en (atlab para generar una representacin del modelo
y en$iar -sta junto con el modelo a la aplicacin ser$idor en Ser$igar. #sta aplicacin
en (atlab in$oca una aplicacin cliente que en$a ambos ficheros a la aplicacin
ser$idor en Ser$igar. +ambi-n implementa una aplicacin ser$idor que recoge los
datos en$iados por Ser$igar cuando se modifiquen los $alores de los par!metros.
#sta aplicacin ser$idora modifica el fichero de intercambio en consecuencia,
permitiendo que en la siguiente lectura del bloque de funcin S Simulin@ modifique
los $alores de sus salidas.
#.2.2 S ERVIGAR .
#.2.2.1 INTERFA! "EB.
"a interfaz /eb se encuentra programada en 5S* y Fisual 1R, debido a que se tena
pensado implementarla en un principio en el >enchmar@ N de la red de ecelencia Hycon,
que se encarga del control remoto de un sistema hbrido %una plataforma solar con E placas
solares, un sistema de refrigeracin y una caldera&, y se necesitaba implementar 5cti$eD
para poder realizar el control $a =*1.
1omo se puede obser$ar en la siguiente imagen, la interfaz /eb es simple: muestra dos
cuadros de teto por cada par!metro modificable %uno con el $alor actual y otro para insertar
el nue$o $alor&, y debajo de estos cuadros se sit4a una representacin gr!fica del
controlador implementado, para que los usuarios sepan si el controlador implementado es el
64
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
suyo o no. 5dem!s, de esta forma es m!s f!cil $er qu- salida se corresponde con el
par!metro deseado, consiguiendo una modificacin de los par!metros m!s f!cil e intuiti$a.
"a parte de 5S* es bien simple. 2o ocurre as con la parte de Fisual 1R. "o primero que
se hace es comprobar que el usuario posee los permisos necesarios para proceder con la
modificacin de par!metros %para ello tiene que estar dado de alta en el sistema, es decir,
en la /eb, y tener reser$ado un periodo de prueba sobre la planta o bien ser el
administrador&. *osteriormente, se comprueba la eistencia del fichero de modelo de
Simulin@ as como de su representacin gr!fica.
#l siguiente paso es la lectura del fichero "nombre.mdl" %donde "nombre" indica el
65
Ilustracin 11: Captura de la interfaz 0eb del sistema de control remoto
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
nombre del fichero que se encuentre en el direcorio de la p!gina&, que contiene los $alores
actuales de los par!metros. #sto se utilizar! para mostrar los $alores en los campos
sombreados en gris, que indican los $alores actuales. Si el usuario desea un nue$o $alor,
deber! indicarlo en el cuadro blanco adjunto.
5sociado al botn "1hange *arameters" se encuentra el m-todo
">utton1hange*aramsX1lic@", que implementa toda la parte cliente de la interfaz /eb, la
cual ser! la que en$e los datos cambiados a la aplicacin ser$idor sito en 2eoite. #l primer
paso es establecer una conein con el equipo destino, en este caso 2eoite.
*osteriormente, se crea el mensaje a en$iar. *ara ello se miran todos los campos de teto
de los par!metros. Si el campo no est! $aco, entonces se introduce en el mensaje una
lnea con el teto "$arDV$alorYn", donde D es el n4mero de la $ariable y $alor es la cantidad
introducida en el campo de teto. "as lneas se separan unas de otras introduciendo un
car!cter de nue$a lnea "Yn".
"a construccin del mensaje inicial obedece a un protocolo bastante simple creado para
esta aplicacin. #l formato de dicho mensaje es:
L#)U#S+Z(='#Z;*X5''L#SSZ(S,X"#2,+HZ0;"#X25(#
"L#)U#S+" indica el tipo de peticin. #n este caso, siempre ser! del tipo
"(='XL#)U#S+", que indican que se trata de una peticin de modificacin del fichero de
intercambio.
"(='#" indica el modo de la peticin. #n este caso, siempre ser! "=F#L<L;+#", que
indica que en el lado ser$idor se crea un nue$o fichero, sobreescribiendo el anterior en caso
de que eistiera.
";*X5''L#SS" es la direccin a la que se en$a el mensaje, es decir, la direccin de
2#=D;+#.
"(S,X"#2,+H" es el tama3o del fichero que se $a a en$iar posteriormente. #ste
mensaje ser! el que incluya todos los datos necesarios para la modificacin del fichero de
intercambio.
"0;"#X25(#" es el nombre del fichero que se $a a modificar.
Una $ez en$iado este mensaje inicial de solicitud de modificacin del fichero de
intercambio se espera el 51? o mensaje de asentimiento. #ste mensaje se caracteriza
porque simplemente se trata de una cadena de teto con el mensaje "*L=1##'" en caso
de que se permita proceder con la modificacin. #n caso de recibir cualquier otra cosa, se
66
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
aborta la operacin.
Una $ez en$iado los datos que se han de modificar, se modifica tambi-n el fichero
"nombre.log" %donde "nombre" indica el nombre del fichero que se encuentre en el directorio
de la p!gina&, que reside en Ser$igar y que se utiliza para leer los $alores actuales de los
par!metros. *uesto que se modifican, se ha de actualizar. *ara -ste no es necesario
realizar una peticin, puesto que se encuentra en el mismo ordenador.
*or 4ltimo, se han de refrescar los campos de teto con los $alores actuales, y $aciar el
contenido de los campos de teto que modifican los $alores de los par!metros.
#n todo momento eiste una etiqueta para mostrar mensajes de error en caso de que los
hubiere. "os casos contemplados son los errores de conein con la aplicacin ser$idor en
2eoite.
#l cdigo para la interfaz /eb se encuentra en el fichero 8tunning.aspx.cs9.
#.2.2.2 APLICACIN S ERVIDOR EN S ERVIGAR .
#sta aplicacin se encuentra programada en Fisual 1R. Su funcin principal es la
recepcin de tres ficheros, necesarios para el correcto funcionamiento de la interfaz /eb.
#stos tres ficheros son en$iados por la aplicacin cliente en 2eoite, y son los siguientes
%donde "nombre" indica el nombre del fichero que se encuentre en el direcorio de la p!gina&:
nombre.log: fichero de teto plano que contiene los $alores iniciales de los
par!metros.
nombre.mdl: fichero de modelo de Simulin@ que contiene el modelo implementado
en el control del sistema.
nombre.png: fichero de imagen que contiene una captura del modelo con la
finalidad de mostrarlo posteriormente en la interfaz /eb.
"a aplicacin ser$idor es una aplicacin multihilo, pues implementa en un hilo un ser$idor
sncrono que se bloquea a la escucha de nue$as peticiones por un determinado puerto, y
por otro lado, un hilo que implementa el control de la aplicacin y permite en cualquier
momento salir de la misma.
"a primera operacin que se realiza es la ejecucin del hilo de control de la aplicacin,
denominado "hiloXlector", por leer de forma promiscua la entrada de datos a tra$-s del
teclado.
67
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
#n segundo lugar se inicia el ser$idor en s, enlaz!ndolo con el punto local
correspondiente a Ser$igar %6CQ.6EB.6T6.AC&, y poni-ndolo a escuchar de forma promiscua
en un puerto %QCAUE& dentro de un bucle de control. #n este bucle, lo primero que se hace
es, como ya se ha dicho, poner el ser$idor a escuchar en un puerto especfico, y
posteriormente, cuando se recibe una conein entrante, comienza el procesamiento de la
peticin.
#n primer lugar se realiza un filtrado de las ;*s, pues no se permite la conein de
cualquier equipo. Si se trata de una direccin ;* $!lida y admitida, entonces se recibe el
mensaje y se procesa la solicitud. #isten distintos casos:
"1=*HXL#)U#S+": solicitud de copia de ficheros remota.
"(='XL#)U#S+": solicitud de modificacin remota de ficheros.
"5>=L+": solicitud de abortar programa.
+odo esto se resume en el flujo de programa de la ilustracin 6N.
Hay que mencionar que en una peticin de copia remota de ficheros %1=*HXL#)U#S+&
se compara la etensin del fichero recibido. Si dicha etensin coincide con la etensin
propia de los ficheros de modelo de Simulin@ %.mdl&, entonces se genera tambi-n el fichero
.log aqu. #ste fichero se crea a partir de la lectura y el an!lisis del fichero de modelado de
Simulin@. Se busca la lnea de definicin de los par!metros del bloque que contiene la
funcin S que implementa el control remoto, se almacenan los $alores de dichos par!metros
en un array y posteriormente se insertan en un fichero, de nombre el mismo que el fichero
de modelado, y etensin 8.log9. #ste fichero ser! el que utilizar!n m!s adelante la interfaz
/eb y la aplicacin ser$idor de Ser$igar para la actualizacin de los $alores modificados por
el usuario remotamente.
#l hilo lector de teclado es m!s simple en su concepcin y funcionamiento. Simplemente
lee la entrada del teclado a la espera de recibir la cadena "exit", momento en el cual
procede a en$iarse a s mismo un mensaje "ABORT" para salir del bucle de escucha
promiscua de mensajes entrantes.
+odo el cdigo se encuentra embebido en estructuras tryMcatch para capturar todas las
ecepciones posibles, con la finalidad de hacer seguro el cdigo.
68
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
#.2.3 NEO(ITE.
#.2.3.1 BLOQUE TUNNING )S*FUNCTION+.
#l fichero 8tunning.c9 contiene el cdigo fuente del bloque que implementa la lectura del
fichero de intercambio.
"o primero que debe hacerse es compilar este fichero para que (atlab genere una dll
que pueda usarse en los bloques de funciones S de Simulin@. *ara ello, desde la lnea de
comandos y siendo el directorio de trabajo el que contiene el fichero 8tunning.c9, el usuario
ha de escribir en la lnea de comandos de (atlab:
mex tunning.c
+ras haber finalizado la compilacin, en el mismo directorio se encontrar! el fichero
8tunning.dll9, que contendr! la $ersin compilada del cdigo fuente de la funcin S.
*ara utilizar esta dll, en el modelo de Simulin@ que implemente el controlador que se
desea testear remotamente el usuario debe insertar un bloque 8SM0unction9 %en Simulin@
"ibrary >ro/ser se encuentra en 8Simulin@969User['efined 0unctions969SM0unction9&, y
69
Ilustracin 12: Flujo del pro/rama multiilo ser1idor de Ser1i/ar
"ort 7istenin*
I" (ilter
"rocess )ecei,ed -essa*e
!2"8 )0$9 -2: )0$9 .;2)4
)ead <e/+oard Inut
0=it
03I4
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
especificar en las propiedades del mismo lo siguiente:
S-function name: tunning
S-function parameters: 1,2,3,4,5,6,7,8,9,10
#ntonces aparecer! un bloque de Simulin@ de nombre 8tunning9, con una entrada y diez
salidas. 2tese que el nombre de la funcin S que se especifica debe ser el de la dll. Si la dll
no se encuentra en el mismo directorio que el modelo de Simulin@ que la in$oca, al intentar
ejecutar el modelo producir! un error.
"os par!metros que se definen en las propiedades corresponden a los $alores iniciales
de las salidas del bloque. #stos $alores son los que posteriormente se modificar!n a tra$-s
de la interfaz /eb %se ha puesto del 6 al 67 por poner alg4n $alor, pero el usuario deber!
poner aqu las referencias iniciales que desea a la salida del bloque&.
*or otro lado, tambi-n hay que tener en cuenta las distintas modificaciones de las
propiedades del modelo que hay que realizar pre$iamente. *ara que se genere el ejecutable
del modelo es necesario establecer la siguiente configuracin:
#n 8+ools969LealM+ime <or@shop969=ptions9:
#n la pesta3a 8LealM+ime <or@shop9:
1ategory: +arget configuracion.
System target file: grt.tlc.
+emplate ma@efile: grtXdefaultXtmf.
(a@e command: ma@eXrt/.
'esmarcar 8,enerate code only9.
1ategory: ,eneral code generation options:
(arcar 8Ferbose builds9.
(arcar 8"ocal bloc@ outputs9.
1ategory: ,L+ code generation options:
(arcar 8#ternal mode9.
#n la pesta3a 8Sol$er9:
Sol$er options:
+ype: 0iedMstep, discrete %no continuous states&.
70
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
0ied step size: auto.
(ode: Single +as@ing.
#n 8+ools969#ternal mode control panel9:
#n 8+arget interface9:
(#DMfile for eternal interface: etXcomm.
#n la pesta3a de la $entana de Simulin@ que muestra una lista desplegable hacia abajo y
que tiene seleccionada la opcin 82ormal9, hay que seleccionar la opcin 8#ternal9.
Una $ez creado el modelo de Simulin@ deseado para implementar el controlador, se ha
de compilar el modelo completo, y para ello se presiona en el botn 8>uild 5ll9, que se
encuentra junto a la lista desplegable anterior.
#.2.3.2 APLICACIN MATLAB .
"a finalidad de la aplicacin programada para (atlab es la establecer todos los requisitos
pre$ios para un control remoto. >!sicamente se encarga de la generacin de la imagen del
controlador y el posterior en$o de la misma junto con el fichero del controlador al ser$idor
/eb.
#l flujo del programa se describe en el siguiente esquema:
71
Ilustracin 13: Flujo del script de 2atlab para el sistema
de control remoto
2+tener nom+re controlador
.lmacenar ima*en controlador
0n,iar 9mdl / 9n*
0liminar ficheros intermedios
(in
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
;nicialmente el programa solicita al usuario el nombre del fichero que contiene el
controlador %con etensin .mdl o sin ella&. 5 continuacin abre dicho controlador en una
nue$a $entana de Simulin@ donde realiza una captura para generar el fichero de imagen.
'icho fichero de imagen se crea haciendo uso del ejecutable "convert.exe" que se
distribuye con el paquete de soft/are libre ;mage(agic@.
(atlab proporciona un fichero de imagen 8.bmp9, pero para en$iar im!genes a tra$-s de
la red es con$eniente con$ertir el formato a uno que ofrezca compresin y adem!s
proporcione $entajas adicionales, como la transparencia de fondo, para una mejor
integracin con la interfaz /eb. *or todo ello, el formato destino de la con$ersin es .png
%*ortable 2et/or@ ,raphics&, y es debido a esto la utilizacin de ;mage(agic@, ya que
proporciona un ejecutable en lnea de comandos que facilita en gran medida la con$ersin
de 8.bmp9 a 8.png9.
*or 4ltimo, el programa in$oca a la aplicacin cliente de 2eoite
%cp_client_neoxite.exe&, que es la que se encarga del en$o de ambos ficheros, el de
imagen y el de Simulin@, a la aplicacin ser$idor sito en Ser$igar, que ubica ambos ficheros
en un directorio especfico para que la interfaz /eb sea capaz de generar correctamente los
datos en pantalla.
#l fichero que contiene la aplicacin (atlab es "sendtoservigar.m".
2=+5: el fichero de par!metros se ha de crear manualmente antes de proceder a la
ejecucin del modelo de Simulin@. Se ha de crear un fichero de teto. Su contenido puede
ser nulo, o si el usuario lo prefiere, puede insertar una lnea por $ariable, con la sintais
8varX=val9, donde 8X9 indica el ndice de la $ariable %var1, var2, etc& y $al el $alor de la
misma, aunque esto lo realiza el bloque de modificacin de par!metros autom!ticamente
una $ez se inicia su ejecucin, pero se ha de recalcar que dicho bloque 2= crea el fichero.
#l nombre del fichero deber! ser 8tunning.txt9.
#.2.3.3 APLICACIN CLIENTE.
"a aplicacin cliente de 2eoite es la que se encarga de la copia.modificacin de
ficheros remota en Ser$igar. #s in$ocada por el script programado para (atlab y, al igual
que los ser$idores programados tanto en 2eoite como en Ser$igar, dispone de un protocolo
de transferencia dise3ado para un mejor control y una mayor fiabilidad de las operaciones
72
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
remotas.
#l protocolo posee un esquema de funcionamiento simple. #n primer lugar el cliente
genera un mensaje de intercambio de informacin en el que indica al ser$idor el tipo de
peticin que desea realizar y adem!s le proporciona informacin di$ersa que es necesaria
para -ste. #l formato de este mensaje inicial es:
L#)U#S+Z(='#Z;*X5''L#SSZ(S,X"#2,+HZ0;"#X25(#
"L#)U#S+" indica el tipo de peticin. *uede ser del tipo "1=*HXL#)U#S+" o
"(='XL#)U#S+", que indican que se trata de una peticin de copia de fichero o de
modificacin de fichero respecti$amente.
"(='#" indica el modo de la peticin. *uede tener los $alores "1L#5+#" u
"=F#L<L;+#", que indica que en el lado ser$idor se crea un nue$o fichero, sin
sobreescritura en el primer caso, o sobreescribiendo el anterior en caso de que eistiera en
el segundo caso.
";*X5''L#SS" es la direccin a la que se en$a el mensaje, es decir, la direccin de
2#=D;+#.
"(S,X"#2,+H" es el tama3o del fichero que se $a a en$iar posteriormente. #ste
mensaje ser! el que incluya todos los datos necesarios para la modificacin del fichero de
intercambio.
"0;"#X25(#" es el nombre del fichero que se $a a modificar.
Una $ez en$iado este mensaje inicial de solicitud de modificacin del fichero de
intercambio se espera el 51? o mensaje de asentimiento. #ste mensaje se caracteriza
porque simplemente se trata de una cadena de teto con el mensaje "*L=1##'" en caso
de que se permita proceder con la modificacin. #n caso de recibir cualquier otra cosa, se
aborta la operacin.
Una $ez recibido el asentimiento positi$o se procede al en$o del fichero, que el ser$idor
recoger! en el lado destino, creando un fichero similar en el sitio adecuado.
#isten distintos casos:
"1=*HXL#)U#S+": solicitud de copia de ficheros remota.
"(='XL#)U#S+": solicitud de modificacin remota de ficheros.
"5>=L+": solicitud de abortar programa.
"os en$os se realizan al puerto QCAUE de Ser$igar, que es donde se encuentra
73
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
escuchando la aplicacin ser$idor.
#.2.3.# APLICACIN S ERVIDOR.
#sta aplicacin se encuentra programada en Fisual 1R. Su funcin principal es la
recepcin del fichero que contiene la actualizacin de los par!metros del bloque de control
remoto, modificados por el usuario remoto a tra$-s de la interfaz /eb. #ste fichero es
en$iado por la interfaz /eb en Ser$igar, y tiene etensin 8.log9 %fichero de teto plano que
contiene los $alores actualizados de los par!metros&.
"a aplicacin ser$idor es una aplicacin multihilo, pues implementa en un hilo un ser$idor
sncrono que se bloquea a la escucha de nue$as peticiones por un determinado puerto, y
por otro lado, un hilo que implementa el control de la aplicacin y permite en cualquier
momento salir de la misma.
"a primera operacin que se realiza es la ejecucin del hilo de control de la aplicacin,
denominado "hiloXlector", por leer de forma promiscua la entrada de datos a tra$-s del
teclado.
#n segundo lugar se inicia el ser$idor en s, enlaz!ndolo con el punto local
correspondiente a 2eoite %6BN.6T.6.NQ6&, y poni-ndolo a escuchar de forma promiscua en
un puerto %QN777& dentro de un bucle de control. #n este bucle, lo primero que se hace es,
como ya se ha dicho, poner el ser$idor a escuchar en el puerto especfico, y posteriormente,
cuando se recibe una conein entrante, comienza el procesamiento de la peticin.
#n primer lugar se realiza un filtrado de las ;*s, pues no se permite la conein de
cualquier equipo. Si se trata de una direccin ;* $!lida y admitida, entonces se recibe el
mensaje y se procesa la solicitud. #isten distintos casos:
"1=*HXL#)U#S+": solicitud de copia de ficheros remota.
"(='XL#)U#S+": solicitud de modificacin remota de ficheros.
"5>=L+": solicitud de abortar programa.
+odo esto se resume en el flujo de programa de la ilustracin 6E:
74
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
#l hilo lector de teclado es m!s simple en su concepcin y funcionamiento. Simplemente
lee la entrada del teclado a la espera de recibir la cadena "exit", momento en el cual
procede a en$iarse a s mismo un mensaje "ABORT" para salir del bucle de escucha
promiscua de mensajes entrantes.
+odo el cdigo se encuentra embebido en estructuras tryMcatch para capturar todas las
ecepciones posibles, con la finalidad de hacer seguro el cdigo.
#.2.# UBICACIN Y PUESTA A PUNTO DE LOS PROGRAMAS .
"a ubicacin de cada uno de los programas es importante. Si no se tiene cuidado al
colocar los ejecutables se obtendr!n errores adicionales. 5 continuacin se especifica la
puesta a punto de cada uno de ellos:
5plicacin de con$ersin de formato gr!fico "convert.exe": debe encontrarse en el
mismo directorio que la aplicacin de (atlab "sendtoservigar.m".
5plicacin de (atlab: esta aplicacin es un fichero con nombre
"sendtoservigar.m". 'ebe situarse en el directorio de trabajo donde se encuentre el
fichero de modelo de Simulin@ que contiene el controlador a implementar el control
75
Ilustracin 1!: Flujo del pro/rama multiilo ser1idor de 3eo4ite
"ort 7istenin*
I" (ilter
"rocess )ecei,ed -essa*e
!2"8 )0$9 -2: )0$9 .;2)4
)ead <e/+oard Inut
0=it
03I4
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
remoto. "a ejecucin es muy simple. >asta con escribir "sendtoservigar" en la lnea
de comandos de (atlab %con cuidado de estar situados en el mismo directorio en
que se encuentra "sendtoservigar.m"&, y la secuencia a seguir una $ez in$ocado el
script es la siguiente:
;nsercin del nombre del fichero de modelo de Simulin@ %con o sin etensin
".mdl"&.
#sperar a la finalizacin del programa.
'urante el transcurso de la ejecucin, la aplicacin ir! mostrando por pantalla los
distintos a$ances que ir!n sucediendo, como son la deteccin del fichero de
modelado, la obtencin de su representacin, la con$ersin del formato gr!fico o el
en$o sucesi$o de los ficheros al ser$idor sito en Ser$igar.
;nterfaz /eb en Ser$igar: es la p!gina /eb que contiene la interfaz de
modificacin remota de los par!metros. #l resultado de la compilacin de esta p!gina
ha de ubicarse en el directorio /eb en el que se proporcione el ser$icio de hosting
de p!ginas %depende del ser$idor /eb instalado, por ejemplo, 5pache Ser$er o
;nternet ;nformation Ser$er, y de su configuracin&. #n este punto hay que tener en
cuenta que la interfaz /eb se dise3 para su interfuncionamiento con el sitio /eb de
la *lanta Solar encuadrada en el proyecto europeo Hycon. #ste hecho indica que el
sistema de $alidacin es el que usaba dicho sitio /eb. Si se desea utilizar en otro
!mbito, ser! necesario modificar la programacin de dicha interfaz para adecuarla a
las nue$as condiciones de trabajo.
5plicacin ser$idor en Ser$igar "cp_server_servigar.exe": debe ubicarse en la
misma carpeta que la p!gina "tunning.aspx", que es la que implementa la interfaz
/eb para cambiar remotamente los par!metros. #l funcionamiento de este ser$idor
es sencillo: una $ez ejecutado, mostrar! por pantalla un mensaje indicando que si se
escribe la palabra "exit" se detendr! la ejecucin del mismo, dando a entender que
se ejecutar! de forma indefinida si el usuario no escribe la orden correspondiente. #l
ser$idor se quedar! a la escucha de peticiones en el puerto designado y cuando
reciba alguna lo mostrar! por pantalla.
5plicacin cliente en 2eoite "cp_client_neoxite.exe": esta aplicacin debe
ubicarse en la misma carpeta que el script de (atlab "sendtoservigar.exe", ya que
-ste lo utiliza para el en$o de ficheros al ser$idor ubicado en Ser$igar. #n teora el
usuario no necesita saber de la ejecucin de este cliente, puesto que lo in$oca la
76
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
misma aplicacin "sendtoservigar.m".
5plicacin ser$idor en 2eoite "cp_server_neoxite.exe": debe ubicarse en el
mismo directorio en que se est- ejecutando el fichero del modelo de Simulin@, puesto
que en dicho directorio se crear! el fichero 8.log9 que se utilizar! para alterar los
$alores de los par!metros. #l funcionamiento de este ser$idor es, al igual que el
situado en Ser$igar, bastante sencillo: una $ez ejecutado, mostrar! por pantalla un
mensaje indicando que si se escribe la palabra "exit" se detendr! la ejecucin del
mismo, dando a entender que se ejecutar! de forma indefinida si el usuario no
escribe la orden correspondiente. #l ser$idor se quedar! a la escucha de peticiones
en el puerto designado y cuando reciba alguna lo mostrar! por pantalla.
#.2.$ EEMPLO COMPLETO DE CONTROL REMOTO.
5 continuacin se mostrar! un ejemplo completo que ilustrar! el funcionamiento de la
utilidad de control remoto.
6\& Se situar!n los siguientes ficheros en el directorio 8%MATLAB_PATH%/work/9 en el
ordenador 2eoite:
con'ert.exe
cp!client!neoxite.exe
cp!ser'er!neoxite.exe
tunning.c
tunning.txt
params.mdl
sendtoser'igar.m
#l fichero tunning.tt es un fichero de teto que contiene una lista de asignacin de
$alores a las $ariables cuyos $alores se podr! cambiar, con las asignaciones separadas por
retornos de carro. Un ejemplo del contenido podra ser:
'ar1%1
'ar2%2
'ar3%3
Se situar!n los siguientes ficheros en el directorio 8/Files/Simulink/9 del sitio /eb de la
planta solar en Ser$igar:
cp!ser'er!ser'igar.exe
N\& "o siguiente a realizar es la compilacin del bloque de modificacin remota de
par!metros. 'esde la lnea de comandos de (atlab se escribir!:
77
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
mex tunning.c
5 continuacin se configurar! el fichero de modelo de Simulin@ tal y como se describe en
el punto Q.N.Q.6. Una $ez hecho esto, ya nos encontramos en condiciones de generar el
ejecutable. *ara hacer esto, presionamos sobre el botn 8Build All9 de la $entana de
Simulin@. Una $ez terminada la compilacin se habr! generado una carpeta
8params_grt_rtw9 que contendr! todo el cdigo fuente del ejecutable generado, mientras que
el ejecutable se encontrar! en la misma carpeta que el modelo de Simulin@.
78
Ilustracin 1#: Compilado de la funcin S 5tunnin/6c5 en 2atlab
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
Q\& 5ntes de proceder a la ejecucin del modelo, se han de 8arrancar9 los distintos
ser$idores que deben quedarse a la espera de peticiones en los puertos. *or tanto, en este
paso se ejecutan los ejecutables 8cp_server_neoxite.exe9 y 8cp_server_servigar.exe9 en
79
Ilustracin 1$: 2odelo de ejemplo de Simulin7
Ilustracin 1': Compilacin del model de ejemplo de Simulin7 para su uso con 89: ; el modo e4terno
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
2eoite y Ser$igar respecti$amente.
E\& #l operario encargado de ejecutar el controlador pondr! en marcha el sistema,
in$ocando "sendtoservigar.m" desde la lnea de comandos de (atlab. #sta aplicacin se
comunicar! con el ser$idor sito en Ser$igar y lle$ar! a cabo la puesta a punto del sistema.
Una $ez configurado el sistema, el operario ejecutar! el controlador del usuario, no sin antes
haber arrancado el ejecutable ser$idor del modo eterno generado en el paso N. *ara ello, el
operario abrir! una $entana de comandos de <indo/s %una consola&, se desplazar! al
directorio donde se encuentra dicho ejecutable para el modo eterno y una $ez ubicado en
dicha carpeta ejecutar! el siguiente comando:
params -t in -#
"a opcin 8-tf9 establece el tiempo final de la ejecucin en tiempo real. 1on 8inf9 se
indica que se desea que el tiempo de ejecucin sea infinito. "a opcin 8-w9 se utiliza para
esperar el mensaje de bien$enida del host, esto es, que no se empieza a ejecutar hasta que
un cliente se conecta con el fichero del modo eterno.
80
Ilustracin 1(: Ser1idor corriendo en Ser1i/ar
Ilustracin 1*: Ser1idor corriendo en 3eo4ite
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
"o siguiente ser!, como ya se dijo anteriormente, ejecutar el controlador del usuario.
*ara ello, se abre el modelo del controlador en Simulin@, se escoge el modo eterno en la
lista desplegable superior y se presiona sobre el botn que hay justamente a la izquierda de
la lista, que muestra como ayuda emergente al posar el ratn sobre -l 8Connect to target9.
#sto conectar! el modelo con el ejecutable que se ha arrancado antes. Una $ez conectado,
ya solamente resta pulsar en el botn 8Start real-time code9, situado a la izquierda del
anterior.
81
Ilustracin 2-: .jecucin del modelo compilado de Simulin7
Ilustracin 21: .jecucin del modelo de Simulin7 en modo
e4terno aciendo uso de 89:
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
82
Ilustracin 22: .s<uema del en1,o de ficeros de 3eo4ite a Ser1i/ar mediante
el script de 2atlab
S0)VI1.)
'023I40
Ser,er
!lient
555
Ilustracin 23: .jecucin del script de 2atlab
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
#l usuario cuyo controlador se encuentra en funcionamiento, debido a que en la
super$isin de los resultados obser$a que -stos no son los deseados, desea modificar
determinados aspectos de su controlador, y para ello accede a la interfaz /eb desde un
punto remoto a tra$-s de internet:
83
Ilustracin 2!: 8ecepcin de los ficeros en1iados por 2atlab en el
ser1idor de Ser1i/ar
Ilustracin 2#: &cceso del usuario remoto a la interfaz 0eb de Ser1i/ar
S0)VI1.)
5e+
"a*e
555
)0-240 "!
Ilustracin 2$: Captura de la interfaz 0eb
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
'espu-s de $alidarse con$enientemente, el usuario tendr! acceso a la interfaz /eb y
$er! los $alores actuales de los par!metros de su controlador y modificar! aquellos que no
le plazcan. #n este momento, tras pulsar el botn de actualizar dichos $alores, la interfaz
/eb se comunicar! con el ser$idor sito en 2eoite para modificar el fichero de intercambio
de datos, de forma que el bloque de modificacin de par!metros pueda actualizar los
nue$os $alores.
84
Ilustracin 2': .s<uema del en1,o de datos de la interfaz 0eb al ser1idor de 3eo4ite
S0)VI1.)
'023I40
5e+
"a*e
Ser,er
555
)0-240 "!
Ilustracin 2(: 8ecepcin de los par=metros modificados en el ser1idor de
3eo4ite
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
85
Ilustracin 2*: Captura del 1alor del par=metro
despu>s del cambio
Ilustracin 3-: Captura del 1alor del par=metro antes
del cambio
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$ RESULTADOS E(PERIMENTALES .
$.1 S ISTEMA DE ACTUALI!ACIN DE BASES DE DATOS
1omo batera de pruebas del sistema se utilizaron ficheros de teto con publicaciones
contenidas en la base de datos del S;15.
#n estos ficheros, los campos se encontraban separados mediante tabuladores, mientras
que las entradas a a3adir en la base de datos se encontraban separadas mediante retornos
de carro.
1ada uno de los ficheros se encargaba de actualizar una tabla distinta de la base de
datos, que para las pruebas fue la base de datos 8group/eb9, emplazada en el ser$idor
2yquist de los laboratorios de la Uni$ersidad de Se$illa, y que albergaba el sitio /eb del
grupo de control predicti$o.
;nicialmente se realizaron pruebas de insercin manual de los datos contenidos en los
ficheros, y posteriormente se procedi a la actualizacin de la base de datos mediante el
sistema dise3ado en el presente proyecto.
"os tiempos de actualizacin se muestran en la siguiente tabla comparati$a:
Nombre del
fichero
Nmero de
enr!d!"
Tiem#o em#le!do
en in"erci$n
m!n%!l de d!o"
Tiem#o em#le!do
en in"erci$n
!%om&ic! de d!o"
Tiem#o em#le!do
#or el "i"em! en el
!n&l"i" de d!o"
journals.tt BU Qh6Um 7hQ6m 7h6Um
congress.tt N66 BhQNm 6hN7m 7hENm
phds.tt 67 7hNQm 7h7Um 7h7Nm
boo@s.tt C 7h6Am 7h7Qm 7h76m
actas.tt NT 6h7Qm 7h7Bm 7h7Em
+=+5": QQ6 6NhQ6m Nh7Tm 6h7Em
+odos los eperimentos se lle$aron a cabo en condiciones ptimas, esto es, tomando
como conocida la eistencia y localizacin de los documentos pdf complementarios a las
entradas eistentes en los ficheros de teto, as como usando un operario con amplia
86
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
destreza en el uso de ordenadores con una $elocidad de mecanografiado de E77 ppm.
#n la siguiente tabla se muestran las estadsticas resultantes de la comparacin de
ambos m-todos:
Nombre de
fichero
Red%cci$n
de iem#o
Tiem#o efeci'o
de r!b!(o
Tiem#o medio #or
enr!d! m!n%!l
Tiem#o medio #or
enr!d! !%om&ic!
journals.tt AE.6 W U6.T W N.T7m 7.E6m
congress.tt AN.Q W EB.U W N.6Em 7.QAm
phds.tt BA.Q W T7.7 W N.Q7m 7.U7m
boo@s.tt AQ.Q W TT.T W N.77m 7.QQm
actas.tt AA.C W EN.C W N.ENm 7.NBm
+=+5": AQ.N W EC.N W N.NBm 7.QAm
1omo demuestran los resultados, el trabajo se reduce en casi la mitad, y el tiempo que
se tarda en actualizar el sistema disminuye alrededor de un A7 W, por lo que se deduce que
el sistema funciona produciendo los resultados esperados.
$.2 CONTROL REMOTO DE UNA PLANTA A TRAVS DE UNA INTERFA! "EB USANDO
MATLAB .
"as pruebas lle$adas a cabo con la funcin S programada dieron los resultados
esperados. 2o obstante, si el tiempo de muestreo del sistema es muy bajo, esto implicar!
que se realizar!n muchos accesos al disco duro para la lectura del fichero de teto que
almacena los $alores de las $ariables. *or tanto, se recomienda programar una peque3a
porcin de cdigo para que la lectura del fichero slo se lle$e a cabo cada ciertos m4ltiplos
del tiempo de muestreo o mediante cualquier otro criterio del usuario.
Si no se tiene acceso al tiempo de muestreo, siempre es posible definir una $ariable
global de $alor incremental conforme a$anza la ejecucin del modelo. 1uando -sta adquiera
un determinado $alor, se reiniciara y -ste sera el e$ento mediante el cual se lle$ara a cabo
la lectura del fichero de teto con los $alores.
#n lo que respecta a las pruebas, como caba esperar, se modificaron los $alores de las
salidas del bloque, aunque el sistema en determinadas ocasiones se ralentizaba, sobretodo
cuando el tiempo de muestreo era bajo.
87
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
& CONCORDANCIA ENTRE
RESULTADOS Y OBETIVOS .
&.1 S ISTEMA DE ACTUALI!ACIN DE BASES DE DATOS .
1omo se desprende del apartado anterior, los resultados obtenidos con el sistema son
bastante buenos. Se consigue reducir dr!sticamente el tiempo de actualizacin de un
sistema en torno al A7 W.
*or otra parte, tambi-n se ali$ia el trabajo realizado por el usuario encargado de la
actualizacin, pues -ste realiza hasta un U7 W menos de trabajo empleando el sistema
dise3ado que si lo actualizase directamente.
#n consecuencia, los objeti$os son satisfechos completamente, puesto que permiten que
con un mnimo esfuerzo y una mnima dedicacin de tiempo se lle$e a cabo la actualizacin
eitosa de la base de datos.
&.2 CONTROL REMOTO DE PLANTA MEDIANTE MATLAB %TCP%IP.
"os resultados cumplen con los objeti$os en tanto que permiten la manipulacin de datos
en (atlab a tra$-s de una interfaz /eb. #l mayor problema reside en la correcta
8configuracin9 de las lecturas promiscuas del fichero de datos que almacena los $alores
que se han de cambiar, pues puede llegar colapsar el sistema o actualizar con demasiada
lentitud el mismo.
2o obstante, los objeti$os fijados se cumplen.
88
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
, CONCLUSIONES .
,.1 ACTUALI!ACIN AUTOMTICA DE BASE DE DATOS .
#l sistema cumple de forma esperada todos los objeti$os establecidos al comienzo del
mismo. 2o obstante, aqu se podran remarcar las $entajas e incon$enientes del sistema,
deri$adas de la eperimentacin con el mismo.
Fentajas:
"a actualizacin se realiza de forma satisfactoria.
2o se producen duplicidades de entradas en la base de datos debido a una
comprobacin anterior.
5unque la copia de ficheros en el ser$idor no es inmediata, para no dar al usuario
la impresin de cuelgue del sistema se ha creado una barra de progreso que
muestra al usuario la progresin de la copia del fichero actual y la progresin total de
la copia de ficheros. 5unque esto no resuel$e el problema de la lentitud de la subida
s sir$e para e$itar que el usuario tenga una falsa impresin de incomplecin de la
actualizacin y -ste intente actualizar la p!gina de actualizacin, lo que s podra
resultar en resultados incoherentes o duplicidades.
;gualmente, el an!lisis de los ficheros de las publicaciones no es inmediato, y se
muestra una lnea de informacin que indica la lnea que se est! analizando en el
momento con la finalidad de que el usuario $ea que el sistema est! funcionando y no
est! colgado.
Se ofrece al usuario la posibilidad de corregir los posibles errores eistentes antes
de proceder con la actualizacin, e incluso la posibilidad de complementar los
campos no disponibles en los ficheros de actualizacin.
'es$entajas:
#l an!lisis de coincidencia de los nombres de las publicaciones y los nombres de
los documentos a subir al ser$idor disponibles en los hiperenlaces es demasiado
lento, y esta lentitud crece conforme m!s aumente la diferencia de longitudes de las
cadenas a comparar. #s por esto que se ha limitado esta diferencia a un m!imo de
U caracteres, para no ralentizar en eceso el sistema.
89
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
"a copia de ficheros en el ser$idor no es inmediata, y depende de la calidad de la
conein de que se disponga para realizar la actualizacin.
"a lentitud del sistema aumenta con el $olumen de datos a actualizar, pero esto
es una consecuencia ine$itable.
,.2 CONTROL REMOTO DE S ISTEMAS MEDIANTE MATLAB %SIMULIN-.
#l sistema de control remoto funciona correctamente y de la forma esperada. 5l igual que
en el apartado anterior, se sopesar!n aqu sus $entajas e incon$enientes:
Fentajas:
*osibilidad de cambiar par!metros en un modelo de Simulin@ $a internet en
cualquier momento y desde cualquier lugar.
;nterfaz /eb simple y f!cil de usar.
'es$entajas:
Sistema complejo de ser$idores y clientes. Sera m!s eficaz poder implementar
mecanismos tcp.ip dentro del bloque de la funcin S de Simulin@, pues ahorrara un
ser$idor en 2eoite.
*ara modificar par!metros hay que programar los bloques manualmente
mediantes funciones en 1 e implementarlos a tra$-s de bloques de funciones S.
#l sistema parece quedarse colgado en la simulacin a $eces, pero no se cuelga
realmente.
#l transporte de la informacin depende de un protocolo de internet, con todas las
des$entajas que esto conlle$a: posibilidad de ataques, p-rdida de los mensajes de
informacin.
90
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
. FUTURAS MEORAS )LNEAS DE
INVESTIGACIN+.
#n la parte de la actualizacin autom!tica de bases de datos:
;mplementar un sistema inteligente de an!lisis de datos en p!ginas /eb para
complementar la informacin con teto disponible en la misma, basando el an!lisis
en etiquetas html o palabras cla$es.
#liminar la interaccin del usuario con el sistema de actualizacin en la correccin
de errores tipogr!ficos implementando un diccionario propio y un sistema de
correccin.
#n el caso de la subida de ficheros, analizar el contenido de los ficheros a subir
para asegurar al 677W la efecti$idad de la eleccin del fichero correcto.
Hacer que el sistema cumpla con las eigencias de la <Q1.
;mplementar un sistema de $alidacin de usuario que utilice SSH %Secure SHell&,
con la finalidad de mejorar la seguridad del sistema mediante t-cnicas de cifrado.
#n la parte de control remoto:
Situar los campos de teto justo en las salidas del bloque de la funcin S, para
que sea toda$a m!s directa la asociacin entre los campos de teto y las salidas del
bloque.
5utomatizar toda$a m!s la aplicacin de (atlab que genera los ficheros de
imagen y en$a los ficheros a Ser$igar, para que compile directamente el modelo de
Simulin@ %en caso de que se $aya a usar el modo eterno&, lo ponga a ejecutar y se
quede a la espera de rdenes.
;ntentar implementar el en$o.recepcin de mensajes por tcp.ip en el mismo
Simulin@ %es bastante difcil, porque al intentar implementarlo Simulin@ se cuelga,
pero es posible definir un protocolo de en$o para el modo eterno compilando
libreras propias para las capas 6 y N del modelo =S;&.
91
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
;ntentar la modificacin de par!metros en el <or@space en tiempo real %difcil
porque las funciones creadas por (ath<or@s con esta finalidad implementan el
fichero de cabecera "me.h", mientras que si la aplicacin se ha de controlar en
tiempo real requiere de Leal +ime <or@shop, y las libreras de este toolbo son
incompatibles con "me.h".
;mplementar un sistema de $alidacin de usuario que utilice SSH %Secure SHell&,
con la finalidad de mejorar la seguridad del sistema mediante t-cnicas de cifrado.
Lobustecer el protocolo dise3ado con cdigos 1L1 de 6T Q6 bits para
$erificacin de las transmisiones, a fin de desechar mensajes errneos que puedan
llegar al ser$idor o al cliente.
;mplementar un sistema final de comprobacin de que realmente se han
modificado los datos.
92
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
/ BIBLIOGRAFA .
#n la parte de control remoto se han utilizado los documentos publicados por +he
(ath<or@s, empresa responsable de la creacin del programa (atlab y la ingente ayuda del
paquete de programacin (icrosoft Fisual .2#+.
#n la parte relati$a al sistema de actualizacin de bases de datos, la documentacin
utilizada fue:
1=2F#LS#, +;(I *5L?, P=H1#I (=L,52, 1"5L?. PHP5 and MS!" Bible. Wiley
Publishing Inc., 2004. ;S>2: 7MBTEUMUBETMB.
'U>=;S, *5U". MS!" The definiti#e guide to using$ progra%%ing$ and
ad%inistering MS!" &'( and 5') *
rd
+dition. Sams, March 08, 200. ;S>2: 7MTBNMQNTBQM
T.
,=UL"#H, '5F;'I +=++H, >L;52I S5H#L, (5LP=L;#I L#''H, S5;"UI 5,,5L<5",
52SHU. HTTP: The ,efiniti#e -uide. !"#eilly, September 2002. ;S>2: 6MUTUCNMU7CMN.
,L##2S*52, P5HI >U",#L, >L5'. MS!".PHP ,atabase Applications. M$%
&oo's, 200(. ;S>2: 7MBTEUMQUQBME.
HU2,#L, S+#F#. ,ebian -/0."inu1 Bible. )ungry Minds Inc., 200(. ;S>2: 7MBTEUM
EB67M7.
"5UL;, >#2I "5UL;, *#+#L. Apache The ,efiniti#e -uide$ *
rd
+dition. !"#eilly,
*ecember 2002. ;S>2: 7MUCTM77N7QMQ.
2#,US, 1HL;S+=*H#L. "inu1 Bible 2))5 +dition. Wiley Publishing Inc., 200. ;S>2:
7MBTEUMBCECMU.
<=2,, 1";2+=2. HTTP Pocket 3eference$ (
st
+dition. !"#eilly, May 2000. ;S>2: 6M
UTUCNMATNMA.
+ambi-n se emple el sitio /eb de la <orld <ide <eb 1onsortium Schools, que legisla
todo lo referente a la /eb %H+(", DH+(", etc& para documentacin:
http:.. ///./Qschools.com.
93
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
10 ANE(OS
10.1 CONTENIDOS DEL CD*ROM.
#l contenido del cdMrom adjunto se desglosa a continuacin:
0inal: contiene los ejecutables principales %$ersiones finales compiladas& que se
han de emplear para poner en funcionamiento el sistema.
1ontrol.Lemoto: contiene los ejecutables correspondientes a la parte de
control remoto del proyecto.
S)".Update: contiene los ficheros finales del sistema de actualizacin de
bases de datos.
5rtculos.2yquist: contiene una copia de la /eb empleada para tomar los
ficheros pdf del grupo de control predicti$o.
0inal.Site: contiene una copia del directorio completo de la p!gina.
2e/.0iles: nue$os ficheros creados para la actualizacin.
=ld.(odified.0iles: antiguos ficheros del sitio /eb que han sido
actualizados.
Sources: contiene el cdigo fuente de los programas desarrollados.
1ontrol.Lemoto: contiene el cdigo fuente de los programas desarrollados
para la aplicacin de control remoto.
5plicacion.(atlab: cdigo del programa 8sendtoservigar.m9.
1liente.2eoite: cdigo fuente del cliente ubicado en 2eoite empleado por
8sendtoservigar.m9 para el en$o remoto de ficheros.
;mage.(agic@: programa de soft/are libre que contiene di$ersas utilidades
para el tratamiento de im!genes.
;nterfaz.<eb: cdigo fuente de la interfaz /eb utilizada para el cambio de
los $alores de los par!metros. +ambi-n se incluye en un fichero comprimido
el proyecto del sitio /eb desarrollado para la red de ecelencia Hycon con
moti$o de los eperimentos sobre la planta solar de los laboratorios de la
Uni$ersidad de Se$illa.
94
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
Ser$idor.2eoite: cdigo fuente del ser$idor ubicado en 2eoite, empleado
para la recepcin de los nue$os $alores de los par!metros modificados.
Ser$idor.Ser$igar: cdigo fuente del ser$idor ubicado en Ser$igar,
empleado para la recepcin de los ficheros de imagen y de modelo de
Simulin@ en$iados por el cliente de 2eoite in$ocado por 8sendtoservigar.m9.
>loque.SM0unction: cdigo fuente del bloque de modificacin remota de
par!metros.
#jemplo.1ontrolador: controlador empleado en el ejemplo incluido en esta
memoria para el sistema de control remoto mediante (atlab y la interfaz /eb.
S)".Update: cdigo fuente del sistema de actualizacin de bases de datos.
=riginal.Site: copia de la p!gina /eb del grupo de control predicti$o.
5rticulos.2yquist: ficheros originales del sitio /eb utilizado para obtener los
documentos 8.pdf9 para actualizar la base de datos.
*rogramas: contiene algunos los programas necesarios para el proyecto %que no
necesiten de licencia o sean soft/are libre&. #n la mayora de las carpetas se
incluyen ficheros de ayuda para aprender a manejarlos:
1ontrol Lemoto: programas utilizados en el sistema de control remoto.
;mageM(agic@: paquete de soft/are libre con herramientas y utilidades
relacionadas con los formatos gr!ficos. Se utiliza para la con$ersin de
formatos.
S)".Update: programas utilizados para la actualizacin de las bases de datos.
5pache.Ser$er: ser$idor de p!ginas /eb 5pache.
1ompresores: algunos compresores para "inu.
"ectores.#tN: permiten leer particiones de "inu desde sistemas
<indo/s.
(yS)": ser$idor de bases de datos S)".
(yS)" 5dministrator: gestor para mantenimiento de bases de datos
(yS)".
(yS)" 1ontrol 1enter. ,estor para mantenimiento de bases de datos
(yS)".
95
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
*H*: lenguaje de programacin de p!ginas /eb.
*'0.1ollection: coleccin de documentos 8.pdf9 necesarios para la actualizacin
de la base de datos del sitio /eb del grupo de control predicti$o.
'ocs: ficheros de documentacin empleados para el proyecto.
1ontrol.Lemoto: ficheros de documentacin de la parte relati$a al control
remoto $a /eb de procesos.
S)".Update: ficheros de documentacin de la parte relati$a a la actualizacin
de bases de datos.
10.2 MANUAL DE USO1 S ISTEMA DE ACTUALI!ACIN DE BASES DE DATOS .
10.2.1 INSTALACIN .
"os archi$os situados en el directorio 8Final/SQL.Update/Final.Site9 constituyen la
nue$a $ersin del sitio /eb del grupo de control predicti$o. >asta con sobreescribir la
carpeta que contiene el antiguo sitio mediante una transferencia ftp.telnet o similar.
Si se desea copiar 4nicamente los ficheros correspondientes al sistema, entonces
simplemente se han de copiar en el directorio del sitio /eb del grupo de control predicti$o los
ficheros de la carpeta 8Final/SQL.Update/New.Files9.
#l directorio en que se encuentra el antiguo sitio /eb del grupo de control predicti$o es
8/var/www/groupweb/9, en el ser$idor 2yquist.
10.2.2 USANDO EL S ISTEMA DE ACTUALI!ACIN DE BASES DE DATOS .
"a interfaz del sistema de actualizacin es bastante intuiti$a. *ara acceder al sistema
simplemente se ha de escribir la ruta en el na$egador, empleando como fichero
8update.html9. *or ejemplo, si el root del ser$idor /eb es 8/var/www/9, y el sitio /eb est! en
la carpeta 8/var/www/groupweb/9, y se ha realizado la instalacin indicada en el punto 67.N.6,
entonces se debera escribir la ruta 8http://nyquist.us.es/groupweb/update.html9.
#n pantalla se mostrar!n cuatro opciones:
5ctualizar base de datos.
96
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
#ditar fichero de definicin de publicaciones.
1rear copia de seguridad de la base de datos.
Lestaurar copia de seguridad de la base de datos.
#n todos y cada uno de los cuatro pasos el usuario ha de ingresar el nombre y la
contrase3a para poder $alidarse. #n caso de no hacerlo, no podr! acceder a ninguna de las
opciones presentadas.
10.2.2.1 ACTUALI!AR BASE DE DATOS .
#n el primer paso de la actualizacin el usuario ha de seleccionar los ficheros de teto
que contengan las entradas a a3adir a la base de datos, as como elegir la tabla de la base
de datos que actualizar! dicho fichero. "os nombres de las tablas guardan relacin directa
con el contenido de las mismas. 5s, una tabla que almacena publicaciones en re$istas se
llama 8journals9, una que almacena ponencias en congresos se llama 8congress9, etc.
5simismo, se permite a3adir direcciones /eb para buscar documentos en formato 8.pdf9
con la finalidad de complementar las entradas de los ficheros de teto. 1on esta misma
finalidad tambi-n se permite a3adir rutas de directorios.
#n el segundo paso el usuario debe indicar al sistema los campos de que constan las
entradas de los ficheros que indic en el paso anterior, as como los separadores que se
utilizan para distinguir campos y entradas %tabuladores, retornos de carro, etc&. (encin
especial tiene el campo 8authors9 o 8super$isors9, que representan a los autores o
super$isores de una publicacin. *ara ellos tambi-n es necesario indicar al sistema el tipo
de separadores usados. "os m!s comunes para este caso son 8I9 o 8,9.
5l final del documento se indica adem!s si las direcciones y directorios facilitados en el
paso anterior son lebles correctamente y se tiene acceso a ellos.
Hay que remarcar que los campos se han de indicar en el mismo orden con que
aparecen en los ficheros de teto, y de forma consecuti$a. 1aso aparte son los separadores,
que se muestran 4nicamente al final, ya que, al no eistir como tales campos, entonces no
tienen necesidad de ir a continuacin de los campos de los ficheros.
#n el tercer paso se procede al an!lisis de los datos facilitados. #l sistema mostrar! un
bre$e mensaje por pantalla conforme $aya analizando entradas. Una $ez finalice el an!lisis,
97
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
mostrar! sendos campos de edicin por cada entrada. #stos campos de edicin se
corresopnden con la totalidad de campos disponibles para una publicacin del tipo indicado,
mostrando el campo en blanco si no se inclua en los ficheros de teto iniciales.
#n caso de que el sistema haya encontrado ficheros que se estimen coincidentes para la
publicacin, los mostrar! en pantalla. Si se trata de $arios ficheros, entonces los desglosar!
en una lista con botones tipo 8radio9 para que el usuario seleccione el correcto. Si el usuario
no desea especificar fichero pdf alguno, entonces basta con que marque la casilla 82o
deseo especificar ning4n fichero .pdf9.
+ambi-n se muestran otras dos casillas de $erificacin que son ecluyentes: una la
marcar! el usuario cuando desee actualizar la base de datos con esa publicacin %85cti$e
esta casilla si la entrada ya est! completa9& y la otra la marcar! cuando no desea incluirla en
la base de datos %8#n caso de no querer a3adir esta entrada, acti$e esta casilla9&.
*or supuesto, se permite al usuario cambiar el documento pdf en caso de que ninguno
de los encontrados sea correcto o en el caso de que no se haya encontrado ninguno.
Una $ez el usuario haya realizado todas las modificaciones que desee, basta con que
pulse el botn 8Fol$er al paso Q9 para que el sistema proceda con las actualizaciones. #ste
paso se $ol$er! a mostrar tantas $eces como sea necesario hasta que no queden entradas
que actualizar.
2=+5 ;(*=L+52+#: se recomienda emplear ficheros de teto con no m!s de NU
entradas. 5unque se ha modificado el tiempo de carga de las p!ginas a Q7 minutos, los
datos generados por los formularios son ecesi$os y pueden generar un colapso del hilo
ser$idor que sir$e las p!ginas.
10.2.2.2 EDITAR FICHERO DE DEFINICIN DE PUBLICACIONES .
#sta opcin del sistema permite al usuario acceder al fichero de definicin de
publicaciones. #ste fichero es usado por el sistema para la generacin de referencias y para
la b4squeda de los documentos pdf.
1on esta opcin se presenta al usuario una caja de edicin de teto con el contenido de
dicho fichero, para que lo modifique a su con$eniencia.
#l fichero guarda un formato muy estricto. #isten dos zonas bien diferenciadas: la zona
98
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
de publicaciones de re$istas y la zona de ponencias en congresos. #l comienzo de cada una
de las zonas se encuentra indicado con 8::P=UL25"S9 y 8::1=2,L#SS9 respecti$amente.
#n cada zona, el usuario puede definir tantas publicaciones como desee.
1ada publicacin requiere de dos lneas. "a primera se utiliza para almacenar el nombre
completo de la publicacin. #sta lnea debe ir precedida de los caracteres de comentario 8..9.
en la segunda lnea el usuario debe introducir las siglas o el acrnimo de la publicacin,
seguido de 8I9 y un tabulador, y a continuacin debe escribir las palabras cla$es de la
publicacin separadas por tabuladores %las palabras cla$es son aquellas que se utilizar!n en
la b4squeda de documentos posteriormente y en la generacin de referencias&.
Una $ez que se hayan realizado las modificaciones deseadas, basta con pulsar el botn
85ctualizar fichero de definiciones9 y las modificaciones ser!n guardadas autom!ticamente.
10.2.2.3 CREAR COPIA DE S EGURIDAD DE LA BASE DE DATOS .
#sta opcin crea autom!ticamente una copia de seguridad de la base de datos. Se
mostrar! por pantalla un mensaje indicando la hora y la fecha en que se realiz la copia de
seguridad, as como el nombre del fichero que contiene la copia.
10.2.2.# RESTAURAR COPIA DE S EGURIDAD DE LA BASE DE DATOS .
5qu se presenta una tabla por pantalla que permite al usuario restaurar una copia de
seguridad creada pre$iamente, as como borrarla. *ara cada una de las copias de seguridad
se muestran la hora y la fecha de creacin, a fin de que el usuario proceda con la que m!s
con$enga.
"a opcin 85ctualizar directorio de pdfs9 hace que el sistema, al actualizar la base de
datos, borre todos los documentos pdf que no se correspondan con entradas eistentes en
la base de datos. #sto se incluye para pre$enir futuros errores en que se actualicen entradas
que no tengan ficheros pdf y al no haber borrado los de una copia anterior se muestre un
fichero errneo.
#n consecuencia, se recomienda restaurar una copia, y comprobar en el sitio /eb que se
ha restaurado la deseada. Si esto es as, entonces ya se puede proceder a restaurar esa
misma marcando la opcin de actualizacin del directorio de pdfs. 5dem!s, tambi-n es
recomendable borrar las copias de seguridad con fecha y hora posterior a la restaurada, con
99
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
el fin de pre$enir futuras complicaciones.
10.3 MANUAL DE USO1 S ISTEMA DE CONTROL REMOTO.
10.3.1 INSTALACIN .
"a ubicacin de cada uno de los programas es importante. Si no se tiene cuidado al
colocar los ejecutables se obtendr!n errores adicionales. 5 continuacin se especifica la
correcta ubicacin de cada uno de ellos %2=+5: todos los ficheros aqu especificados se
encuentran en el directorio 80inal9 del 1'MLom que acompa3a esta memoria&:
5plicacin de con$ersin de formato gr!fico "convert.exe": debe encontrarse en el
mismo directorio que la aplicacin de (atlab "sendtoservigar.m".
5plicacin de (atlab: esta aplicacin es un fichero con nombre
"sendtoservigar.m". 'ebe situarse en el directorio de trabajo donde se encuentre el
fichero de modelo de Simulin@ que contiene el controlador a implementar el control
remoto. "a ejecucin es muy simple. >asta con escribir "sendtoservigar" en la lnea
de comandos de (atlab %con cuidado de estar situados en el mismo directorio en
que se encuentra "sendtoservigar.m"&, y la secuencia a seguir una $ez in$ocado el
script es la siguiente:
;nsercin del nombre del fichero de modelo de Simulin@ %con o sin etensin
".mdl"&.
#sperar a la finalizacin del programa.
'urante el transcurso de la ejecucin, la aplicacin ir! mostrando por pantalla los
distintos a$ances que ir!n sucediendo, como son la deteccin del fichero de
modelado, la obtencin de su representacin, la con$ersin del formato gr!fico o el
en$o sucesi$o de los ficheros al ser$idor sito en Ser$igar.
;nterfaz /eb en Ser$igar: es la p!gina /eb que contiene la interfaz de
modificacin remota de los par!metros. #l resultado de la compilacin de esta p!gina
ha de ubicarse en el directorio /eb en el que se proporcione el ser$icio de hosting
de p!ginas %depende del ser$idor /eb instalado, por ejemplo, 5pache Ser$er o
;nternet ;nformation Ser$er, y de su configuracin&. #n este punto hay que tener en
cuenta que la interfaz /eb se dise3 para su interfuncionamiento con el sitio /eb de
100
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
la *lanta Solar encuadrada en el proyecto europeo Hycon. #ste hecho indica que el
sistema de $alidacin es el que usaba dicho sitio /eb. Si se desea utilizar en otro
!mbito, ser! necesario modificar la programacin de dicha interfaz para adecuarla a
las nue$as condiciones de trabajo.
5plicacin ser$idor en Ser$igar "cp_server_servigar.exe": debe ubicarse en la
misma carpeta que la p!gina "tunning.aspx", que es la que implementa la interfaz
/eb para cambiar remotamente los par!metros. #l funcionamiento de este ser$idor
es sencillo: una $ez ejecutado, mostrar! por pantalla un mensaje indicando que si se
escribe la palabra "exit" se detendr! la ejecucin del mismo, dando a entender que
se ejecutar! de forma indefinida si el usuario no escribe la orden correspondiente. #l
ser$idor se quedar! a la escucha de peticiones en el puerto designado y cuando
reciba alguna lo mostrar! por pantalla.
5plicacin cliente en 2eoite "cp_client_neoxite.exe": esta aplicacin debe
ubicarse en la misma carpeta que el script de (atlab "sendtoservigar.exe", ya que
-ste lo utiliza para el en$o de ficheros al ser$idor ubicado en Ser$igar. #n teora el
usuario no necesita saber de la ejecucin de este cliente, puesto que lo in$oca la
misma aplicacin "sendtoservigar.m".
5plicacin ser$idor en 2eoite "cp_server_neoxite.exe": debe ubicarse en el
mismo directorio en que se est- ejecutando el fichero del modelo de Simulin@, puesto
que en dicho directorio se crear! el fichero 8.log9 que se utilizar! para alterar los
$alores de los par!metros. #l funcionamiento de este ser$idor es, al igual que el
situado en Ser$igar, bastante sencillo: una $ez ejecutado, mostrar! por pantalla un
mensaje indicando que si se escribe la palabra "exit" se detendr! la ejecucin del
mismo, dando a entender que se ejecutar! de forma indefinida si el usuario no
escribe la orden correspondiente. #l ser$idor se quedar! a la escucha de peticiones
en el puerto designado y cuando reciba alguna lo mostrar! por pantalla.
10.3.2 USANDO EL CONTROL REMOTO.
6\& Se situar!n los siguientes ficheros en el directorio 8%MATLAB_PATH%/work/9 en el
ordenador que implementar! el controlador:
101
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
con'ert.exe
cp!client!neoxite.exe
cp!ser'er!neoxite.exe
tunning.c
tunning.txt
params.mdl
sendtoser'igar.m
#l fichero tunning.tt es un fichero de teto que contiene una lista de asignacin de
$alores a las $ariables cuyos $alores se podr! cambiar, con las asignaciones separadas por
retornos de carro.
Se situar!n los siguientes ficheros en el directorio 8./Files/Simulink/9 de la interfaz /eb
dise3ada %en la ruta relati$a al directorio en el que se encuentra el fichero de la interfaz& en
el ordenador que implementar! la interfaz /eb:
cp!ser'er!ser'igar.exe
N\& "o siguiente a realizar es la compilacin del bloque de modificacin remota de
par!metros. 'esde la lnea de comandos de (atlab se escribir!:
mex tunning.c
5 continuacin se configurar! el fichero de modelo de Simulin@ tal y como se describe en
el punto Q.N.Q.6. Una $ez hecho esto, ya nos encontramos en condiciones de generar el
ejecutable. *ara hacer esto, presionamos sobre el botn 8Build All9 de la $entana de
Simulin@. Una $ez terminada la compilacin se habr! generado una carpeta
8params_grt_rtw9 que contendr! todo el cdigo fuente del ejecutable generado, mientras que
el ejecutable se encontrar! en la misma carpeta que el modelo de Simulin@.
Q\& 5ntes de proceder a la ejecucin del modelo, se han de 8arrancar9 los distintos
ser$idores que deben quedarse a la espera de peticiones en los puertos. *or tanto, en este
paso se ejecutan los ejecutables 8cp_server_neoxite.exe9 y 8cp_server_servigar.exe9 en los
ordenadores que implementan el control con (atlab %en adelante, 8ser$idor matlab9& y la
interfaz /eb %en adelante, 8ser$idor /eb9& respecti$amente.
E\& #l operario encargado de ejecutar el controlador pondr! en marcha el sistema,
in$ocando "sendtoservigar.m" desde la lnea de comandos de (atlab. #sta aplicacin se
comunicar! con el ser$idor /eb y lle$ar! a cabo la puesta a punto del sistema. Una $ez
configurado el sistema, el operario ejecutar! el controlador del usuario, no sin antes haber
arrancado el ejecutable ser$idor del modo eterno generado en el paso N. *ara ello, el
operario abrir! una $entana de comandos de <indo/s %una consola& en el ser$idor (atlab,
se desplazar! al directorio donde se encuentra dicho ejecutable para el modo eterno y una
$ez ubicado en dicha carpeta ejecutar! el siguiente comando:
102
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
params -t in -#
"a opcin 8-tf9 establece el tiempo final de la ejecucin en tiempo real. 1on 8inf9 se
indica que se desea que el tiempo de ejecucin sea infinito. "a opcin 8-w9 se utiliza para
esperar el mensaje de bien$enida del host, esto es, que no se empieza a ejecutar hasta que
un cliente se conecta con el fichero del modo eterno.
"o siguiente ser!, como ya se dijo anteriormente, ejecutar el controlador del usuario.
*ara ello, se abre el modelo del controlador en Simulin@, se escoge el modo eterno en la
lista desplegable superior y se presiona sobre el botn que hay justamente a la izquierda de
la lista, que muestra como ayuda emergente al posar el ratn sobre -l 8Connect to target9.
#sto conectar! el modelo con el ejecutable que se ha arrancado antes. Una $ez conectado,
ya solamente resta pulsar en el botn 8Start real-time code9, situado a la izquierda del
anterior.
#n caso de que el usuario desee modificar alg4n $alor en el bloque de modificacin de
par!metros, debe $alidarse en la interfaz /eb, tras lo cual tendr! acceso a la interfaz y $er!
los $alores actuales de los par!metros de su controlador, modifcando aquellos que no le
plazcan. #n este momento, tras pulsar el botn de actualizar dichos $alores, la interfaz /eb
se comunicar! con el ser$idor (atlab para modificar el fichero de intercambio de datos, de
forma que el bloque de modificacin de par!metros pueda actualizar los nue$os $alores.
10.# CDIGO FUENTE.
10.#.1 S ISTEMA DE ACTUALI!ACIN DE BASES DE DATOS .
10.#.1.1 UPDATE.HTML
<html>
<head>
<script type="text/javascript">
function assign()
{
document.getElementById("login").value =
document.getElementById("user").value;
document.getElementById("pass").value =
document.getElementById("password").value;
}
function assign_pubs()
{
document.getElementById("login_pubs").value =
103
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
document.getElementById("user").value;
document.getElementById("pass_pubs").value =
document.getElementById("password").value;
}
</script>
</head>
<body>
<table align=center>
<form name="validacion" action="paso1.php" method="post">
<tr>
<td colspan=2 align="center"> <img src="images/backup.jpg"> </td>
</tr>
<tr>
<td colspan=2> <br> </br> </td>
</tr>
<tr>
<td width="50%" align=right>Login:&nbsp&nbsp&nbsp&nbsp&nbsp</td>
<td width="50%"><input type="text" id="user" name="user"></td>
</tr>
<tr>
<td width="50%" align=right>Contrasea:&nbsp&nbsp&nbsp&nbsp&nbsp</td>
<td width="50%">
<input type="password" id="password" name="password">
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" id="update" name="update"
value="Actualizar base de datos">
</td>
</tr>
</form>
<form name="edit_pubs" action="pubs_editor.php" method="post">
<tr>
<td colspan=2 align="center">
<input type="submit" id="edit_pub_file" name="edit_pub_file"
value="Editar fichero de definicin de publicaciones"
onclick="assign_pubs();" />
<input type="hidden" id="login_pubs" name="login" value="" />
<input type="hidden" id="pass_pubs" name="pass" value="" />
</td>
</tr>
</form>
<form name="validacion" action="backup.php" method="post">
<tr>
<td colspan=2 align="center">
<input type="submit" id="create_backup" name="create_backup"
value="Crear copia de seguridad de la base de datos"
onclick="assign();" />
</td>
</tr>
<tr>
<td colspan=2 align="center">
<input type="submit" id="restore_backup" name="restore_backup"
value="Restaurar copia de seguridad de la base de datos"
onclick="assign();" />
<input type="hidden" id="login" name="login" value="" />
<input type="hidden" id="pass" name="pass" value="" />
</td>
</tr>
</form>
<tr>
<td colspan=2> <br> </br> </td>
</tr>
104
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
<tr>
<td colspan=2 align="center">
<img src="images/php_icon.png"> </img>
<img src="images/mysql_icon.gif"> </img>
<img src="images/apache_icon.gif" height="52"> </img>
</td>
</tr>
</table>
</body>
</html>
10.#.1.2 PASO 1.PHP
<?php
include "functions.inc.php";
$conexion_mysql =& conecta_db(); // Conexin con la base de datos
if (valida_usuario($_POST["user"], $_POST["password"])) {
// Inicio de sesin y envo de los datos del usuario para validar en los
// subsiguientes pasos
session_start();
$_SESSION["user"] = $_POST["user"];
$_SESSION["password"] = $_POST["password"];
// Mensaje de bienvenida
print "\t<h2>Actualizacin automtica de la Base de Datos</h2><br />" .
"Hola, usuario \"" . $_POST["user"] . "\".<br />" .
"Bienvenido al script de actualizacin automtica de la base de datos " .
"del sitio web del Grupo de Control Predictivo.<br /><br />\n\t<h3>" .
"Paso 1: Introduccin de los ficheros de actualizacin y seleccin " .
"de las bases de datos a actualizar:</h3><br />";
$tablas_db = lista_tablas();
info_campos($tablas_db, $tipo_campos_tablas, $nombre_campos_tablas);
// Impresin del formulario de alta de ficheros y seleccin de tablas en el
// navegador
echo "\t<form name='upload' id='upload' action='paso2.php' " .
"ENCTYPE='multipart/form-data' method='POST'>\n";
echo "\t\t<table border='0'>\n";
$max_campos = 0;
for ($i=0;$i<count($tablas_db);$i++)
if ($max_campos < count($nombre_campos_tablas[$i]))
$max_campos = count($nombre_campos_tablas[$i]);
// Se imprime una fila de la tabla por cada tabla existente en la base de
// datos.
echo "\t\t\t<tr>\n";
echo "\t\t\t\t<td width='620px' align=center>Seleccione aqu los ficheros " .
"que contengan las actualizaciones:</td>\n";
echo "\t\t\t\t<td width='100px'>Tabla a actualizar:</td>\n";
echo "\t\t\t</tr>\n";
for ($i=0;$i<count($tablas_db);$i++) {
// Nueva fila
echo "\t\t\t<tr>\n";
// 1 columna => Campo de texto para escribir el nombre del fichero con las
// actualizaciones.
echo "\t\t\t\t<td width='620px'>\n";
echo "\t\t\t\t\t<input type='file' id='fichero" . $i .
"' name='fichero" . $i . "' size=80 />\n";
echo "\t\t\t\t</td>\n";
// 2 columna => Lista desplegable para seleccionar la base de datos que se
// actualizar.
105
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
echo "\t\t\t\t<td>\n";
echo "\t\t\t\t\t<select name='tabla" . $i . "'>\n";
echo "\t\t\t\t\t\t<option value=''></option>\n";
for ($k=0;$k<count($tablas_db);$k++)
echo "\t\t\t\t\t\t<option value='" . $tablas_db[$k] . "'>"
. $tablas_db[$k] . "</option>\n";
echo "\t\t\t\t\t</select>\n";
echo "\t\t\t\t</td>\n";
// 3 columna => Lista desplegable para seleccionar el tipo de libro en caso
// de tener que modificarse la tabla "books".
echo "\t\t\t</tr>\n";
}
// Campo de texto para las urls
echo "\t\t\t<tr><td align=center colspan='" . $max_campos . "'><br>" .
"Inserte aqu las direcciones webs desde las que se pueden actualizar " .
"los campos:<br>(NOTA: Separe las rutas mediante retornos de carro)" .
"<textarea name=webs id=webs rows=10 cols=86></textarea></td></tr>\n";
// Campo de texto para los directorios
echo "\t\t\t<tr><td align=center colspan='" . $max_campos . "'><br>" .
"Inserte aqu los directorios que contengan ficheros .pdf para insertar " .
"en la base de datos:<br>(NOTA: Separe las rutas mediante retornos " .
"de carro)<textarea name=dirs id=dirs rows=10 cols=86></textarea>" .
"</td></tr>\n";
echo "\t\t\t<tr><td colspan='" . $max_campos . "'>(NOTA: Se buscarn " .
"ficheros que contengan en su nombre las tres partes clave de la " .
"referencia de la base de datos, esto es, el apellido del autor " .
"principal, las siglas de la publicacin y el ttulo del " .
"artculo/congreso).</td></tr>\n";
echo "\t\t</table>\n";
echo "\t\t<input type=submit value='Ir al paso 2' />\n";
echo "\t</form>\n";
desconecta_db($conexion_mysql);
}
else {
echo "Error en el nombre de usuario o en la contrasea.<br />Por favor, " .
"vuelva a la pantalla de validacin.<br />";
echo "<a href=\"./update.html\">Pgina de validacin</a>";
}
?>
10.#.1.3 PASO 2.PHP
<?php
include "functions.inc.php";
session_start();
error_reporting(0); // No se reporta ningn tipo de error
$conexion_mysql =& conecta_db(); // Conexin con la base de datos
// Validacin del usuario
if (valida_usuario($_SESSION["user"], $_SESSION["password"])) {
// Tamao, tipo y extensin permitidos para los ficheros a subir
//*******************************************************
$MAX_SIZE = 2000000;
$FILE_MIMES = array('text/plain');
$FILE_EXTS = array('.txt');
// Variables de configuracin
//*******************************************************
$site_name = $_SERVER['HTTP_HOST'];
$url_dir = "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
$url_this = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$upload_dir = "temp/";
106
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$upload_url = $url_dir."/temp/";
$message = "";
// Obtencin de las variables necesarias de la base de datos
$tablas_db = lista_tablas();
info_campos($tablas_db, $tipo_campos_tablas, $nombre_campos_tablas);
$max_campos = 0;
$max_adds = 0;
for ($i=0;$i<count($tablas_db);$i++)
{
$num_campos_tabla = 0;
$encontrada = false;
for ($j=0; $j<count($tablas_db); $j++)
{
if ($tablas_db[$j] == $_POST["tabla".$i])
{
$encontrada = true;
$cont = $j;
}
}
if ($encontrada == true)
{
$num_campos_tabla = count($nombre_campos_tablas[$cont]);
$num_campos_adds = 0;
for ($j=0; $j<count($tabla_campos_adicionales); $j++)
if (($tabla_campos_adicionales[$j] == $tablas_db[$cont]) ||
($tabla_campos_adicionales[$j] == "all"))
$num_campos_adds++;
if ($max_campos < $num_campos_tabla + $num_campos_adds)
$max_campos = $num_campos_tabla + $num_campos_adds;
}
}
// Directorio temporal de subida para la copia local
if (!is_dir("temp")) {
if (!mkdir($upload_dir))
die ("Directorio de subida no existe y su creacin fall");
if (!chmod($upload_dir,0755))
die ("Cambio de permisos a 755 fallido.");
}
// Vaciado del directorio temporal
borra_dir_temp($upload_dir);
// Copia local de los ficheros de actualizacin en el directorio TEMP
for ($i=0;$i<count($tablas_db);$i++) {
if ($_FILES["fichero" . $i]) {
$file_type = $_FILES["fichero" . $i]["type"];
$file_name = $_FILES["fichero" . $i]["name"];
$file_ext = strtolower(substr($file_name,strrpos($file_name,".")));
//Comprobacin del tamao del fichero
if ( $_FILES["fichero" . $i]["size"] > $MAX_SIZE)
$message = "Los ficheros deben tener un tamao mximo de 2MB.";
//Comprobacin del tipo y extensin del fichero
else if (!in_array($file_type, $FILE_MIMES) &&
!in_array($file_ext, $FILE_EXTS) )
$message = "Lo sentimos mucho, no se permite subir " .
$file_name . "(" . $file_type . ").";
else
$message = do_upload("fichero".$i, $upload_dir, $upload_url);
}
else if (!$_FILES["fichero" . $i])
$message = "Fichero especificado no vlido.";
}
107
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// Mensaje de bienvenida
print "<html>\n";
print "\t<head>\n";
print "\t</head>\n";
print "\t<body>\n";
print "\t\t<h2>Actualizacin automtica de la Base de Datos</h2><br />" .
"\n\t\t<h3>Paso 2: Seleccin de los campos que aparecen en los ficheros " .
"de actualizacin.</h3><br />\n\t\tA continuacin se muestran, separados " .
"mediante barras horizontales, los ficheros indicados en el paso 1, as " .
"como las tablas asociadas seleccionadas. En este paso el usuario deber " .
"seleccionar los campos que se detallan en el fichero de actualizacin, y" .
" en el mismo orden en que stos aparecen.<br />\n\t\tPor ltimo, se " .
"seleccionar el tipo de documento (en caso de que la tabla a modificar " .
"sea \"books\"), indicando si se trata de un libro normal o un libro de " .
"actas, as como los separadores de campos y de filas empleados en el " .
"fichero.<br /><br />\n";
// Impresin del formulario de seleccin de campos del fichero de
// actualizacin
//********************************************************************
echo "\t\t<form name='upload' id='upload' action='paso3.php' " .
"ENCTYPE='multipart/form-data' method='POST'>\n";
// Ahora se muestran los conjuntos de listas desplegables para seleccionar los
// campos que contienen los ficheros subidos al servidor
echo "\t\t\t<table width=100%>\n";
for ($i=0;$i<count($tablas_db);$i++) {
$num_campos_adicionales = 0;
$num_campos_undef = 0;
// Una nueva fila por cada fichero introducido y tabla seleccionada
if (($_FILES["fichero".$i]["name"] != "") && ($_POST["tabla".$i] != "")) {
echo "\t\t\t\t<tr>\n\t\t\t\t\t<td colspan=" . $max_campos .
">Fichero \"" . $_FILES["fichero" . $i]["name"] .
"\" => Tabla \"" . $_POST["tabla" . $i] . "\"</td>\n";
// Se imprimen los campos adicionales que correspondan
for ($j=0; $j<count($lista_campos_adicionales); $j++)
if (($tabla_campos_adicionales[$j] == "all") ||
($tabla_campos_adicionales[$j] == $_POST["tabla".$i]))
$num_campos_adicionales++;
// Se imprimen los separadores que correspondan
for ($j=0; $j<count($lista_campos_undef); $j++)
{
if (($tabla_campos_undef[$j] == "all") ||
($tabla_campos_undef[$j] == $_POST["tabla".$i]))
{
echo "\t\t\t\t\t<td>" . ucwords($lista_campos_undef[$j]) .
"</td>\n";
$num_campos_undef++;
}
}
echo "\t\t\t\t</tr>\n";
echo "\t\t\t\t<tr>\n";
$indice_tabla = 0;
for ($j=0;$j<count($tablas_db);$j++)
if ($tablas_db[$j] == $_POST["tabla" . $i])
$indice_tabla = $j;
// Numero de campos de esta tabla (no se cuenta el id)
$n_campos = count($nombre_campos_tablas[$indice_tabla]) - 1;
// Numero de campos adicionales de esta tabla
$n_adds = 0;
for ($j=0; $j<count($tabla_campos_adicionales); $j++)
if (($tabla_campos_adicionales[$j] == $tablas_db[$indice_tabla]) ||
($tabla_campos_adicionales[$j] == "all"))
$n_adds++;
for ($j=0; $j<$max_campos; $j++) {
// Se aaden los elementos de la tabla en cuestin (inclusive los
108
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// adicionales)
if ($j < $n_campos + $n_adds){
echo "\t\t\t\t\t<td>\n";
echo "\t\t\t\t\t\t<select name='campo" . $i . "-" . $j . "'>\n";
echo "\t\t\t\t\t\t\t<option value=''></option>\n";
for ($k=1;$k<=(count($nombre_campos_tablas[$indice_tabla]));$k++) {
if ($k < count($nombre_campos_tablas[$indice_tabla]))
echo "\t\t\t\t\t\t\t<option value='"
. $nombre_campos_tablas[$indice_tabla][$k] . "'>"
. $nombre_campos_tablas[$indice_tabla][$k] . "</option>\n";
else
for ($m=0; $m<count($lista_campos_adicionales); $m++)
if (($tabla_campos_adicionales[$m] == "all") ||
($tabla_campos_adicionales[$m] == $_POST["tabla".$i]))
{
echo "\t\t\t\t\t\t\t<option value='"
. $var_campos_adicionales[$m]
. "'>" . $var_campos_adicionales[$m]
. "</option>\n";
}
}
echo "\t\t\t\t\t\t</select>\n";
echo "\t\t\t\t\t</td>\n";
}
// Se aaden las celdas vacas que resten hasta el nmero mximo de
// campos
else
echo "\t\t\t\t\t<td>\n\t\t\t\t\t</td>\n";
}
// Se muestran los campos interactivos que correspondan
for ($j=0; $j<count($lista_campos_undef); $j++)
{
if (($tabla_campos_undef[$j] == "all") ||
($tabla_campos_undef[$j] == $_POST["tabla".$i]))
{
echo "\t\t\t\t\t<td>\n";
echo "\t\t\t\t\t\t<select name='" . $var_campos_undef[$j]
. $i . "'>\n";
echo "\t\t\t\t\t\t\t<option value=''></option>\n";
for ($k=0; $k<count($desc_campos_undef[$lista_campos_undef[$j]]);
$k++)
echo "\t\t\t\t\t\t\t<option value='" .
$valores_campos_undef[$lista_campos_undef[$j]][$k]
. "'>" . $desc_campos_undef[$lista_campos_undef[$j]][$k]
. "</option>\n";
echo "\t\t\t\t\t\t</select>\n";
echo "\t\t\t\t\t</td>\n";
}
}
// Lnea horizontal para separar los distintos ficheros de actualizacin
echo "\t\t\t\t</tr>\n";
$longitud = $max_campos+4;
for ($k=0;$k<count($tablas_db);$k++)
if ($_POST["tabla".$k] == "books")
$longitud++;
echo "\t\t\t\t<tr>\n\t\t\t\t\t<td colspan=" . $longitud .
"><hr /></td>\n";
echo "\t\t\t\t</tr>\n";
}
}
// Se muestran las direcciones que se insertaron en el paso previo (se
// comprueba que son direcciones vlidas, esto es, que direccionen a un
// documento html, php, ..., pero no un nombre de dominio, y que stas existan
// y se puedan leer)
109
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
echo "\t\t\t\t<tr>\n\t\t\t\t\t<td colspan=" . $longitud . ">\n";
echo "\t\t\t\t\t\tDirecciones que se utilizarn para actualizar la base de " .
"datos:\n";
$tok = strtok($_POST["webs"], "\n");
$i = 0;
echo "\t\t\t\t\t\t<ul>\n";
$exts = array(".html", ".htm", ".php", ".asp", ".aspx");
while ($tok !== false) {
// Comprobaciones previas
$error = "";
$address = trim($tok);
$pos_site = strlen($address);
$pos_barra = strrpos(substr($address, 0, $pos_site), "/");
// Caso en que la direccin termina en barra invertida => ERROR
if ($pos_barra == $pos_site)
$error = "La direccin debe apuntar a un documento, no un directorio " .
"o nombre de dominio.";
else {
$last_part = substr($address, $pos_barra + 1);
$found = false;
// Se busca una de las terminaciones permitidas
for ($j=0; $j<count($exts); $j++)
if (strpos($last_part, $exts[$j]) !== false)
$found = true;
// Si la direccin no apunta a un documento con extensin permitida
if ($found == false)
$error = "La direccin debe apuntar a un documento, no un " .
"directorio o nombre de dominio.";
else {
$desc_read = fopen($address, "rb");
if ($desc_read == FALSE)
$error = "La direccin indicada no existe o no se puede acceder " .
"a ella.";
}
}
// En caso de error se muestra un mensaje en pantalla pero no se enva como
// campo oculto la direccin facilitada
if ($error != "")
// En caso de xito, se muestra la direccin por pantalla y se enva como
// campo oculto
echo "\t\t\t\t\t\t\t<li>" . $address . "\n\t\t\t\t\t\t\t\t"
"<ul>\n\t\t\t\t\t\t\t\t\t<li>Error: ".$error."\n\t\t\t\t\t\t\t\t\t" .
"</li>\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</li>\n";
else {
echo "\t\t\t\t\t\t\t<li>" . $address . "</li>\n";
echo "\t\t\t\t\t\t\t<input type=hidden name='url" . $i . "' value='" .
$address . "' />\n";
$i++;
}
$tok = strtok("\n");
}
echo "\t\t\t\t\t\t</ul>\n";
echo "\t\t\t\t\t\tNOTA: Las pginas que hayan generado errores no se " .
"tendrn en cuenta para la actualizacin. Si desea que se tengan en " .
"cuenta, vuelva al paso anterior y solucione los problemas que " .
"puedan existir.\n";
echo "\t\t\t\t\t</td>\n";
echo "\t\t\t\t</tr>\n";
echo "\t\t\t\t<tr>\n\t\t\t\t\t<td colspan=" . $longitud . "><hr /></td>\n";
// Se muestran los directorios insertados en el paso previo
echo "\t\t\t\t<tr>\n\t\t\t\t\t<td colspan=" . $longitud . ">\n";
echo "\t\t\t\t\t\tDirectorios que se utilizarn para actualizar la base de" .
"datos:\n";
$tok = strtok($_POST["dirs"], "\n");
$i = 0;
110
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
echo "\t\t\t\t\t\t<ul>\n";
while ($tok !== false) {
$directory = trim($tok);
if (is_dir($directory) == false)
echo "\t\t\t\t\t\t\t<li>" . stripslashes($directory) .
"\n\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t<li>Error: El " .
"directorio no existe o no se puede acceder a l.\n\t\t\t\t\t\t\t\t\t"
. "</li>\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t</li>\n";
else {
echo "\t\t\t\t\t\t\t<input type=hidden name='dir" . $i . "' value='" .
stripslashes($directory) . "' />\n";
echo "\t\t\t\t\t\t\t<li>" . stripslashes($directory) . "</li>\n";
$i++;
}
$tok = strtok("\n");
}
echo "\t\t\t\t\t\t</ul>\n";
echo "\t\t\t\t\t\tNOTA: Los directorios que hayan generado errores no se
" tendrn cuenta para la actualizacin. Si desea que se tengan en cuenta," .
" vuelva al paso anterior y solucione los problemas que puedan existir.\n";
echo "\t\t\t\t\t</td>\n";
echo "\t\t\t\t</tr>\n";
echo "\t\t\t\t<tr>\n\t\t\t\t\t<td colspan=" . $longitud . "><hr /></td>\n";
echo "\t\t\t\t</tr>\n";
echo "\t\t\t</table>\n";
echo "\t\t\t<br />\n";
// Insertamos el conjunto de parmetros ocultos, a saber, los nombres de las
// tablas a actualizar y ficheros a utilizar
for ($i=0;$i<count($tablas_db);$i++) {
if (($_FILES["fichero".$i]["name"] != "") && ($_POST["tabla".$i] != "")) {
echo "\t\t\t<input type=hidden name='tabla" . $i . "' value='" .
$_POST["tabla".$i] . "' />\n";
echo "\t\t\t<input type=hidden name='fichero" . $i . "' value='" .
$_FILES["fichero".$i]["name"] . "' />\n";
}
}
echo "\t\t\t<input type=submit value='Ir al paso 3' />\n";
echo "\t\t\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n";
echo "\t\t\t<a href=\"/groupweb/help.html\" target=\"popup\" " .
"onClick=\"window.open('/groupweb/help.html', 'window', " .
"'width=600,height=400,resizable=1,scrollbars=1'); return " .
"false;\">Ayuda</a>\n";
echo "\t\t</form>\n";
echo "\t</body>\n";
echo "</html>\n";
desconecta_db($conexion_mysql);
}
else {
echo "Error en el nombre de usuario o en la contrasea.<br />Por favor, " .
"vuelva a la pantalla de validacin.<br />";
echo "<a href=\"./update.html\">Pgina de validacin</a>";
}
?>
10.#.1.# PASO 3.PHP
<?php
include "functions.inc.php";
include "functions.step3.php";
session_start();
$conexion_mysql =& conecta_db(); // Conexin con la base de datos
unset($sentencias_SQL);
111
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
unset($sentencia_SQL);
unset($congresos);
unset($revistas);
unset($table_type);
unset($titulo);
unset($ind_sql);
unset($referencia);
// Cambiamos el tiempo mximo de respuesta, porque esto tarda bastante
ini_set("max_execution_time", "1800");
// No se reporta ningn tipo de error
error_reporting(0);
// Validacin del usuario
if (valida_usuario($_SESSION["user"], $_SESSION["password"])) {
// Declaracin y definicin de variables
$pubs_file = "pubs.txt";
$log_file = "pdf_log.txt";
$campo_def_add = array(
"tabla" => 0, // Tabla que actualizar esta entrada
"error" => 1,
"pdf" => 2, // Direccin web del fichero pdf
// [0] => direccion
// [1] => porcentaje
"finished" => 3, // Bandera para saber si se ha terminado esta entrada
"authors" => 4,
"sep_authors" => 5, // Separador para los autores
"supervisors" => 6, // Supervisores
"sep_supervisors" => 7); // Separador de los supervisores
$def_offset = count($campo_def_add);
// Array con los mensajes de error que se contemplan
$mensajes_error = array(
"congreso" => "No se ha podido completar el campo \"reference\" debido a " .
"que se desconoce el congreso.",
"revista" => "No se ha podido completar el campo \"reference\" debido a " .
"que se desconoce la revista.",
"fecha" => "Es obligatorio especificar al menos los campos \"authors\", " .
"\"title\", el nombre de publicacin/congreso y la fecha de " .
"publicacin. No se ha especificado la fecha de publicacin, por lo " .
"que no se puede generar el campo \"reference\".",
"autores" => "Es obligatorio especificar al menos los campos \"authors\"" .
", \"title\", el nombre de publicacin/congreso y la fecha de ".
"publicacin. No se han especificado los autores, por lo que no se " .
"puede generar el campo \"reference\".",
"titulo" => "Es obligatorio especificar al menos los campos \"authors\", " .
"\"title\", el nombre de publicacin/congreso y la fecha de " .
"publicacin. No se ha especificado el ttulo de la publicacin.");
// Array de nmeros romanos para los ttulos de artculos y ponencias, para
// ponerlos todos en maysculas
$numbers = array("I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X",
"XI", "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX",
"XXI", "XXII", "XXIII", "XXIV", "XXV", "XXVI", "XXVII", "XXVIII", "XXIX",
"XXX", "XXXI", "XXXII", "XXXIII", "XXXIV", "XXXV", "XXXVI", "XXXVII",
"XXXVIII", "XXXIX", "XL", "XLI", "XLII", "XLIII", "XLIV", "XLV", "XLVI",
"XLVII", "XLVIII", "XLIX", "L");
$letra = array("b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
"n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");
// Array de acrnimos y siglas que deben ir en maysculas
$mayusc = array("IEEE", "CD", "HTTP", "OPC", "ROM");
// Array asociativo del tipo de publicacin con el entero que le corresponde
$tipo_publicacion = array(
"congress" => 1,
"journals" => 2,
"pfcs" => 3,
"phds" => 4,
"books" => 5);
112
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$ind_sql = 0;
$temp_dir = "temp/";
$catalogo_sep = array("\n","\r","\r\n","\t",";",":",",",".");
//Comprobacin de la variable "FORMULARIO". Si sta se encuentra definida,
//quiere decir que se est redireccionando a esta pgina desde ella misma para
//actualizar el fichero de las publicaciones conocidas. Esta modificacin ha
//de hacerse antes que cualquier consulta al mismo.
$formulario = 0;
if (isset($_POST["formulario"]))
$formulario = $_POST["formulario"];
else
$formulario = 0;
// Recuperacin de informacin de la base de datos.
$conexion_mysql = conecta_db();
$tablas_db = lista_tablas();
info_campos($tablas_db, $tipo_campos_tablas, $nombre_campos_tablas);
info_campos_asoc($tablas_db, $tipo_campos, $campos_tablas);
// Insercin de los campos especificados en $lista_campos_undef en arrays con
// nombres especificados en $var_campos_undef
//**************************************************************************
$max_campos = 0; // Nmero mximo de campos
for ($i=0;$i<count($tablas_db);$i++)
if ($max_campos < count($nombre_campos_tablas[$i]))
$max_campos = count($nombre_campos_tablas[$i]);
for ($i=0;$i<count($tablas_db);$i++)
{
for ($k=0; $k<count($var_campos_undef); $k++)
{
$var_name = $var_campos_undef[$k];
$$var_name = array();
}
}
// Extraccin de los campos que se han de actualizar,
// los separadores e informacin diversa
$indice_tablas = 0; // Indice para recorrer todas las tablas de
// la base de datos
$campos_update[0][0] = "";
for ($i=0; $i<count($tablas_db); $i++) {
if (isset($_POST["tabla" . $i]) && isset($_POST["fichero" . $i]) &&
($_POST["tabla" . $i] != "") && ($_POST["fichero" . $i] != ""))
{
$nombre_tablas[$indice_tablas] = $_POST["tabla" . $i];
$nombre_ficheros[$indice_tablas] = $_POST["fichero" . $i];
if (($_POST["tabla" . $i] != "sent") &&
($_POST["tabla" . $i] != "authors") &&
($_POST["tabla" . $i] != "people"))
{
$dependencias[$indice_tablas] = "authors";
}
// Los separadores necesitan un procesado especial, y en realidad se pasa
// el ndice de una tabla en la que buscar el separador
for ($k=0; $k<count($var_campos_undef); $k++)
array_push($$var_campos_undef[$k],
$catalogo_sep[$_POST[$var_campos_undef[$k] . $i]]);
for ($j=0; $j<$max_campos; $j++) {
if ($_POST["campo" . $i . "-" . $j] != "") {
$campos_update[$indice_tablas][$j] =
$_POST["campo" . $i . "-" . $j];
}
}
113
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$indice_tablas++;
}
}
// ACTUALIZACIN DEL FICHERO DE PUBLICACIONES EN CASO DE REDIRECCIONAMIENTO DE
// LA PGINA
//****************************************************************************
if (isset($_POST["errores"]))
// Obtencin del nmero de publicaciones desconocidas
$n_unknown = $_POST["errores"];
else
$n_unknown = 0;
$added_entries = 0;
$mod_entries = 0;
$processed = 0;
$new_pubs[$added_entries]["tabla_modif"] = "";
$pubs_mod[0] = "";
if ($formulario == 1) {
// Editamos el fichero "pubs.txt" para aadir las revistas ingresadas
$j = 0;
unset($parte_nueva);
while ($processed < $n_unknown) {
$tabla_actual = $_POST["tabla_modif" . $j];
// Si los parmetros son correctos.... (esto es,
// que no hayan dejado ninguno de los campos vacos)
if (isset($_POST["comment" . $j]))
{
if (($_POST["comment" . $j] != "") &&
($_POST["abbrev" . $j] != "") &&
($_POST["keywords" . $j] != ""))
{
// Se almacenan los datos necesarios para actualizar
// otra publicacin cualquiera con el mismo error
$new_pubs[$added_entries]["tabla_modif"] =
$_POST["tabla_modif" . $j];
$indice = 0;
if ($tabla_actual == "journals")
for ($l=0; $l<count($campos_tablas[$tabla_actual]); $l++)
if ($campos_tablas[$tabla_actual][$l] == "journal")
$indice = $l;
else if ($tabla_actual == "congress") {
for ($l=0; $l<count($campos_tablas[$tabla_actual]); $l++)
if ($campos_tablas[$tabla_actual][$l] == "booktitle")
$indice = $l;
}
$new_pubs[$added_entries]["nombre"] =
$_POST["campos_def" . $j . "-" . ($indice + $def_offset)];
$new_pubs[$added_entries]["abbrev"] = $_POST["abbrev" . $j];
// Obtenemos los parmetros de la nueva publicacin
$comentario = $_POST["comment" . $j];
$siglas = $_POST["abbrev" . $j];
$claves = $_POST["keywords" . $j];
// ....se procede a realizar una copia del
// contenido del fichero de publicaciones
$archivo = fopen("pubs.txt", "r+t");
$contenido = fread($archivo, filesize("pubs.txt"));
fclose($archivo);
// Entrada a buscar en el contenido
$cadena = "::".strtoupper($_POST["tabla_modif".$j]);
// En caso de que se encuentre la entrada de
// insercin, se procede a crear la cadena a insertar
if (stripos(" ".$contenido, $cadena)) {
// Separamos las palabras claves mediante tabuladores
$palabra = quita_tildes(trim(strtolower(strtok($claves, " "))));
$k = -1;
unset($claves_separadas);
114
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
while ($palabra != FALSE) {
$k++;
$claves_separadas = $claves_separadas . "\t" . $palabra;
$palabra = strtok(" ");
}
// PARTE_NUEVA es la cadena referente a la nueva publicacin
$parte_nueva = "\n// " . $comentario . "\n" . strtoupper($siglas)
. ";" . $claves_separadas . "\n";
// Actualizamos el contenido total del fichero
$contenido = substr($contenido, 0, stripos(" " .
$contenido, $cadena) -1 + strlen($cadena)) . $parte_nueva .
substr($contenido, stripos(" " .
$contenido, $cadena) + strlen($cadena));
//Insertamos el nuevo contenido en el fichero de las
//publicaciones
$archivo = fopen("pubs.txt", "w+t");
fwrite($archivo, $contenido);
fclose($archivo);
// Actualizamos la referencia de la publicacin
$added_entries++;
$_POST["campos_def" . $j . "-" . $campo_def_add["error"]] = "";
$k = 0;
while ($campos_tablas[$tabla_actual][$k] != "reference")
$k++;
$l = 0;
while(!ctype_digit($_POST["campos_def" . $j .
"-" . ($k+$def_offset)][$l]))
{
$l++;
}
$cad = "campos_def" . $j . "-" . ($k+$def_offset);
$_POST[$cad] = substr($_POST[$cad], 0, $l) .
strtoupper($siglas) . substr($_POST[$cad], $l);
$_POST["field" . $j . "-" . ($k+$def_offset)] =
$_POST[$cad];
$pubs_mod[$mod_entries++] = $j;
}
}
else {
// Se busca el ndice para extraer
// el nombre de la publicacin
$indice = 0;
if ($tabla_actual == "journals") {
for ($l=0;$l<count($campos_tablas[$tabla_actual]);$l++)
if ($campos_tablas[$tabla_actual][$l] == "journal")
$indice = $l;
}
else if ($tabla_actual == "congress") {
for ($l=0;$l<count($campos_tablas[$tabla_actual]);$l++)
if ($campos_tablas[$tabla_actual][$l] == "congress")
$indice = $l;
}
$nombre = $_POST["campos_def" . $j . "-" .
($indice + $def_offset)];
$changed = false;
// Se busca una publicacin que tenga el mismo
// nombre y que modifique la misma tabla siempre
// y cuando no se haya modificado antes la referencia
for ($n=0; $n<count($new_pubs); $n++) {
if (($tabla_actual == $new_pubs[$n]["tabla_modif"]) &&
($nombre == $new_pubs[$n]["nombre"]) &&
($changed == false))
{
$_POST["campos_def" . $j . "-" .
$campo_def_add["error"]] = "";
115
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$k = 0;
while ($campos_tablas[$tabla_actual][$k] != "reference")
$k++;
$l = 0;
while(!ctype_digit($_POST["campos_def" . $j .
"-" . ($k+$def_offset)][$l]))
{
$l++;
}
$cad = "campos_def" . $j . "-" . ($k+$def_offset);
$_POST[$cad] = substr($_POST[$cad], 0, $l) .
strtoupper($new_pubs[$n]["abbrev"]) .
substr($_POST[$cad], $l);
$_POST["field" . $j . "-" . ($k+$def_offset)] =
$_POST[$cad];
$changed = true;
$pubs_mod[$mod_entries++] = $j;
}
}
}
$processed++;
}
$j++;
}
}
// APELLIDOS: contiene los apellidos de todos los autores
// pertenecientes al grupo.
$peticion_sql = "SELECT bibtexname FROM people";
$resultado = mysql_query($peticion_sql) or die("La consulta fall: " .
mysql_error());
$i = 0;
while ($linea = mysql_fetch_array($resultado, MYSQL_ASSOC)) {
$nombres_usuarios[$i] = $linea["bibtexname"];
$i++;
}
$apellidos = busca_apellido_reg($nombres_usuarios);
// AUTORES_GRUPO: array con los nombres de los autores del grupo
$resultado = mysql_query("SELECT name, surname FROM people");
$j = 0;
while ($row = mysql_fetch_assoc($resultado)) {
$autores_grupo[$j] = quita_tildes(strtolower(trim($row['name'] .
" " . $row['surname'])));
$j++;
}
// Mensaje de bienvenida
imprime_mensaje_bienvenida($formulario, $log_file);
// Mensaje de progreso
echo "\t\t<div id='progress' style='margin:20px 0px 0px " .
"0px;position:relative;padding:0px;width:700px;" .
"height:30px;left:25px;'></div>\n";
flush();
ob_flush();
// Apertura del fichero con los datos a actualizar
//*****************************************
// Primero se mira qu tablas se van a modificar, pues si se trata de
// "congress" o "journals", ha de crearse un array a partir de las
// publicaciones contenidas en el fichero auxiliar "pubs.txt".
genera_arrays($pubs_file, $tablas_db, $congresos, $siglas_congreso, $revistas,
$siglas_revista);
// Bucle principal -> una iteracin por cada tabla principal a modificar
$n_tablas = count($nombre_tablas);// N de tablas a modificar
unset($errores);
116
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
for ($i=0;$i<$n_tablas;$i++)
$errores[$i] = FALSE; // Variable que indica si hay
// publicaciones desconocidas
// Indice para saber el nmero de errores en las entradas de la actualizacin
$n_errores = $n_unknown - $added_entries;
$entrado = FALSE;
$def_count = 0;
$mark[0] = 0;
// Obtencin de las direcciones
$i = 0;
while (isset($_POST["url" . $i])) {
$urls[$i] = $_POST["url" . $i];
$i++;
}
$html_contents = get_html_content($urls);
// Obtencin de los directorios
$i = 0;
while (isset($_POST["dir" . $i])) {
$dirs[$i] = $_POST["dir" . $i];
$i++;
}
if ($formulario == 0) {
// Bucle principal, se recorren todos los ficheros y se crea una entrada en
// $campos_def por cada publicacin. Esta entrada contendr toda la
// informacin necesaria para poder actualizar la BD posteriormente, sin
// necesidad de procesar
// otra vez toda la informacin.
$ini_msg = "<b>PROCESANDO FICHERO \"";
for ($i=0; $i<$n_tablas; $i++) {
// Apertura del fichero de actualizacin
$archivo = fopen($temp_dir.$nombre_ficheros[$i], "r");
$msg = $ini_msg . $nombre_ficheros[$i] . "\"</b>: ";
if ($archivo) {
unset($contenido);
unset($lineas);
unset($num_lineas);
$contenido = fread($archivo, filesize($temp_dir .
$nombre_ficheros[$i]));
$lineas = explode($separador_linea[$i], $contenido);
$num_lineas = count($lineas);
$l_count = 0;
$vacio = false;
$campos_erroneos = false;
for ($j=0; $j<count($campos_update[$i]); $j++) {
if ($campos_update[$i][$j] == "")
$vacio = true;
else if ($vacio == true)
$campos_erroneos = true;
}
if ($campos_erroneos == false) {
while ($l_count < $num_lineas) {
// Paso 1: Obtener una fila de la tabla
$linea = trim($lineas[$l_count]);
if ($linea != "") {
// Se muestra el mensaje de progreso
$ind_title = 0;
for ($j=0; $j<=count($campos_def[$def_count])-$def_offset;
$j++)
if
($campos_tablas[$campos_def[$def_count][$campo_def_add["tabla"]]][$j] == "title")
$ind_title = $j;
$progress_msg = $msg . "Procesando entrada " .
117
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
($def_count+1) . "...";
echo "\t\t<script type=\"text/javascript\"> " .
"document.getElementById(\"progress\").innerHTML " .
"= '" . $progress_msg . "' </script>\n";
flush();
ob_flush();
for ($j=0;
$j<(count($campos_tablas[$nombre_tablas[$i]])+$def_offset);
$j++)
{
// Contendr los campos finales de cada lnea,
// para generar la orden SQL
$campos_def[$def_count][$j] = "";
}
$campos_def[$def_count][$campo_def_add["tabla"]] =
$nombre_tablas[$i];
// Paso 2: Extraer cada uno de los campos (se insertan en
// "campos_temp")
$campo = strtok($linea, $separador_campo[$i]);
$j = -1;
while ($campo != FALSE) {
$j++;
$campos_temp[$j] = $campo;
$campo = strtok($separador_campo[$i]);
}
//Paso 3: Identificar campos e insertarlos en una tabla que se
//usar posteriormente para generar las rdenes SQL
// Bucle que se recorre una vez por cada campo de la tabla para
// rellenar los campos no especificados y los directamente
// asignables
for ($j=0; $j<count($campos_tablas[$nombre_tablas[$i]]); $j++)
{
$encontrado = FALSE;
$inserta = false;
// NOTA: Los campos de autores, fecha, ttulo y publicacin
// son obligatorios en todos los casos
switch ($campos_tablas[$nombre_tablas[$i]][$j]) {
// Si el campo en cuestin es la fecha de un PFC o un
// PHD, se usa la nomenclatura AO-MES-DIA, con 4 dgitos
// de precisin el ao y dos dgitos el resto, separados
// por guiones
case "datephd":
case "datepfc":
for ($k=0; $k<count($campos_update[$i]); $k++) {
if ($campos_update[$i][$k] ==
$campos_tablas[$nombre_tablas[$i]][$j])
{
if (strpos($campos_temp[$k], "/") !== false)
$parts = explode("/", $campos_temp[$k]);
else if (strpos($campos_temp[$k], "-") !== false)
$parts = explode("-", $campos_temp[$k]);
else if (strpos($campos_temp[$k], ".") !== false)
$parts = explode(".", $campos_temp[$k]);
else if (strpos($campos_temp[$k], " ") !== false)
$parts = explode(" ", $campos_temp[$k]);
$field = $parts[2] . "-" . $parts[1] .
"-" . $parts[0];
$inserta = true;
}
}
break;
// Cdigo de libro: libro o actas
case "code":
$field = $_POST["tipo_libro".$i];
118
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$inserta = true;
break;
default:
for ($k=0; $k<count($campos_update[$i]); $k++)
{
if ($campos_update[$i][$k] ==
$campos_tablas[$nombre_tablas[$i]][$j])
{
$field = $campos_temp[$k];
$inserta = true;
}
}
break;
}
if ($inserta == true)
{
trata_texto($field, $siglas_congreso,
$siglas_revista, $mayusc, $numbers);
$campos_def[$def_count][$j + $def_offset] = $field;
$inserta = false;
}
}
// Bucle que procesa los casos particulares y los inserta en la
// tabla de campos para las rdenes SQL:
// * Campos ficticios a partir de los cuales se deben obtener
// otros campos
// * Campos para actualizar otras tablas interrelacionadas
// (authors, supervisors)
// * Campos que se obtienen de forma indirecta a partir de
// otros campos (reference)
// AUTHORS:
for ($k=0; $k<count($campos_update[$i]); $k++) {
if ($campos_update[$i][$k] == "authors") {
$cad = $campos_temp[$k];
$cad = str_replace(". ", ".", $cad);
$cad = str_replace(".", ". ", $cad);
$cad = ucwords(strtolower($cad));
$campos_def[$def_count][$campo_def_add["authors"]] =
$cad;
}
}
// SEP_AUTHORS:
$campos_def[$def_count][$campo_def_add["sep_authors"]] =
$separador_autor[$i];
// SUPERVISORS:
for ($k=0; $k<count($campos_update[$i]); $k++)
if ($campos_update[$i][$k] == "supervisors")
$campos_def[$def_count][$campo_def_add["supervisors"]] =
$campos_temp[$k];
// SEP_AUTHORS:
$campos_def[$def_count][$campo_def_add["sep_supervisors"]] =
$separador_super[$i];
// REFERENCE:
$indice = 0;
for ($l=0;$l<count($campos_update[$i]);$l++)
if ($campos_update[$i][$l] == "authors")
$indice = $l;
// El primer campo de la referencia es el primer apellido del
// autor. Para insertarlo, se busca el primer apellido de todos
// los autores posibles del grupo en el grupo de autores. Se
// escoge el autor que aparezca en primer lugar.
$main_author = strtok($campos_temp[$indice],
$separador_autor[$i]);
$reference = busca_apellido_autor($main_author,
$apellidos);
119
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
unset($nombre);
// El segundo campo de la referencia es el tipo de publicacin.
switch ($nombre_tablas[$i]) {
case "books":
$reference = $reference . "BOOK";
$insertado = TRUE;
break;
case "phds":
$reference = $reference . "PHD";
$insertado = TRUE;
break;
case "pfcs":
$reference = $reference . "PFC";
$insertado = TRUE;
break;
case "journals":
$revista = busca_revista($campos_update[$i],
$campos_temp, $revistas, $siglas_revista, $insertado);
$reference = $reference . $revista;
if ($insertado == false) {
$campos_def[$def_count][$campo_def_add["error"]] .=
"revista*";
$n_errores++;
set_form($formulario);
}
break;
case "congress":
$congreso = busca_congreso($campos_update[$i],
$campos_temp, $congresos, $siglas_congreso,
$insertado);
$reference = $reference . $congreso;
if ($insertado == false) {
$campos_def[$def_count][$campo_def_add["error"]] .=
"congreso*";
$n_errores++;
set_form($formulario);
}
break;
}
// El tercer campo de la referencia es el ao
for ($k=0; $k<count($campos_update[$i]); $k++) {
switch ($campos_update[$i][$k]) {
case "year":
case "datepfc":
case "datephd":
$year = "";
if (strpos($campos_temp[$k], "-") !== false)
$parts = explode("-", $campos_temp[$k]);
else if (strpos($campos_temp[$k], "/") !== false)
$parts = explode("/", $campos_temp[$k]);
else if (strpos($campos_temp[$k], ".") !== false)
$parts = explode(".", $campos_temp[$k]);
else if (strpos($campos_temp[$k], " ") !== false)
$parts = explode(".", $campos_temp[$k]);
else
$year = $campos_temp[$k];
if ($year == "")
for ($n=0; $n<count($parts); $n++)
if (strlen($parts[$n]) == 4)
$year = $parts[$n];
$reference = $reference . $year;
break;
}
}
for ($j=0; $j<count($campos_tablas[$nombre_tablas[$i]]); $j++)
120
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
if ($campos_tablas[$nombre_tablas[$i]][$j] == "reference")
$campos_def[$def_count][$j + $def_offset] = $reference;
// Es necesario especificar el ao o la fecha de
// publicacin para poder generar la referencia
$especificado = false;
for ($j=0;
$j<count($campos_tablas[$campos_def[$def_count][$campo_def_add["tabla"]]]);
$j++)
{
switch
($campos_tablas[$campos_def[$def_count][$campo_def_add["tabla"]]][$j])
{
case "datepfc":
case "datephd":
case "year":
if ($campos_def[$def_count][$j+$def_offset] != "")
$especificado = true;
break;
}
}
if ($especificado == false) {
$campos_def[$def_count][$campo_def_add["error"]] .=
"fecha*";
set_form($formulario);
}
// Es necesario especificar el ttulo de la publicacin
$especificado = false;
for ($j=0;
$j<count($campos_tablas[$campos_def[$def_count][$campo_def_add["tabla"]]]);
$j++)
{
switch
($campos_tablas[$campos_def[$def_count][$campo_def_add["tabla"]]][$j])
{
case "title":
if ($campos_def[$def_count][$j+$def_offset] != "")
$especificado = true;
break;
}
}
if ($especificado == false) {
$campos_def[$def_count][$campo_def_add["error"]] .=
"titulo*";
set_form($formulario);
}
// Es necesario especificar los autores para poder generar la
// referencia
$especificado = false;
if ($campos_def[$def_count][$campo_def_add["authors"]] != "")
$especificado = true;
if ($especificado == false) {
$campos_def[$def_count][$campo_def_add["error"]] .=
"autores*";
set_form($formulario);
}
// Se mira en las pginas facilitadas si existe un hyperlink
// de un fichero pdf para la publicacin en cuestin
$ind_title = 0;
for ($j=0; $j<=count($campos_def[$def_count])-$def_offset;
$j++)
{
121
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
if
($campos_tablas[$campos_def[$def_count][$campo_def_add["tabla"]]][$j] == "title")
$ind_title = $j;
busca_publicacion_web($html_contents, $urls,
$campos_def[$def_count][$ind_title+$def_offset],
$siglas_congreso, $siglas_revista, $mayusc, $numbers,
$campos_def[$def_count][$campo_def_add["pdf"]]);
// Se busca en los directorios siempre
// que se tenga la referencia completa
if ((strpos($campos_def[$def_count][$campo_def_add["error"]],
"revista") === false) &&
(strpos($campos_def[$def_count][$campo_def_add["error"]],
"congreso") === false) &&
(strpos($campos_def[$def_count][$campo_def_add["error"]],
"autores") === false) &&
(strpos($campos_def[$def_count][$campo_def_add["error"]],
"fecha") === false))
{
// Solamente se mira en los directorios si el usuario ha
// incluido alguno
if (is_array($dirs)) {
$path = 0;
$percent = 1;
busca_publicacion_dir($dirs, $reference, $pubs_file,
$campos_def[$def_count][$campo_def_add["pdf"]]);
}
}
// Si no se ha encontrado nada, entonces se pone en blanco un
// campo de los pdfs para al menos dar la oportunidad de
// aadirlo
if (($campos_def[$def_count][$campo_def_add["pdf"]][0][0]== "")
||!isset($campos_def[$def_count][$campo_def_add["pdf"]][0][0]))
{
$campos_def[$def_count][$campo_def_add["pdf"]][0][0] = "";
$campos_def[$def_count][$campo_def_add["pdf"]][0][1] = "";
set_form($formulario);
}
// La primera vez todas las entradas se toman como incompletas
$campos_def[$def_count][$campo_def_add["finished"]] = 0;
$def_count++;
}
$l_count++;
unset($linea);
}
}
else
echo "Ha especificado incorrectamente los campos en el paso " .
"anterior. Por favor, reintente la operacin tras subsanar " .
"el error.";
fclose ($archivo);
} else die("Error al abrir el fichero (compruebe que el fichero " .
"existe y que se tienen los permisos necesarios para acceder al " .
"mismo.");
}
}
// Si no es la primera vez que se carga la pgina (esto es, se
// redirecciona a s misma)...
else
{
// Se obtiene la tabla $campos_def
$i = 0; // 1 dimensin de $campos_def
$j = 0; // 2 dimensin de $campos_def
// Una iteracin por cada entrada
while (isset($_POST["campos_def" . $i . "-" . $j]) ||
122
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
isset($_POST["campos_def" . $i . "-" . $j . "-0-0"]))
{
// Una iteracin por cada campo de cada entrada
while (isset($_POST["campos_def" . $i . "-" . $j]) ||
isset($_POST["campos_def" . $i . "-" . $j . "-0-0"]))
{
if ($j < $def_offset) {
if (($j != $campo_def_add["pdf"]) &&
($j != $campo_def_add["finished"]) &&
($j != $campo_def_add["authors"]))
{
$campos_def[$i][$j] = $_POST["campos_def" . $i . "-" . $j];
}
else if ($j == $campo_def_add["authors"])
$campos_def[$i][$j] = $_POST["field" . $i . "-" . $j];
else if ($j == $campo_def_add["pdf"]) {
unset($url); unset($mark);
$salir = false; // Bandera para salir del bucle
$k = 0; // Contador para la totalidad de direcciones
$bad = 0; // Contador para las direcciones errneas
// En caso de lista de ficheros, se obtiene cul
// de los fichero es el actualmente seleccionado
if (isset($_POST["pdf_check" . $i])) {
// Se obtiene el fichero pdf seleccionado
$m = $_POST["pdf_check" . $i];
// Se comprueba si ste se puede leer
$desc_read = fopen($_POST["url" . $i . "-" . $m], "rb");
if ($desc_read == false)
$checked = -1;
else {
$checked = $m;
fclose($desc_read);
}
}
// Bandera para saber si ya hay un fichero
// con el botn radio seleccionado
$marked = false;
while ($salir == false) {
$url = "";
// Caso en que el campo del fichero es de
// tipo texto y se encuentra en una web
if (isset($_POST["url" . $i . "-" . $k]) &&
($_POST["url" . $i . "-" . $k] != ""))
{
// En caso de que se haya cambiado el contenido del
// campo, se realizan las comprobaciones pertinentes
if (stripslashes($_POST["url" . $i . "-" . $k]) !=
stripslashes($_POST["campos_def" .
$i . "-" . $j . "-" . $k . "-0"]))
{
// Comprobacin de que se puede leer dicha direccin
$desc_read = fopen(stripslashes($_POST["url" .
$i . "-" . $k]), "rb");
if ($desc_read == true) {
// Se actualiza la direccin del fichero
$campos_def[$i][$j][$k-$bad][0] =
stripslashes($_POST["url" . $i .
"-" . $k]);
// Se actualiza el porcentaje
$campos_def[$i][$j][$k-$bad][1] = 0;
if (isset($_POST["pdf_check".$i])) {
if (($checked == $k) ||
(($marked == false) &&
($checked == -1)))
{
123
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$mark[$i][$j][$k-$bad] = 1;
$marked = true;
}
else
$mark[$i][$j][$k-$bad] = 0;
}
fclose($desc_read);
}
// Si no se puede leer, se incrementa el
// contador de direcciones errneas
else {
echo "mierda";
$bad++;
}
}
// En caso de que no se haya cambiado nada, se
// procede a la copia directa de la informacin
else {
// Se actualiza la direccin del fichero
$campos_def[$i][$j][$k-$bad][0] =
stripslashes($_POST["campos_def".
$i . "-" . $j . "-" . $k . "-0"]);
if (isset($_POST["pdf_check" . $i])) {
if (($checked == $k) ||
(($marked == false) && ($checked == -1)))
{
$mark[$i][$j][$k-$bad] = 1;
$marked = true;
}
else
$mark[$i][$j][$k-$bad] = 0;
}
// Se actualiza el porcentaje
$campos_def[$i][$j][$k-$bad][1] =
$_POST["campos_def". $i . "-" .$j . "-" . $k . "-1"];
}
}
// Caso en que el campo del fichero es
// de tipo texto y ste est en blanco
else if (isset($_POST["url" . $i . "-" . $k]) &&
($_POST["url" . $i . "-" . $k] == ""))
{
$bad++;
}
// Caso en que el campo del fichero es de
// tipo fichero y se encuentra en blanco
else if (isset($_FILES["url" . $i . "-" . $k]))
$bad++;
// Caso en que no hay ms ficheros
else
$salir = true;
$k++;
}
if (!isset($campos_def[$i][$campo_def_add['pdf']])) {
$campos_def[$i][$campo_def_add['pdf']][0][0] = "";
$campos_def[$i][$campo_def_add['pdf']][0][1] = "";
}
}
// El campo de entrada terminada (finished) se ha
// de obtener de otro campo oculto
else if ($j == $campo_def_add["finished"])
if (isset($_POST["finished" . $i]))
$campos_def[$i][$j] = 1;
else
$campos_def[$i][$j] = 0;
124
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
else {
$campos_def[$i][$j] = $_POST["field" . $i . "-" . $j];
}
$j++;
}
$i++;
$j = 0;
}
// Solamente se procesan los datos de las entradas
// que el usuario desea aadir, las dems se eliminan
for ($i=0; $i<count($campos_def); $i++)
if (isset($_POST["nondesired" . $i]))
$campos_def = elimina_entrada($campos_def, $i);
// Se procede a buscar en los directorios aquellas entradas
// que anteriormente dieron errores debido a la referencia
if (is_array($dirs)) {
if (isset($pubs_mod) && ($pubs_mod[0] != "")) {
for ($i=0; $i<count($pubs_mod); $i++) {
// Obtencin de la posicin de la referencia
$ref_ind = 0;
$tab_ind = $campos_def[$pubs_mod[$i]][$campo_def_add["tabla"]];
while ($campos_tablas[$tab_ind][$ref_ind] != "reference")
$ref_ind++;
$ref_ind += $def_offset;
$path = 0;
$percent = 1;
busca_publicacion_dir($dirs,
$campos_def[$pubs_mod[$i]][$ref_ind], $pubs_file,
$campos_def[$pubs_mod[$i]][$campo_def_add["pdf"]]);
}
}
}
// Se procede a procesar las entradas completas
$mostrado = false;
for ($i=0; $i<count($campos_def); $i++) {
flush();
ob_flush();
if ($campos_def[$i][$campo_def_add["finished"]] == 1) {
$mostrado = true;
if (procesa_entrada($campos_def[$i], $campo_def_add, $campos_tablas,
$tipo_publicacion, $autores_grupo, $id, $letra))
{
if (!isset($_POST["req_pdf".$i]))
{
if (isset($campos_def[$i][$campo_def_add["pdf"]]))
{
if (isset($_POST["pdf_check" . $i]))
$ind = $_POST["pdf_check" . $i];
else
$ind = 0;
if ($campos_def[$i][$campo_def_add["pdf"]][$ind][0] != "")
{
inserta_pdf($campos_def[$i][$campo_def_add["pdf"]][$ind][0],
$log_file,
$tipo_publicacion[$campos_def[$i][$campo_def_add["tabla"]]],
$id);
}
}
}
}
if (isset($delete))
$delete[count($delete)] = $i;
else
125
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$delete[0] = $i;
}
}
// Se borran las entradas ya procesadas
for ($i=(count($delete)-1); $i>=0; $i--)
$campos_def = elimina_entrada($campos_def, $delete[$i]);
// Se procede a la copia de los ficheros
$desc_read = fopen($log_file, "r");
if ($desc_read != false) {
// Obtencin del contenido del fichero
while (!feof($desc_read))
$content .= fread($desc_read, 8192);
fclose($desc_read);
if (trim($content) != "")
print "\n\t\t<script type=\"text/javascript\"> " .
"Abrir_Ventana('http://localhost/groupweb/proc_files.php', " .
"'600', '200') </script>\n";
}
if ($mostrado == true)
echo "\t\t<br /><br />\n";
}
echo "\t\t<script type=\"text/javascript\"> " .
"document.getElementById(\"progress\").style.display = 'none'</script>\n";
// Se procede a examinar las entradas disponibles para
// eliminar las ya existentes en la base de datos
for ($i=(count($campos_def)-1); $i>-1; $i--) {
$sentencia_SQL = crea_orden_sql($campos_def[$i], $campo_def_add,
$campos_tablas);
$query_sql = "SELECT title, reference FROM " .
$campos_def[$i][$campo_def_add["tabla"]];
$resultado = mysql_query($query_sql);
$num_refs = 0;
// Si la entrada ya existe en la base de datos
// se procede a su borrado de la tabla $campos_def
if (busca_entrada_similar($resultado, $campos_def[$i], $campo_def_add,
$campos_tablas, $num_refs))
{
$campos_def = elimina_entrada($campos_def, $i);
}
}
// Si existen entradas en la tabla $campos_def ha de
// presentarse nuevamente el formulario
if (count($campos_def) > 0) {
set_form($formulario);
abre_formulario();
// Si todava existen entradas incompletas en $campos_def,
// se muestran de nuevo los resultados por pantalla
imprime_resultados($campos_def, $campo_def_add, $campos_tablas,
$mensajes_error, $mark);
// Se envan los campos ocultos que se enviaban inicialmente
for ($i=0; $i<count($nombre_tablas); $i++) {
echo "\t\t\t<input type='hidden' name='tabla" . $i . "' value=\"" .
$nombre_tablas[$i] . "\" />\n";
echo "\t\t\t<input type='hidden' name='fichero" . $i . "' value=\"" .
$nombre_ficheros[$i] . "\" />\n";
}
for ($i=0; $i<count($campos_update); $i++)
for ($j=0;$j<count($campos_update[$i]);$j++)
echo "\t\t\t<input type='hidden' name='campo" . $i . "-" .
$j . "' value=\"" . $campos_update[$i][$j] . "\" />\n";
for ($i=0; $i<count($separador_campo); $i++)
echo "\t\t\t<input type='hidden' name='separador_campo" . $i .
"' value=\"" . $_POST["separador_campo" . $i] . "\" />\n";
for ($i=0; $i<count($separador_campo); $i++)
126
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
echo "\t\t\t<input type='hidden' name='separador_linea" . $i .
"' value=\"" . $_POST["separador_linea" . $i] . "\" />\n";
// Se ha de pasar la lista de urls ...
for ($i=0; $i<count($urls); $i++)
echo "\t\t\t<input type='hidden' name='url" . $i . "' value=\"" .
$urls[$i] . "\" />\n";
// ... as como la lista de urls
for ($i=0; $i<count($dirs); $i++)
echo "\t\t\t<input type='hidden' name='dir" . $i . "' value=\"" .
stripslashes($dirs[$i]) . "\" />\n";
// FORMULARIO nos permitir discernir si se trata de un redireccionamiento
// a la propia pgina o es la primera vez que se llega a ella
echo "\t\t\t<input type='hidden' name='formulario' value=\"" .
$formulario . "\" />\n";
// ERRORES nos indica la cantidad de variables que hay que comprobar, esto
// es, el n de mini-formularios creados para cada publicacin no reconocida
echo "\t\t\t<input type='hidden' name='errores' value=\"" .
$n_errores . "\" />\n";
// Envo del array $campos_def
for ($i=0; $i<count($campos_def); $i++) {
for ($j=0; $j<count($campos_def[$i]); $j++) {
if (!is_array($campos_def[$i][$j]))
echo "\t\t\t<input type='hidden' name='campos_def" . $i . "-" .
$j . "' value=\"" . $campos_def[$i][$j] . "\" />\n";
else {
for ($k=0; $k<count($campos_def[$i][$j]); $k++) {
if (!is_array($campos_def[$i][$j][$k]))
echo "\t\t\t<input type='hidden' name='campos_def" . $i .
"-" . $j . "-" . $k . "' value=\"" .
$campos_def[$i][$j][$k] . "\" />\n";
else {
for ($m=0; $m<count($campos_def[$i][$j][$k]); $m++) {
echo "\t\t\t<input type='hidden' name='campos_def" .
$i . "-" . $j . "-" . $k . "-" . $m . "' value=\"" .
$campos_def[$i][$j][$k][$m] . "\" />\n";
}
}
}
}
}
}
echo "\t\t\t<input type='submit' value='Volver al paso 3' />\n";
cierra_formulario();
}
// Si ya no quedan entradas incompletas en $campos_def,
// se muestra el mensaje de actualizacin con xito
else {
echo "\t\tActualizacin de la base de datos completada.<br></br>";
echo "Muchas gracias por su colaboracin.<br></br>\n";
}
cierra_pagina();
desconecta_db($conexion_mysql);
}
else {
echo "Error en el nombre de usuario o en la contrasea.<br />Por favor, " .
"vuelva a la pantalla de validacin.<br />";
echo "<a href=\"./update.html\">Pgina de validacin</a>";
}
?>
10.#.1.$ PROC2FILES .PHP
<?php
127
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
include "functions.step3.php";
set_time_limit (36000);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="imagetoolbar" content="no" />
<meta name="robots" content="noindex, nofollow" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Pragma" content="no-cache" />
<title>Barra progreso PHP/ PHP Progress bar</title>
</head>
<body>
<?php
// Nombre del fichero con la informacin de los pdfs a copiar
$log_file = "pdf_log.txt";
// Ruta de destino de los ficheros pdfs
$ruta = "./files/";
// Recuperacion de las rutas de los ficheros a partir del fichero pdf_log.txt
$desc_read = fopen($log_file, "r");
if ($desc_read == FALSE)
$read = false;
else {
// Obtencin del contenido del fichero de log
while (!feof($desc_read)) {
// Obtencin del contenido de la direccin
$log_content = fread($desc_read, 8192);
}
fclose($desc_read);
}
// Separacin de la informacin de cada fichero en lneas => $linea
$tok = strtok($log_content, "\n");
$i = 0;
while ($tok !== false) {
$linea[$i] = $tok;
$tok = strtok("\n");
$i++;
}
// Se realiza una iteracin por cada fichero que se ha de copiar
$i=0;
while ($i < count($linea)) {
// Extraccin de la informacin de cada lnea
$n_tok = 0;
$tok = strtok($linea[$i], "\t");
while ($tok !== false) {
// 1er campo: Ruta del fichero pdf
if ($n_tok == 0)
{
// URL del fichero
$urls[$i] = $tok;
// Tamao del fichero
$size[$i] = sprintf("%.2f", (trim(remote_file_size($urls[$i])))/1024);
if ($size[$i] == "0.00") {
$size[$i] = sprintf("%.2f", (trim(filesize($urls[$i])))/1024);
}
// Eliminacin de las barras invertidas
if (strpos($urls[$i], "\\") !== false)
$nombres[$i] = substr($urls[$i], strrpos($urls[$i], "\\"));
else if (strpos($urls[$i], "/") !== false)
$nombres[$i] = str_replace("%20", " ", substr($urls[$i],
strrpos($urls[$i], "/") + 1));
$n_tok++;
}
128
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// 2 y 3er campos: Tipo de publicacin e id del fichero
else if ($n_tok != 0)
{
$pub_type = $tok;
$tok = strtok("\t");
$id = $tok;
// Si existen el tipo de publicacin y la id de la entrada de
// la base de datos, se calcula la ruta del fichero
if (($pub_type !== false) && ($id !== false))
$ruta_fichero[$i] = $ruta . "t" . trim($pub_type) .
"i" . trim($id) . ".pdf";
// Si no, entonces se borra la entrada de la tabla de $urls
else
for ($j=$i; $j<(count($linea[$i])-1); $j++)
$linea[$j] = $linea[$j+1];
}
}
$i++;
}
// Impresin de los divs que mostrarn los progresos
echo "<div id='info_file' style='margin:20px 0px 0px 0px;position:relative;" .
"padding:0px;width:550px;height:30px;left:25px;'></div>\n";
echo "<div id='file_progress' style='position:relative;padding:0px;width:" .
"512px;height:27px;left:25px;" .
"background-image:url(images/pbar_background.gif)'></div>\n";
echo "<div id='info_total' style='margin:20px 0px 0px 0px;position:relative;" .
"padding:0px;width:550px;height:30px;left:25px;'></div>\n";
echo "<div id='total_progress' style='position:relative;padding:0px;width:" .
"512px;height:27px;left:25px;" .
"background-image:url(images/pbar_background.gif)'></div>\n";
$max_bars = 250; // Mximo n de barras que se mostrarn
$total_transferred = 0; // Tamao total transferido
$count_bars = 0;
$read_size = 8192; // Tamao del bloque de lectura
$read_sizeKB = $read_size/1024; // Tamao del bloque de lectura en KB
$error = false;
$totalbar_size = array_sum($size)/$max_bars;
// Se muestra el total de KB a transferir
echo "<script type=\"text/javascript\"> document.getElementById" .
"(\"info_total\").innerHTML = \"Total a transferir: " . array_sum($size) .
"KB\" </script>\n";
// Para cada fichero se realiza una iteracin
// y se muestra el porcentaje de avance
for ($i=0; $i<count($nombres); $i++) {
$bar_size = $size[$i]/$max_bars;
$filesize_transferred = 0;
// Apertura del flujo de lectura
$desc_read = fopen($urls[$i], "rb");
if ($desc_read == false)
$error = true;
else {
// Apertura del flujo de escritura
$desc_write = fopen($ruta_fichero[$i], "wb");
if ($desc_write == false)
$error = true;
else {
// Se muestra el texto de progreso
echo "<script type=\"text/javascript\"> document.getElementById" .
"(\"info_file\").innerHTML = \"Copiando el fichero &quot;" .
$nombres[$i] . "&quot; [" . $size[$i] . " KB]\" </script>\n";
while (!feof($desc_read)) {
$pdf_content = fread($desc_read, $read_size);
fwrite($desc_write, $pdf_content);
// Actualizacin de la barra de progreso del fichero que se est
// copiando
129
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$filesize_transferred += strlen($pdf_content)/1024;
$num_bars = sprintf("%.0d", $filesize_transferred/$bar_size);
$bars = "<div style='float:left;margin:6px 0px 0px 6px;width:" .
($num_bars*2) . "px;height:12px;background:red;color:red;'> </div>";
echo "<script type=\"text/javascript\"> " .
"document.getElementById(\"file_progress\").innerHTML = \"" .
$bars . "\" </script>\n";
// Actualizacin de la barra de progreso del tamao total que se ha de
// transferir
$total_transferred += strlen($pdf_content)/1024;
$num_bars = sprintf("%.0d", $total_transferred/$totalbar_size);
$bars = "<div style='float:left;margin:6px 0px 0px 6px;width:" .
($num_bars*2) . "px;height:12px;background:red;color:red;'> </div>";
echo "<script type=\"text/javascript\"> " .
"document.getElementById(\"total_progress\").innerHTML = \"" .
$bars . "\" </script>\n";
flush();
ob_flush();
}
fclose($desc_read);
fclose($desc_write);
}
}
}
// Una vez copiados todos los ficheros, se procede a
// borrar el contenido del fichero de logeado de pdfs
$desc_write = fopen($log_file, "w");
if ($desc_write != false)
fclose($desc_write);
// Se retrasa 2 segundos el cierre de la ventana
sleep(2);
echo "<script type='text/javascript'> window.close() </script>\n";
?>
10.#.1.& BAC-UP .PHP
<?php
include "functions.inc.php";
// Cambiamos el tiempo mximo de respuesta,
// porque hay que buscar el fichero "mysqldump"
ini_set("max_execution_time", "600");
// No se reporta ningn tipo de error
//error_reporting(0);
session_start();
?>
<html>
<head>
<script type="text/javascript">
function resize()
{
var width = window.screen.width;
var height = window.screen.availHeight;
var left = (parseInt(width) - 650)/2;
document.getElementById("table_div").style.left = left;
document.getElementById("table_div").style.top = 100;
}
</script>
</head>
<body>
<div id="table_div" name="table_div" style="position:absolute;width:610px;">
<?php
130
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$conexion_mysql =& conecta_db(); // Conexin con la base de datos
if (isset($_POST['login']) && isset($_POST['pass'])) {
$login = $_POST['login'];
$pass = $_POST['pass'];
$_SESSION['login'] = $login;
$_SESSION['pass'] = $pass;
}
else if (isset($_SESSION['login']) && isset($_SESSION['pass'])) {
$login = $_SESSION['login'];
$pass = $_SESSION['pass'];
}
if (($login != "") && ($pass != "")) {
if (valida_usuario($login, $pass)) {
// Obtener el root (C:/ en el caso de Windows o
// ./ en el caso de Linux)
$php_dir = str_replace("\\", "/", getcwd());
$dir = getcwd();
chdir('../');
$new_dir = getcwd();
while ($dir != $new_dir) {
$dir = $new_dir;
chdir('../');
$new_dir = getcwd();
}
$root = str_replace("\\", "/", $new_dir);
// Buscamos el fichero "mysqldump" en la
// ruta almacenada en el fichero de logeo
chdir($php_dir);
$dump_file = "dump_path.log";
$dump_path = "";
$dont_exists = false;
if (file_exists($dump_file)) {
if (($handler = fopen($dump_file, "r")) != false) {
$content = fread($handler, filesize($dump_file));
if ($content != "") {
if (file_exists($content)) {
$dump_path = $content;
}
else {
$dont_exists = true;
}
}
else {
$dont_exists = true;
}
}
else {
$dont_exists = true;
}
}
else {
$dont_exists = true;
}
// Si el fichero de logeo no existe, o no contiene
// una ruta vlida, se busca el fichero
if ($dont_exists == true) {
$found = false;
$path = $root;
$filename = array("Linux" => "mysqldump",
"WINNT" => "mysqldump.exe");
seek_file($path, $filename, $found);
$dump_path = $path;
if ($found == true) {
$dump_path = $path . "/" . $filename[PHP_OS];
chdir($php_dir);
131
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
if (($handler = fopen($dump_file, "w")) != false)
fwrite($handler, $dump_path);
$dont_exists = false;
}
}
// Si se ha encontrado el fichero se procede a mostrar
// el contenido de la pgina en funcin del botn pulsado
if ($dont_exists == false) {
// Caso de crear nueva copia de seguridad.
// Simplemente se informa de la creacin.
if (isset($_POST['create_backup'])) {
// Obtencin de la hora y la fecha
$hora = date("H.i.s");
$fecha = date("d-m-Y");
// Comprobacin de la existencia del directorio de backup
chdir($php_dir);
if (!file_exists("./db_backup/"))
mkdir("./db_backup");
chdir($php_dir . "/db_backup/");
// Creacin del registro del contenido del directorio de pdfs
if ($dir_handler = opendir($php_dir . "/files/")) {
if ($log_handler = fopen("pdf_" . $hora .
"_" . $fecha . ".log", "w"))
{
while (($res = readdir($dir_handler)) !== false)
{
if (is_file($php_dir . "/files/" . $res)) {
fwrite($log_handler, $res . "\n");
}
}
fclose($log_handler);
}
closedir($dir_handler);
}
chdir($dump_dir);
// Sustituir aqu el nombre de usuario, la clave y el nombre de la
// base de datos
exec("mysqldump --user=nombre_usuario --password=clave " .
"--add-drop-table base_datos > " . $php_dir . "/db_backup/" .
"backup_" . $fecha . "_" . $hora . ".sql");
if (file_exists($php_dir . "/db_backup/" .
"backup_" . $fecha . "_" . $hora . ".sql"))
{
echo "\t\t\tCreada copia de seguridad con hora " .
str_replace(".", ":", $hora) . " el da " .
str_replace("-", "/", $fecha) . " en el fichero " .
"backup_" . $fecha . "_" . $hora . ".sql<br />\n";
echo "\t\t\tVolver a la <a href=\"./update.html\">" .
"pgina principal</a>.\n";
}
}
// Caso de restauracin de copia de seguridad.
// Se muestra una tabla con todas las copias existentes.
else if (isset($_POST['restore_backup']) || isset($_POST['restore'])
|| isset($_POST['delete']))
{
// Caso de haber seleccionado una copia de seguridad
// para restauracin en el caso anterior.
if (isset($_POST['restore'])) {
chdir(dirname($dump_path));
// Sustituir aqu el nombre de usuario, la clave y el nombre de la
// base de datos
passthru("mysql --user=nombre_usuario --password=clave " .
"base_datos < " . str_replace("/", "\\", $php_dir) .
"\db_backup\\" . $_POST['filename']);
132
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// Caso de haber marcado la casilla de actualizacin
// de directorio contenedor de los ficheros pdf
if (isset($_POST['update_pdf'])) {
// Lectura del contenido del fichero de registro de pdfs
$content = "";
$pdf_log_name = str_replace("backup", "pdf",
$_POST['filename']);
$pdf_log_name = str_replace(".sql", ".log",
$pdf_log_name);
if ($log_handler = fopen($php_dir . "/db_backup/" .
$pdf_log_name, "r"))
{
while (!feof($log_handler))
$content .= fread($log_handler, 8192);
fclose($log_handler);
}
// Apertura del directorio de pdfs para lectura
if ($dir_handler = opendir($php_dir . "/files/")) {
while (($res = readdir($dir_handler)) !== false)
if (is_file($php_dir . "/files/" . $res))
// Si el fichero que est siendo ledo no se encuentra
// en el fichero de registro, entonces debe borrarse
if (stripos($content, $res) === false)
unlink($php_dir . "/files/" . $res);
closedir($dir_handler);
}
}
}
// Caso de haber seleccionado una
// copia de seguridad para ser borrada.
if (isset($_POST['delete'])) {
if (file_exists($php_dir . "/db_backup/" . $_POST['filename']))
unlink($php_dir . "/db_backup/" . $_POST['filename']);
$pdf_log_name = str_replace("backup", "pdf", $_POST['filename']);
$pdf_log_name = str_replace(".sql", ".log", $pdf_log_name);
if (file_exists($php_dir . "/db_backup/" . $pdf_log_name))
unlink($php_dir . "/db_backup/" . $pdf_log_name);
}
chdir($php_dir . "/db_backup/");
if ($handler = opendir('.')) {
$found = false;
echo "\t\t\t<form action=\"backup.php\" method=\"post\">\n";
echo "\t\t\t\t<input type=\"hidden\" id=\"filename\" " .
"name=\"filename\" value=\"\" />\n";
echo "\t\t\t\t<table border=1>\n";
echo "\t\t\t\t\t<thead style=\"background-color:silver;\">\n";
echo "\t\t\t\t\t\t<tr>\n";
echo "\t\t\t\t\t\t\t<th>Fecha</th>\n";
echo "\t\t\t\t\t\t\t<th>Hora</th>\n";
echo "\t\t\t\t\t\t\t<th colspan=\"3\"></th>\n";
echo "\t\t\t\t\t\t</tr>\n";
echo "\t\t\t\t\t</thead>\n";
echo "\t\t\t\t\t<tbody>\n";
while (($res = readdir($handler)) !== false) {
$found = true;
$parts = pathinfo($res);
if (is_file($res) && ($parts["extension"] == "sql")) {
$tok = explode("_", $res);
$fecha = str_replace("-", "/", $tok[1]);
$hora= str_replace(".", ":", str_replace(".sql", "", $tok[2]));
echo "\t\t\t\t\t\t<tr>\n";
echo "\t\t\t\t\t\t\t<td width=\"90\" valign=\"center\" " .
"align=\"center\">\n";
echo "\t\t\t\t\t\t\t\t" . $fecha . "\n";
echo "\t\t\t\t\t\t\t</td>\n";
133
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
echo "\t\t\t\t\t\t\t<td width=\"70\" valign=\"center\" " .
"align=\"center\">\n";
echo "\t\t\t\t\t\t\t\t" . $hora . "\n";
echo "\t\t\t\t\t\t\t</td>\n";
echo "\t\t\t\t\t\t\t<td width=\"110\" valign=\"center\" " .
"align=\"center\">\n";
echo "\t\t\t\t\t\t\t\t<input type=\"submit\" id=\"restore\" " .
"name=\"restore\" value=\"Restaurar copia\" " .
"onclick=\"document.getElementById('filename').value = " .
"'" . $res . "';\" />\n";
echo "\t\t\t\t\t\t\t</td>\n";
echo "\t\t\t\t\t\t\t<td width=\"90\" valign=\"center\" " .
"align=\"center\">\n";
echo "\t\t\t\t\t\t\t\t<input type=\"submit\" id=\"delete\" " .
"name=\"delete\" value=\"Borrar copia\" " .
"onclick=\"document.getElementById('filename').value = " .
"'" . $res . "';\" />\n";
echo "\t\t\t\t\t\t\t</td>\n";
echo "\t\t\t\t\t\t\t<td width=\"200\">\n";
echo "\t\t\t\t\t\t\t\t<input type=\"checkbox\" " .
"name=\"update_pdf\" value=\"1\" />\n";
echo "\t\t\t\t\t\t\t\t<label for=\"update_pdf\">" .
"Actualizar directorio de pdfs</label>\n";
echo "\t\t\t\t\t\t\t</td>\n";
echo "\t\t\t\t\t\t</tr>\n";
}
}
if ($found) {
echo "\t\t\t\t\t\t<tr>\n";
echo "\t\t\t\t\t\t\t<td colspan=\"5\">\n";
echo "\t\t\t\t\t\t\t\tNOTAS IMPORTANTES:\n";
echo "\t\t\t\t\t\t\t\t<ul>\n";
echo "\t\t\t\t\t\t\t\t\t<li>\n";
echo "\t\t\t\t\t\t\t\t\t\tUna vez que se proceda con la " .
"restauracin de una copia de seguridad y el resultado" .
"sea el deseado, procdase al borrado de las copias de" .
"seguridad posteriores a fin de evitar conflictos en " .
"futuro.\n";
echo "\t\t\t\t\t\t\t\t\t</li>\n";
echo "\t\t\t\t\t\t\t\t\t<li>\n";
echo "\t\t\t\t\t\t\t\t\t\tLa casilla \"Actualizar " .
"directorios\" utiliza un registro de seguridad para " .
"eliminar los ficheros pdfs aadidos con posterioridad " .
"a la copia de seguridad a restaurar. Se recomienda " .
"restaurar la copia primero con la casilla " .
"deseleccionada, y en caso de resultar exitosa la " .
"restauracin, proceder entonces restaurarla " .
"nuevamente con la casilla marcada, y por ltimo, " .
"eliminar las copias de seguridad posteriores.\n";
echo "\t\t\t\t\t\t\t\t\t</li>\n";
echo "\t\t\t\t\t\t\t\t</ul>\n";
echo "\t\t\t\t\t\t\t</td>\n";
echo "\t\t\t\t\t\t</tr>\n";
}
echo "\t\t\t\t\t</tbody>\n";
echo "\t\t\t\t</table>\n";
echo "\t\t\t</form>\n";
}
// Se muestra el mensaje de la restauracin de
// copia de seguridad cuando corresponda.
if (isset($_POST['restore'])) {
echo "\t\t\tRestaurada copia de seguridad <b>" .
$_POST['filename'] . "</b>.<br />\n";
if (isset($_POST['update_pdf']))
echo "\t\t\tActualizado sistema de archivos pdfs.<br />\n";
134
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
echo "\t\t\tVolver a la <a href=\"./update.html\">pgina " .
"principal</a>.<br />\n";
}
// Se muestra el mensaje del borrado de
// copia de seguridad cuando corresponda.
if (isset($_POST['delete'])) {
echo "\t\t\tBorrada copia de seguridad <b>" .
$_POST['filename'] . "</b>.<br />\n";
echo "\t\t\tVolver a la <a href=\"./update.html\">" .
"pgina principal</a>.<br />\n";
}
}
}
}
// Caso de que el usuario no est validado correctamente se notifica por
// pantalla
else {
echo "El nombre de usuario y/o la contrasea introducido/s no son " .
"vlidos.\n<br />";
echo "<a href=\"./update.html\">Volver a la pgina de validacin</a>";
}
}
else {
echo "El nombre de usuario y/o la contrasea introducido/s no son " .
"vlidos.\n<br />";
echo "<a href=\"./update.html\">Volver a la pgina de validacin</a>";
}
?>
</div>
<script type="text/javascript"> resize(); </script>
</body>
</html>
10.#.1., PUBS 2EDITOR.PHP
<?php
include "functions.inc.php";
// Cambiamos el tiempo mximo de respuesta,
// porque hay que buscar el fichero "mysqldump"
ini_set("max_execution_time", "600");
// No se reporta ningn tipo de error
//error_reporting(0);
session_start();
?>
<html>
<head>
</head>
<body>
<div id="table_div" name="table_div">
<?php
// Validacin de usuario
$conexion_mysql =& conecta_db(); // Conexin con la base de datos
if (isset($_POST['login_pubs']) && isset($_POST['pass_pubs'])) {
$login = $_POST['login_pubs'];
$pass = $_POST['pass_pubs'];
$_SESSION['login'] = $login;
$_SESSION['pass'] = $pass;
}
else if (isset($_SESSION['login']) && isset($_SESSION['pass'])) {
$login = $_SESSION['login'];
$pass = $_SESSION['pass'];
}
if (($login != "") && ($pass != "")) {
135
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
if (valida_usuario($login, $pass)) {
// Si el usuario entra por primera vez, entonces se muestra
// el editor con el contenido del fichero de definiciones
if (!isset($_POST["update_pubs"])) {
// Obtencin del contenido del fichero
$h_file = fopen("pubs.txt", "r");
$content = "";
while (!feof($h_file)) {
$content .= fread($h_file, 8192);
}
fclose($h_file);
// Mensaje de bienvenida
echo "\t\t\t<h2>Fichero de definicin de publicaciones:</h2><br />\n";
// Explicacin de las partes de una definicin
echo "\t\t\tEste fichero contiene las definiciones de las " .
"publicaciones, que incluyen los siguientes componentes por " .
"publicacin:<br />\n";
echo "\t\t\t<ul>\n";
echo "\t\t\t\t<li>\n";
echo "\t\t\t\t\t1 lnea: Comentario precedido por \"//\" que " .
"especifica el nombre completo de la publicacin.\n";
echo "\t\t\t\t</li>\n";
echo "\t\t\t\t<li>\n";
echo "\t\t\t\t\t2 lnea: Acrnimo o abreviatura de la publicacin, " .
"seguido de \";\" y un tabulador, tras lo cual siguen las palabras " .
"claves que se utilizarn para determinar la publicacin separadas " .
"por tabuladores.\n";
echo "\t\t\t\t</li>\n";
echo "\t\t\t</ul>\n";
// Explicacin de los grupos de definiciones
echo "\t\t\tExisten dos grupos definidos para cada tipo de publicacin:"
. "<br />\n";
echo "\t\t\t<ul>\n";
echo "\t\t\t\t<li>\n";
echo "\t\t\t\t\tLas publicaciones del tipo \"revista\" o \"journal\" " .
"se incluirn tras el identificador \"::JOURNALS\".\n";
echo "\t\t\t\t</li>\n";
echo "\t\t\t\t<li>\n";
echo "\t\t\t\t\tLas publicaciones del tipo \"ponencia en congreso\" " .
"se incluirn tras el identificador \"::CONGRESS\".\n";
echo "\t\t\t\t</li>\n";
echo "\t\t\t</ul>\n";
// Consejos de edicin
echo "\t\t\tConsejos:"
. "<br />\n";
echo "\t\t\t<ul>\n";
echo "\t\t\t\t<li>\n";
echo "\t\t\t\t\tAntes de incluir una publicacin asegrese de que ".
"realmente no se encuentra incluida en la lista existente.\n";
echo "\t\t\t\t</li>\n";
echo "\t\t\t\t<li>\n";
echo "\t\t\t\t\tTenga cuidado con las modificaciones que realice, " .
"pues el fichero de definiciones de publicaciones se actualizar " .
"con el contenido final que usted indique.\n";
echo "\t\t\t\t</li>\n";
echo "\t\t\t\t<li>\n";
echo "\t\t\t\t\tAbstngase de incluir preposiciones, artculos, " .
"conjunciones, etc. en las palabras claves. Incluya solamente las " .
"palabras que mejor definan la publicacin (sin tildes y en " .
"minsculas).\n";
echo "\t\t\t\t</li>\n";
echo "\t\t\t</ul>\n";
// Formulario con el editor
echo "\t\t\t<form id=\"editor_form\" name=\"editor_form\" " .
"method=\"post\" action=\"pubs_editor.php\"\n";
136
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
echo "\t\t\t\t<textarea id=\"pubs_content\" name=\"pubs_content\" " .
"cols=\"120\" rows=\"30\">" . $content . "</textarea>\n";
echo "\t\t\t\t<input type=\"submit\" id=\"update_pubs\" " .
"name=\"update_pubs\" " .
"value=\"Actualizar fichero de definiciones\" />\n";
echo "\t\t\t</form>";
}
// Si no es la primera vez que se visita la pgina,
// entonces se ha de actualizar el fichero de definiciones
else {
$h_file = fopen("pubs.txt", "w");
if (fwrite($h_file, $_POST["pubs_content"]) === FALSE) {
echo "\t\t\tNo se puede escribir en el archivo de definiciones.";
}
else
echo "\t\t\tFichero de definiciones actualizado con xito.\n";
}
}
// Caso de que el usuario no est validado correctamente
// se notifica por pantalla
else {
echo "El nombre de usuario y/o la contrasea introducido/s no son " .
"vlidos.\n<br />";
echo "<a href=\"./update.html\">Volver a la pgina de validacin</a>";
}
}
else {
echo "El nombre de usuario y/o la contrasea introducido/s no son " .
"vlidos.\n<br />";
echo "<a href=\"./update.html\">Volver a la pgina de validacin</a>";
}
?>
</div>
</body>
</html>
10.#.1.. FUNCTIONS .INC.PHP
<?php
// Estas variables se utilizan para indicar campos que se facilitan en el fichero
// de actualizacin y que no existen como tales en la tabla, es decir, que
// requieren de un procesado posterior
$lista_campos_adicionales = array('autores', 'supervisores');
$tabla_campos_adicionales = array('all', 'phds');
$var_campos_adicionales = array('authors', 'supervisors');
// Estas variables se utilizan para que el usuario seleccione un valor, pues no
// se facilitan en el fichero de actualizacin
$lista_campos_undef = array('separador campos', 'separador filas',
'separador autores', 'separador supervisores', 'tipo de libro');
$tabla_campos_undef= array('all', 'all', 'all', 'phds', 'books');
$var_campos_undef = array('separador_campo', 'separador_linea',
'separador_autor', 'separador_super', 'tipo_libro');
$valores_campos_undef = array(
$lista_campos_undef[0] => array (0,1,2,3,4,5,6,7),
$lista_campos_undef[1] => array (0,1,2,3,4,5,6,7),
$lista_campos_undef[2] => array (0,1,2,3,4,5,6,7),
$lista_campos_undef[3] => array (0,1,2,3,4,5,6,7),
$lista_campos_undef[4] => array ("1","2"));
$desc_campos_undef = array(
$lista_campos_undef[0] => array ("\\n","\\r","\\r\\n","\\t",";",":",",","."),
$lista_campos_undef[1] => array ("\\n","\\r","\\r\\n","\\t",";",":",",","."),
$lista_campos_undef[2] => array ("\\n","\\r","\\r\\n","\\t",";",":",",","."),
$lista_campos_undef[3] => array ("\\n","\\r","\\r\\n","\\t",";",":",",","."),
137
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$lista_campos_undef[4] => array ("Libro","Actas"));
//************************************************************************
// CONECTA_DB: realiza la conexin con la base de datos.
// Entrada: - Ninguna
// Salida: - Identificador de la conexin con la base de datos => $conexion
//************************************************************************
function &conecta_db() {
// Conexin con el servidor MySQL
// El usuario deber modificar estos datos para acceder correctamente
$host = "nombre_host";
$user = "nombre_de_usuario";
$pass = "clave_de_usuario";
$db = "base_datos";
$conexion = mysql_connect($host, $user, $pass);
if (!$conexion) {
die("No se pudo conectar con la base de datos: " . mysql_error());
}
// Conexin con la base de datos
mysql_select_db("groupweb") or die("Error: " . mysql_error());
return $conexion;
}
//************************************************************************
// DESCONECTA_DB: realiza la desconexin con la base de datos
// Entrada: - Identificador de la conexin con la base de datos => $conexion
// Salida: - Ninguna
//************************************************************************
function desconecta_db(&$conexion) {
mysql_close($conexion);
}
//*******************************************************************
// LIBERA_RECURSO: realiza la liberacin de los recursos
// Entrada: - Identificador del recurso de la base de datos => $recurso
// Salida: - Ninguna
//*******************************************************************
function libera_recurso($recurso) {
mysql_free_result($recurso);
}
//******************************************************************
// VALIDA_USUARIO: realiza la validacin del usuario introducido
// Entrada: - Login del usuario a validar => $login
// - Contrasea del mismo => $password
// Salida: - Bandera con valor TRUE si el usuario se valid con xito
// o FALSE en caso contrario => $validado
//******************************************************************
function valida_usuario($login, $password) {
$validado = FALSE;
$peticion_sql = "SELECT password FROM people WHERE login='" . $login . "'";
$resultado = mysql_query($peticion_sql) or die("Error, la consulta fall: "
. mysql_error());
while ($linea = mysql_fetch_array($resultado, MYSQL_ASSOC)) {
if ($linea["password"] == $password)
$validado = TRUE;
}
libera_recurso($resultado);
return $validado;
}
//**************************************************************************
// LISTA_TABLAS: almacena en un array todas las tablas existentes en la base
// de datos
138
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// Entrada: - Ninguna
// Salida: - Array con las tablas de la base de datos => $tablas_db
//**************************************************************************
function lista_tablas() {
$resultado = mysql_list_tables("groupweb");
$i = 0;
while ($i < mysql_num_rows ($resultado)) {
$tablas_db[$i] = mysql_tablename ($resultado, $i);
$i++;
}
libera_recurso($resultado);
return $tablas_db;
}
//*******************************************************************************
// INFO_CAMPOS: devuelve el tipo y el nombre de cada campo de cada una de las
// tablas de una base de
// datos contenidas en el array pasado
// Entrada: - Array con los nombres de las tablas de la base de datos => $tablas
// - Array para almacenar los tipos de los campos de cada tabla =>
// $tipo_campos
// - Array para almacenar los nombres de los campos de cada tabla =>
// $nombre_campos
// Salida: - Ninguna
//*******************************************************************************
function info_campos($tablas, &$tipo_campos, &$nombre_campos) {
$i = 0;
while ($i < count($tablas)) {
$resultado = mysql_query("SELECT * FROM " . $tablas[$i]);
$fields = mysql_num_fields($resultado);
$j = 0;
while ($j < $fields) {
$type = mysql_field_type ($resultado, $j);
$name = mysql_field_name ($resultado, $j);
$nombre_campos[$i][$j] = $name;
$tipo_campos[$i][$j] = $type;
$j++;
}
$i++;
}
libera_recurso($resultado);
}
//*******************************************************************************
// INFO_CAMPOS_ASOC: devuelve el tipo y el nombre de cada campo de cada una de
// las tablas de una base de datos contenidas en el array pasado, pero
// utilizando como ndices de la primera dimensin del array los nombres de
// las tablas
// Entrada: - Array con los nombres de las tablas de la base de datos => $tablas
// - Array para almacenar los tipos de los campos de cada tabla =>
// $tipo_campos
// - Array para almacenar los nombres de los campos de cada tabla =>
// $nombre_campos
// Salida: - Ninguna
//*******************************************************************************
function info_campos_asoc($tablas, &$tipo_campos, &$nombre_campos) {
$i = 0;
while ($i < count($tablas)) {
$resultado = mysql_query("SELECT * FROM " . $tablas[$i]);
$fields = mysql_num_fields($resultado);
$j = 0;
while ($j < $fields) {
$type = mysql_field_type ($resultado, $j);
$name = mysql_field_name ($resultado, $j);
$nombre_campos[$tablas[$i]][$j] = $name;
139
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$tipo_campos[$tablas[$i]][$j] = $type;
$j++;
}
$i++;
}
libera_recurso($resultado);
}
//***************************************************************************
// BORRA_DIR_TEMP: borra el contenido del directorio facilitado
// Entrada: - Ruta del directorio cuyo contenido se desea borrar => $directorio
// Salida: - Ninguna.
//***************************************************************************
function borra_dir_temp($directorio) {
$manejador = opendir($directorio);
$lista = "";
while ($fichero = readdir($manejador))
if(!is_dir($fichero) && !is_link($fichero))
unlink($directorio."\/".$fichero);
}
//*******************************************************************************
// BUSCA_APELLIDO_REG: busca el apellido de la referencia bibliogrfica de las
// personas registradas como usuarios del sitio web GROUPWEB
// Entrada: - Array con los nombres de los autores registrados en el sistema =>
// $nombres
// Salida: - Array con los primeros apellidos de los autores => $apellidos
//*******************************************************************************
function busca_apellido_reg ($nombres) {
for ($i=0;$i<count($nombres);$i++) {
$nombres[$i] = trim($nombres[$i]);
if ($apellido = strtok($nombres[$i], ",")) {
if (stripos($apellido, " ")) {
$salir = FALSE;
$apellido = strtok($nombres[$i], " ");
while (($apellido != FALSE) && ($salir != TRUE)) {
if (($apellido != "el") && ($apellido != "la") &&
($apellido != "los") && ($apellido != "las") &&
($apellido != "de") && ($apellido != "da") &&
($apellido != "del") &&
(stripos($apellido, ".") == FALSE)) {
$apellidos[$i] = strtolower(quita_tildes($apellido));
$salir = TRUE;
}
}
}
else
$apellidos[$i] = strtolower(quita_tildes($apellido));
} else {
$apellido = strtok($nombres[$i], " ");
$apellidos[$i] = strtolower(quita_tildes($apellido));
}
}
return $apellidos;
}
//******************************************************************************
// QUITA_TILDES: elimina las tildes y el carcter "" de la cadena pasada como
// argumento
// Entrada: - Cadena de caracteres a la que se desea quitar las tildes =>
// $cadena
// Salida: - Cadena sin tildes => $cadena
//******************************************************************************
function quita_tildes($cadena)
{
140
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$cadena = str_replace("", "a", $cadena);
$cadena = str_replace("", "e", $cadena);
$cadena = str_replace("", "i", $cadena);
$cadena = str_replace("", "o", $cadena);
$cadena = str_replace("", "u", $cadena);
$cadena = str_replace("", "n", $cadena);
return $cadena;
}
//*******************************************************************************
// BUSCA_APELLIDO_AUTOR: busca el primer apellido del autor pasado en la cadena
// $autor. Primero comprueba los autores registrados, que se encuentran en la
// tabla $apellidos_reg.
// Entrada: - Nombre del autor => $autor
// - Array con los apellidos de los autores registrados =>
// $apellidos_reg
// Salida: - Primer apellido del autor pasado => $reference
//*******************************************************************************
function busca_apellido_autor ($autor, $apellidos_reg) {
// La primera bsqueda es para los autores del grupo, que tienen
// su nombre bibliogrfico en la base de datos
$pos = -1;
$nombre_completo = quita_tildes(strtolower($autor));
for ($k=0;$k<count($apellidos_reg);$k++) {
$back = stripos(" " . $nombre_completo ,$apellidos_reg[$k]);
if ($back != FALSE)
$pos = $k;
}
if ($pos != - 1)
$reference = strtolower($apellidos_reg[$pos]);
// Si la bsqueda no ha tenido xito, es que el autor no
// pertenece al grupo. Se obtiene entonces el apellido.
else {
$palabra = strtok($nombre_completo, " ");
$k = -1;
// Insertamos en un array los nombres y apellidos
$nombre_completo = $nombre_completo . " ";
while ($palabra != FALSE) {
$k++;
$nombre[$k] = $palabra;
$palabra = strtok(" ");
}
// Buscamos una coma. Si sta existe en alguno de
// los campos, quiere decir que lo primero son los apellidos.
$coma = FALSE;
for ($k=0;$k<count($nombre);$k++) {
if (stripos($nombre[$k], ","))
$coma = TRUE;
}
if ($coma == TRUE) {
// Si existe coma, buscamos el primer
// apelllido que no se encuentre abreviado
$k = 0;
$encontrado = FALSE;
while (!$encontrado) {
if (stripos(" ".$nombre[$k], ".")) {
$k++;
} elseif (strlen($nombre[$k]) < 4) {
// Aqu se tienen en cuenta los artculos
// y preposiciones de los apellidos
switch (strtolower($nombre[$k])) {
case "de":
$k++;
break;
141
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
case "del":
$k++;
break;
case "la":
$k++;
break;
case "el":
$k++;
break;
case "las":
$k++;
break;
case "los":
$k++;
break;
case "da":
$k++;
break;
default:
$encontrado = $k;
break;
}
} else {
$encontrado = $k;
}
}
$reference = strtolower(rtrim(ltrim($nombre[$encontrado])));
}
// Si no existen comas, entonces se escoge la segunda palabra empezando
// por el final que tenga ms de 3 letras. Tambin hay que tener cuidado
// en esto, pues mucha gente suele poner el segundo apellido abreviado.
// Hay que buscar puntos, en consecuencia.
else {
$primer_apellido = FALSE;
$segundo_apellido = FALSE;
for ($k=(count($nombre) - 1);$k>-1;$k--) {
if (stripos(" ".$nombre[$k], ".") != FALSE) {
if ($segundo_apellido == FALSE)
$segundo_apellido = $nombre[$k];
else if ($primer_apellido == FALSE)
$primer_apellido = $nombre[$k];
} else if (strlen($nombre[$k]) < 4){
// Aqu se tienen en cuenta los artculos y
// preposiciones de los apellidos
switch (strtolower($nombre[$k])) {
case "de":
break;
case "del":
break;
case "la":
break;
case "el":
break;
case "las":
break;
case "los":
break;
case "da":
break;
default:
if ($segundo_apellido == FALSE)
$segundo_apellido = $nombre[$k];
else if ($primer_apellido == FALSE)
$primer_apellido = $nombre[$k];
break;
142
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
} else if ($segundo_apellido == FALSE) {
$segundo_apellido = $nombre[$k];
} else if ($primer_apellido == FALSE) {
$primer_apellido = $nombre[$k];
}
}
if ((stripos($primer_apellido, ".") == FALSE) && (count($nombre) > 2))
$reference = $primer_apellido;
else
$reference = $segundo_apellido;
$reference = quita_tildes(strtolower(rtrim(ltrim($reference))));
}
}
return $reference;
}
//******************************************************************************
// GENERA_ARRAYS: genera ararys que contienen las siglas de las publicaciones y
// las palabras claves de stas para la ulterior bsqueda de la publicacin en
// la entrada correspondiente del fichero de actualizacin.
// Entrada: - Nombre del archivo que contiene la informacin de las revistas y
// congresos => $pubs_file
// - Array con los nombres de las tablas de la base de datos => $tablas_db
// - Array para almacenar las palabras claves de los nombres de los
// congresos => $congresos
// - Array para almacenar las siglas de los nombres de los congresos =>
// $siglas
// - Array para almacenar las palabras claves de los nombres de las revistas
// => $revistas
// - Array para almacenar las siglas de los nombres de las revistas =>
// $siglas_rev
// Salida: - Ninguna
//******************************************************************************
function genera_arrays ($pubs_file, $tablas_db, &$congresos, &$siglas,
&$revistas, &$siglas_rev)
{
for ($i=0;$i<count($tablas_db);$i++) {
if ($tablas_db[$i] == "congress") {
$j = 0; // Indice que se incrementa con cada congreso
// Se modifica la tabla "congress" => cargamos en arrays
// las abreviaturas y palabras claves de cada congreso.
$archivo = fopen($pubs_file, "r"); // Apertura del fichero
$inicio = FALSE;
$salir = FALSE;
if ($archivo) {
while (!feof($archivo)) {
// Paso 1: Obtener una fila de la tabla (NOTA 1: fgets lee
// hasta fin de fichero, fin de lnea o cuando haya ledo los
// bytes indicados; NOTA 2: Cuidado con la longitud de las lneas,
// porque pueden dar lugar a capturas errneas de datos.
unset($linea_nueva);
$linea_nueva = fgets($archivo, 1024);
// Buscamos el comienzo de los congresos => "::CONGRESS"
if (stripos(" ".$linea_nueva, "::CONGRESS")) {
$inicio = TRUE;
$salir = FALSE;
}
// Si se encuentra otra lnea que comience por "::" es que
// se trata de otro tipo de publicacin y dejamos de buscar datos
else if (stripos(" ".$linea_nueva, "::"))
$salir = TRUE;
// Aqu se realiza el relleno de la tabla
else if (($inicio == TRUE) && ($salir == FALSE)) {
// Proseguimos si no se trata de un comentario
143
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
if (stripos(" ".$linea_nueva, "//") == FALSE) {
// Obtencin de las siglas
$siglas[$j] = strtok($linea_nueva, ";");
// Obtencin de las palabras clave del congreso para la
// bsqueda del congreso
$offset = strpos($linea_nueva, ";");
$keywords = substr($linea_nueva, $offset+1);
$word = strtok($keywords, "\t");
$k = 0;
while ($word != FALSE) {
//print $word."&nbsp;";
$congresos[$j][$k] = $word;
$word = strtok("\t");
$k++;
}
//print "<br>";
$j++;
}
}
}
}
}
elseif ($tablas_db[$i] == "journals") {
$j = 0; // Indice que se incrementa con cada congreso
// Se modifica la tabla "congress" => cargamos en arrays
// las abreviaturas y palabras claves de cada revista.
$archivo = fopen("pubs.txt", "r"); // Apertura del fichero
$inicio = FALSE;
$salir = FALSE;
if ($archivo) {
while (!feof($archivo)) {
// Paso 1: Obtener una fila de la tabla (NOTA1 : fgets lee
// hasta fin de fichero, fin de lnea o cuando haya ledo los
// bytes indicados; NOTA 2: Cuidado con la longitud de las lneas,
// porque pueden dar lugar a capturas errneas de datos.
$linea = fgets($archivo, 1024);
// Buscamos el comienzo de los congresos => "::JOURNALS"
if (stripos(" ".$linea, "::JOURNALS")) {
$inicio = TRUE;
$salir = FALSE;
}
// Si se encuentra otra lnea que comience por "::" es que
// se trata de otro tipo de publicacin y dejamos de buscar datos
elseif (stripos(" ".$linea, "::"))
$salir = TRUE;
// Aqu se realiza el relleno de la tabla
elseif (($inicio == TRUE) && ($salir == FALSE)) {
// Proseguimos si no se trata de un comentario
if (stripos(" ".$linea, "//") == FALSE) {
// Obtencin de las siglas
$siglas_rev[$j] = strtok($linea, ";");
// Obtencin de las palabras clave del congreso
// para la bsqueda de la revista
$offset = strpos($linea, ";");
$keywords = substr($linea, $offset+1);
$word = strtok($keywords, "\t");
$k = 0;
while ($word != FALSE) {
$revistas[$j][$k] = $word;
$word = strtok("\t");
$k++;
}
$j++;
}
}
144
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
}
}
}
}
//*****************************************************************
// DO_UPLOAD: realiza la copia en el servidor del fichero de actualizacin.
// Entrada: - Nombre del fichero => $fichero
// - Directorio de subida => $upload_dir
// - Direccin del fichero a subir => $upload_url
//*****************************************************************
function do_upload($fichero, $upload_dir, $upload_url) {
$temp_name = $_FILES[$fichero]['tmp_name'];
$file_name = $_FILES[$fichero]['name'];
$file_name = str_replace("\\","",$file_name);
$file_name = str_replace("'","",$file_name);
$file_path = $upload_dir.$file_name;
//Comprobacin del nombre del fichero
if ( $file_name == "") {
$message = "Nombre de fichero especificado no vlido.";
return $message;
}
$result = move_uploaded_file($temp_name, $file_path);
if (!chmod($file_path,0777))
$message = "cambio de permisos a 777 fallido.";
else
$message = ($result)?"$file_name uploaded successfully." :
"Something is wrong with uploading a file.";
return $message;
}
//*****************************************************************
// SEEK_FILE: busca un fichero en una ruta determinada.
// Entrada: - Ruta de bsqueda (en caso de encontrar el fichero,
// se inserta en esta variable la ruta del mismo => $path
// - Fichero a buscar => $file
// - Bandera que indica si se ha encontrado => $found
//*****************************************************************
function seek_file(&$path, $file, &$found)
{
// Cambia al directorio de bsqueda
if (chdir($path)) {
// Si se consigue abrir....
if ($gestor = opendir('.')) {
// Mientras que no se haya encontrado el fichero
// y se pueda leer el siguiente tem del directorio....
while (($found == false) &&
(($res = readdir($gestor)) !== false))
{
if (is_dir($res) && ($res != ".") && ($res != "..")) {
$path = str_replace("\\", "/", getcwd()) . "/" . $res;
seek_file($path, $file, $found);
if ($found == false) {
chdir("../");
$path = str_replace("\\", "/", getcwd());
}
}
else if (is_executable($res)) {
if (strpos($res, $file[PHP_OS]) !== false) {
$found = true;
}
}
145
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
}
}
}
?>
10.#.1./ FUNCTIONS .STEP3.PHP
<?php
//************************************************************************
// CIERRA_PAGINA: cierra las etiquetas "body" y "html" del documento.
// Entrada: - Ninguna
// Salida: - Ninguna
//************************************************************************
function cierra_pagina()
{
echo "\t</body>\n";
echo "</html>\n";
}
//************************************************************************
// TRATA_TEXTO: procesa una cadena de texto, pasando las siglas de congresos y
// abreviaturas de cadenas a maysculas, al igual que los nmeros romanos y
// otras palabras especiales
// Entrada: - Cadena de texto que hay que tratar => $texto
// - Array con las siglas de los congresos => $siglas_congreso
// - Array con las siglas de las revistas => $siglas_revista
// - Array con palabras especiales que deben ir en maysculas => $mayusc
// - Array con nmeros romanos => $numbers
// Salida: - Cadena de texto tratada (por referencia) => $texto
//************************************************************************
function trata_texto(&$texto, $siglas_congreso, $siglas_revista, $mayusc,
$numbers)
{
// Se pone la primera letra de cada palabra en maysculas
$texto = trim(ucwords(strtolower(str_replace("\"", "'", $texto))));
// Se ponen en maysculas las siglas de los congresos
for ($p=0;$p<count($siglas_congreso);$p++) {
$pos = stripos(" ".$texto, $siglas_congreso[$p]);
if (($pos > 0) && !ctype_alpha($texto[$pos-2]) &&
!ctype_alpha($texto[$pos+strlen($siglas_congreso[$p])-1]))
{
$texto = substr($texto,0,$pos-1) . $siglas_congreso[$p] .
substr($texto,$pos+strlen($siglas_congreso[$p])-1,strlen($texto));
}
}
// Se ponen en maysculas las siglas de las revistas
for ($p=0;$p<count($siglas_revista);$p++) {
$pos = stripos(" ".$texto, $siglas_revista[$p]);
if (($pos > 0) && !ctype_alpha($texto[$pos-2]) &&
!ctype_alpha($texto[$pos+strlen($siglas_revista[$p])-1]) &&
(strlen($siglas_revista[$p]) > 1))
{
$texto = substr($texto,0,$pos-1) . $siglas_revista[$p] .
substr($texto,$pos+strlen($siglas_revista[$p])-1,strlen($texto));
}
}
// Se ponen en maysculas las palabras especiales que deben as
for ($p=0;$p<count($mayusc);$p++) {
$pos = stripos(" ".$texto, $mayusc[$p]);
if (($pos > 0) && !ctype_alpha($texto[$pos-2]) &&
!ctype_alpha($texto[$pos+strlen($mayusc[$p])-1]))
{
146
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$texto = substr($texto,0,$pos-1) . $mayusc[$p] .
substr($texto,$pos+strlen($mayusc[$p])-1,strlen($texto));
}
}
// Se ponen en maysculas los nmeros romanos
for ($p=0;$p<count($numbers);$p++) {
$pos = stripos(" ".$texto, $numbers[$p]);
if (($pos > 0) && !ctype_alpha($texto[$pos-2]) &&
!ctype_alpha($texto[$pos+strlen($numbers[$p])-1]))
{
$texto = substr($texto,0,$pos-1) . $numbers[$p] .
substr($texto,$pos+strlen($numbers[$p])-1,strlen($texto));
}
}
$texto = trim($texto);
}
//************************************************************************
// BUSCA_REVISTA: busca una publicacin en la coleccin de revistas disponible.
// Entrada: - Nombres de los campos de la publicacin (tabla, nombre, etc) =>
// $fields
// - Valores de los campos contenidos en $fields => $fields_values
// - Array con las palabras claves de los nombres de revistas => $journals
// - Array con los acrnimos de las revistas => $journals_acr
// - Bandera que se pone a 1 si se encuentra al menos una revista =>
// $insertado
// Salida: - Cadena final para insertar en la referencia => $ref_journal
// - Bandera que indica si se ha encontrado algn congreso
// coincidente (por referencia) => $insertado
//************************************************************************
function busca_revista($fields, $fields_values, $journals,
$journals_acr, &$insertado)
{
unset($revista);
$insertado = false;
// Obtenemos el nombre de la revista
for ($k=0;$k < count($fields);$k++) {
if ($fields[$k] == "journal")
$revista = $fields_values[$k];
}
// Pasamos a minsculas y quitamos las tildes
$revista = quita_tildes(strtolower($revista));
// Se busca la revista en la lista de revistas de que se dispone.
$salir = FALSE;
$k = 0;
$ref_journal = "";
while ($salir == FALSE) {
unset($encontrado);
$encontrado = TRUE;
// Primero se buscan las palabras claves
for ($l=0;$l<count($journals[$k]);$l++)
{
if (!($encontrado &&
(stripos(" ".$revista." ", trim($journals[$k][$l])) != FALSE)))
{
$encontrado = FALSE;
}
}
if ($encontrado == TRUE) {
// Si ya se ha aadido alguna revista, se aade un guin separador
if ($insertado)
$ref_journal = $ref_journal . "-";
$insertado = TRUE;
$ref_journal = $ref_journal . strtoupper($journals_acr[$k]);
}
147
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
if ($k < (count($journals) - 1))
$k++;
else
$salir = TRUE;
}
return $ref_journal;
}
//************************************************************************
// BUSCA_CONGRESO: busca una publicacin en la coleccin de congresos disponible.
// Entrada: - Nombres de los campos de la publicacin (tabla, nombre, etc) =>
// $fields
// - Valores de los campos contenidos en $fields => $fields_values
// - Array con las palabras claves de los nombres de revistas => $congress
// - Array con los acrnimos de las revistas => $congress_acr
// - Bandera que se pone a 1 si se encuentra al menos una revista => $flag
// Salida: - Cadena final para insertar en la referencia => $ref_congress
// - Bandera que se pone a 1 si se encuentra al menos una revista
// (por referencia) => $flag
//************************************************************************
function busca_congreso($fields, $fields_values, $congress,
$congress_acr, &$flag)
{
unset($congreso);
// Obtenemos el nombre del congreso
for ($k=0;$k < count($fields);$k++) {
if ($fields[$k] == "booktitle")
$congreso = $fields_values[$k];
}
// Pasamos a minsculas y quitamos las tildes. Aadimos un espacio al comienzo
// porque si coincide la bsqueda justamente al comienzo de la cadena,
// "stripos" devuelve la posicin 0, que se interpreta como FALSE.
$congreso = quita_tildes(strtolower($congreso));
// Aqu se busca el congreso en la lista de congresos de que se dispone. Si no
// se encuentra el congreso de la entrada seleccionada, se muestra en pantalla
// un mensaje de error y un formulario de relleno del nuevo congreso
$salir = FALSE;
$flag = FALSE;
$k = 0;
$ref_congress = "";
while ($salir == FALSE) {
unset($encontrado);
$encontrado = TRUE;
// Primero se buscan las palabras claves
for ($l=0;$l<count($congress[$k]);$l++)
if (stripos(" ".$congreso, trim($congress[$k][$l])) == FALSE)
$encontrado = FALSE;
if ($encontrado == TRUE) {
// Si ya se ha aadido algn congreso, se aade un guin separador
if ($flag)
$ref_congress = $ref_congress . "-";
$flag = TRUE;
$ref_congress = $ref_congress . strtoupper($congress_acr[$k]);
}
if ($k < (count($congress) - 1))
$k++;
else
$salir = TRUE;
}
// Se realiza un filtrado por si hay siglas duplicadas
for ($l=0;$l<count($congress_acr);$l++) {
if ($congress_acr[$l] != "") {
// Si se encuentran dos o ms coincidencias...
if (substr_count($ref_congress, $congress_acr[$l]) > 1) {
$salir = FALSE;
148
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$subcadena = $ref_congress."-";
while ($salir == FALSE) {
// Hay que tener cuidado y eliminar solamente una de ellas
$pos = strripos($subcadena, $congress_acr[$l]);
$seccion = substr($ref_congress."-", $pos);
$sustituta = str_replace($congress_acr[$l]."-", "", $seccion);
if ($sustituta != $seccion) {
$salir = TRUE;
$sustituta = substr($subcadena, 0, $pos) . $sustituta;
} else {
$subcadena = substr($subcadena, 0, $pos);
}
}
if ($sustituta[strlen($sustituta)-1] == "-")
$ref_congress = substr($sustituta, 0, strlen($sustituta)-1);
}
}
}
return $ref_congress;
}
//************************************************************************
// GET_HTML_CONTENT: obtiene el contenido de una pgina web para un anlisis
// posterior.
// Entrada: - Array con las direcciones webs que se han de analizar => $urls
// Salida: - Array con el contenido de texto que contienen las direcciones de
// entrada => $contenido
//************************************************************************
function get_html_content($urls)
{
for ($p=0; $p<count($urls); $p++)
{
// Apertura del fichero con los hiperenlaces
$descriptor = fopen($urls[$p], "r");
$html_content = "";
while (!feof($descriptor)) {
// Obtencin del contenido de la direccin
$html_content .= fread($descriptor, 8192);
}
fclose($descriptor);
$contenido[$p] = $html_content;
}
return $contenido;
}
//************************************************************************
// GET_PDF: busca una publicacin en la coleccin de revistas disponible.
// Entrada: - Url del pdf capturada del hiperenlace => $url_pdf
// - Url del sitio web que contiene el hiperenlace => $url_site
// Salida: - Ruta del fichero pdf => $final_pdf_url
//************************************************************************
function get_pdf($url_pdf, $url_site)
{
// Hay que preparar la direccin del fichero
$num_levels = substr_count($url_pdf, "../");
$pos_site = strlen($url_site);
$pos_site = strrpos(substr($url_site, 0, $pos_site), "/");
for ($k=0; $k<$num_levels; $k++)
$pos_site = strrpos(substr($url_site, 0, $pos_site), "/");
if ($num_levels > 0)
$pos_pdf = strrpos($url_pdf, "../") + 3;
else
$pos_pdf = 0;
$final_pdf_url = substr($url_site, 0, $pos_site+1) .
149
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
substr($url_pdf, $pos_pdf);
// Si se ha encontrado una direccin adecuada....
if ($final_pdf_url != "")
{
// El fichero pdf se debe poder leer; en caso contrario,
// se eliminar la ruta
$desc_read = fopen($final_pdf_url, "rb");
if ($desc_read == FALSE)
$final_pdf_url = "";
}
return $final_pdf_url;
}
//************************************************************************
// BUSCA_PUBLICACION_WEB: busca una publicacin en la coleccin de revistas
// disponible
// Entrada: - Contenido de las direcciones web facilitadas => $html_contents
// - Array con las direcciones webs facilitadas por el usuario => $urls
// - Nombre de la publicacin => $titulo
// - Siglas de los congresos => $siglas_congreso
// - Acrnimos de las revistas => $siglas_revista
// - Array con palabras especiales que deben ir en maysculas => $mayusc
// - Array con nmeros romanos que deben ir en maysculas => $numbers
// - Array en el que se insertarn las rutas y porcentajes de los
// ficheros pdfs que se encuentren => $pdf
// Salida: - Array con las rutas de los ficheros pdf => $pdf
//************************************************************************
function busca_publicacion_web($html_contents, $urls, $titulo,
$siglas_congreso, $siglas_revista, $mayusc, $numbers, &$pdf)
{
$found = false;
$n_pdf = 0;
$html_tags = array("<b>", "</b>", "<i>", "</i>", "<ul>", "</ul>", "<ol>",
"</ol>", "<li>", "</font>", "<br />", "<br />");
$html_chars = array(9, 10, 13);
$p = 0;
while ($p < count($html_contents))
{
$pos_ini = 0;
// Bucle de bsqueda del hiperlink del pdf
do {
// Primera ocurrencia del inicio de la etiqueta hyperlink
$pos_ini = stripos($html_contents[$p], "<a href=\"", $pos_ini);
if ($pos_ini !== false) {
// Primera ocurrencia del final de la etiqueta hyperlink
$pos_fin = stripos($html_contents[$p], "</a>", $pos_ini);
if ($pos_fin !== false) {
// Se extrae la etiqueta de hyperlink
$hyperlink = substr($html_contents[$p], $pos_ini,
$pos_fin-$pos_ini);
// Se decodifican los caracteres html especiales (p.e., &quot;)
$hyperlink = htmlspecialchars_decode($hyperlink);
// Se quitan los retornos de carro y otros caracteres especiales
for ($i=0; $i<count($html_chars); $i++)
$hyperlink = str_replace(chr($html_chars[$i]), "", $hyperlink);
// Se quitan las etiquetas de formato de texto html
for ($i=0; $i<count($html_tags); $i++) {
if ($html_tags[$i] == "</font") {
if (($posicion1 = stripos($hyperlink, "<font")) !== false) {
$posicion2 = strpos($hyperlink, ">", $posicion+1);
$hyperlink = substr($hyperlink, 0, $posicion1) .
substr($hyperlink, $posicion2+1,
strlen($hyperlink)-$posicion2);
}
150
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
$hyperlink = str_replace($html_tags[$i], "", $hyperlink);
}
// Se quitan los espacios repetidos
$espacio = false;
for ($i=0; $i<strlen($hyperlink); $i++) {
if (($hyperlink[$i] == " ") && ($espacio == true))
$hyperlink = substr($hyperlink, 0, $i-1) .
substr($hyperlink, $i+1);
else if ($hyperlink[$i] == " ")
$espacio = true;
else
$espacio = false;
}
// Se busca el comienzo del nombre de la publicacin
$pos_i_tit = strpos($hyperlink, ">");
while(($pos_i_tit < strlen($hyperlink)) &&
!ctype_alnum($hyperlink[$pos_i_tit]) &&
($hyperlink[$pos_i_tit] != "<"))
{
$pos_i_tit++;
}
// Se busca el fin del nombre de la publicacin
$pos_f_tit = strlen($hyperlink);
while(($pos_i_tit < strlen($hyperlink)) &&
!ctype_alnum($hyperlink[$pos_f_tit]) &&
($hyperlink[$pos_f_tit] != ">"))
{
$pos_f_tit--;
}
$hyperlink_titulo = trim(substr($hyperlink, $pos_i_tit,
$pos_f_tit-$pos_i_tit+1));
// Se permite un error mximo de 5 letras
if (abs(strlen($hyperlink_titulo)-strlen($titulo)) < 5) {
$porcentaje = 0;
trata_texto($hyperlink_titulo, $siglas_congreso,
$siglas_revista, $mayusc, $numbers);
similar_text($titulo, $hyperlink_titulo, $porcentaje);
//Si se encuentra el ttulo en esta etiqueta...
if ((stripos($hyperlink, $titulo) > 0) || ($porcentaje > 90)) {
//... obtenemos la ruta completa del pdf...
$pos_ini += 9;
$pos_fin = stripos($html_contents[$p], "\"", $pos_ini);
$pdf_url = substr($html_contents[$p], $pos_ini,
$pos_fin - $pos_ini);
$pdf_url = get_pdf($pdf_url, $urls[$p]);
// ... y en caso de que ste sea accesible
if ($pdf_url != "") {
// ... asignamos la nueva ruta
$pdf[$n_pdf][0] = $pdf_url;
// ... y obtenemos el porcentaje de similitud
$pdf[$n_pdf][1] = $porcentaje;
$found = true;
$n_pdf++;
}
}
}
$pos_ini = $pos_fin;
}
else
$pos_ini++;
}
} while ($pos_ini > 0);
$p++;
151
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
if ($found == false) {
$pdf[$n_pdf][0] = "";
$pdf[$n_pdf][1] = "";
}
}
//************************************************************************
// REMOTE_FILE_SIZE: obtiene el tamao de un fichero
// Entrada: - Url del fichero cuyo tamao se desea obtener => $url
// Salida: - Cadena con el tamao del fichero => $return
//************************************************************************
function remote_file_size ($url)
{
$head = "";
$url_p = parse_url($url);
$host = $url_p["host"];
$path = $url_p["path"];
$fp = fsockopen($host, 80, $errno, $errstr, 20);
if(!$fp)
{ return false; }
else
{
fputs($fp, "HEAD ".$url." HTTP/1.1\r\n");
fputs($fp, "HOST: dummy\r\n");
fputs($fp, "Connection: close\r\n\r\n");
$headers = "";
while (!feof($fp)) {
$headers .= fgets ($fp, 128);
}
}
fclose ($fp);
$return = false;
$arr_headers = explode("\n", $headers);
foreach($arr_headers as $header) {
$s = "Content-Length: ";
if(substr(strtolower ($header), 0, strlen($s)) == strtolower($s)) {
$return = substr($header, strlen($s));
break;
}
}
return $return;
}
//************************************************************************
// ABRE_FORMULARIO: inserta la etiqueta HTML de apertura de un formulario
// Entrada: - Ninguna
// Salida: - Ninguna
//************************************************************************
function abre_formulario()
{
echo "\t\t<form name='upload' id='upload' action='paso3.php' "
. "ENCTYPE='multipart/form-data' method='POST'>\n";
}
//************************************************************************
// CIERRA_FORMULARIO: inserta la etiqueta HTML de cierre de un formulario
// Entrada: - Ninguna
// Salida: - Ninguna
//************************************************************************
function cierra_formulario()
{
echo "\t\t</form>\n";
}
152
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
//************************************************************************
// IMPRIME_RESULTADOS: imprime en el documento actual del navegador los
// resultados de la bsqueda del sistema, esto es, cada una de las entradas
// analizadas junto con los datos extrados.
// Entrada: - Array con los valores de los campos devueltos del anlisis de
// todos los datos facilitados por el usuario => $campos_def
// - Array con los valores de los campos adicionales resultado del
// anlisis de todos los datos facilitados por el usuario =>
// $campo_def_add
// - Array con los nombres de los campos de las tablas de la base de datos
// => $campos_tablas
// - Array con los mensajes de error que se pueden mostrar =>
// $mensajes_error
// - Array que indica cul de las urls de pdfs es la que se encuentra
// seleccionada actualmente => $mark
// Salida: - Ninguna
//************************************************************************
function imprime_resultados($campos_def, $campo_def_add,
$campos_tablas, $mensajes_error, $mark)
{
$def_offset = count($campo_def_add);
for ($def_count=0; $def_count<count($campos_def); $def_count++)
{
echo "\t\t\t<table border='0' width='100%' >\n";
// Impresin del nombre de la tabla
echo "\t\t\t\t<tr>\n\t\t\t\t\t<td>Tabla:</td>\n\t\t\t\t\t<td>" .
$campos_def[$def_count][$campo_def_add["tabla"]] .
"</td>\n\t\t\t\t</tr>\n";
// Impresin de los campos que pertenecen lcitamente a la tabla
for ($j=0; $j<count($campos_def[$def_count])-$def_offset; $j++)
{
if
($campos_tablas[$campos_def[$def_count][$campo_def_add["tabla"]]][$j] != "id")
{
echo "\t\t\t\t<tr>\n";
echo "\t\t\t\t\t<td valign=\"top\">" .
ucwords($campos_tablas[$campos_def[$def_count][$campo_def_add["tabla"]]][$j])
. ":</td>\n";
echo "\t\t\t\t\t<td>";
if
($campos_tablas[$campos_def[$def_count][$campo_def_add["tabla"]]][$j] ==
"abstract")
{
echo "<textarea name='field" . $def_count . "-" .
($j+$def_offset) . "' cols=\"90\" rows=\"5\">" .
$campos_def[$def_count][$j+$def_offset] . "</textarea>";
}
else
echo "<input type='text' name='field" . $def_count . "-" .
($j+$def_offset) . "' size='120' value=\"" .
$campos_def[$def_count][$j+$def_offset] . "\" />";
echo "</td>\n";
echo "\t\t\t\t</tr>\n";
}
}
// Impresin del campo "autores"
echo "\t\t\t\t<tr>\n";
echo "\t\t\t\t\t<td>Autores:</td>\n";
echo "\t\t\t\t\t<td>";
echo "<input type='text' name='field" . $def_count . "-" .
$campo_def_add["authors"] . "' size='120' value=\"" .
ucwords(strtolower($campos_def[$def_count][$campo_def_add["authors"]])) .
"\" />";
153
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
echo "</td>\n";
echo "\t\t\t\t</tr>\n";
// Impresin del campo correspondiente al fichero pdf
echo "\t\t\t\t<tr>\n";
echo "\t\t\t\t\t<td valign=top>PDF File:</td>\n";
$n_pdfs = count($campos_def[$def_count][$campo_def_add["pdf"]]);
echo "\t\t\t\t\t<td>\n";
$porcentaje = 0;
$pos = -1;
if ($n_pdfs > 1) {
if (!isset($mark[$def_count][$campo_def_add["pdf"]][0])) {
for ($k=0; $k<$n_pdfs; $k++)
{
if ($campos_def[$def_count][$campo_def_add["pdf"]][$k][1] >
$porcentaje)
{
$porcentaje =
$campos_def[$def_count][$campo_def_add["pdf"]][$k][1];
$pos = $k;
}
}
}
else {
for ($k=0; $k<$n_pdfs; $k++)
{
if ($mark[$def_count][$campo_def_add["pdf"]][$k] == 1) {
$pos = $k;
}
}
}
}
for ($k=0; $k<$n_pdfs; $k++) {
$mensaje = "";
// Si hay varios enlaces de ficheros, entonces
// se muestran botones tipo radio
if ($n_pdfs > 1) {
$mensaje = "\t\t\t\t\t\t<input type='radio' id='pdf_check" .
$def_count . "-" . $k . "' name='pdf_check" . $def_count .
"' value='" . $k . "'";
if ($k == $pos)
$mensaje .= " checked";
$mensaje .= " />\n";
}
// Se aade el campo de texto con la direccin del pdf
$mensaje .= "\t\t\t\t\t\t<input type='text' id='url" . $def_count .
"-" . $k . "' name='url" . $def_count . "-" . $k . "' value=\"" .
str_replace("\\\\", "\\",
$campos_def[$def_count][$campo_def_add["pdf"]][$k][0])
. "\" size='95' onclick=\"change('" . $def_count . "', '" .
$k . "', 'url');\" />\n";
// En caso de tratarse de un fichero que facilita el usuario
// manualmente no se muestra porcentaje de coincidencia alguno
if ($campos_def[$def_count][$campo_def_add["pdf"]][$k][1] == "0") {
$mensaje .= "\t\t\t\t\t\t<span id='percent_" . $def_count .
"_" . $k . "'>(&nbsp;&nbsp;Custom&nbsp;&nbsp;)</span>\n";
$mensaje .= "\t\t\t\t\t\t<input type='button' id='change_pdf_bt_" .
$def_count . "_" . $k . "' " . "value='Cambiar' " .
"onclick=\"change_pdf_file('" . $def_count . "', '" .
$k . "', 'url');\" />" . "<br />\n";
}
// En cualquier otro caso, se muestra el porcentaje de coincidencia
else {
$mensaje .= "\t\t\t\t\t\t<span id='percent_" .
$def_count . "_" . $k . "'>(" .
sprintf("%.2f",
154
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$campos_def[$def_count][$campo_def_add["pdf"]][$k][1]) .
" %)</span>\n";
$mensaje .= "\t\t\t\t\t\t<input type='button' id='change_pdf_bt_" .
$def_count . "_" . $k . "' " . "value='Cambiar' " .
"onclick=\"change_pdf_file('" . $def_count . "', '" .
$k . "', 'url');\" />" . "<br />\n";
}
echo $mensaje;
}
echo "\t\t\t\t\t\t<input type='checkbox' id='req_pdf" . $def_count .
"' name='req_pdf" . $def_count
. "' value='1' ";
if (isset($_POST["req_pdf" . $def_count]))
echo "checked ";
echo "/>No deseo especificar ningn fichero .pdf<br />\n";
echo "\t\t\t\t\t</td>\n";
echo "\t\t\t\t</tr>\n";
set_form($formulario);
// Si ha habido errores, entonces se muestran los
// campos de texto correspondientes ms los fallos
$contador = 0;
$tok = strtok($campos_def[$def_count][$campo_def_add["error"]], "*");
while ($tok !== false) {
$tokens[$contador] = $tok;
$contador++;
$tok = strtok("*");
}
if ($campos_def[$def_count][$campo_def_add["error"]] != "") {
for ($n=0; $n<count($tokens); $n++) {
switch ($tokens[$n]) {
case "revista":
case "congreso":
echo "\t\t\t\t<tr>\n";
echo "\t\t\t\t\t<td valign=top>Error:</td>\n";
echo "\t\t\t\t\t<td bgcolor=red>" .
$mensajes_error[$tokens[$n]] . "</td>\n";
echo "\t\t\t\t</tr>\n";
echo "\t\t\t\t\t<td></td>\n";
echo "\t\t\t\t\t<td>\n\t\t\t\t\t<table>\n";
echo "\t\t\t\t\t\t\t<tr>\n";
echo "\t\t\t\t\t\t\t\t<td>Descripcin:</td>\n";
echo "\t\t\t\t\t\t\t\t<td><input type='text' name='comment" .
$def_count . "' size='80' /><br /></td>\n";
echo "\t\t\t\t\t\t\t</tr>\n";
echo "\t\t\t\t\t\t\t<tr>\n";
echo "\t\t\t\t\t\t\t\t<td>Palabras clave:</td>\n";
echo "\t\t\t\t\t\t\t\t<td><input type='text' name='keywords" .
$def_count . "' size='80' /><br /></td>\n";
echo "\t\t\t\t\t\t\t</tr>\n";
echo "\t\t\t\t\t\t\t<tr>\n";
echo "\t\t\t\t\t\t\t\t<td>Siglas:</td>\n";
echo "\t\t\t\t\t\t\t\t<td><input type='text' name='abbrev" .
$def_count . "' size='80' /><br /></td>\n";
echo "\t\t\t\t\t\t\t</tr>\n";
echo "\t\t\t\t\t\t\t<tr>\n";
echo "\t\t\t\t\t\t\t\t<td colspan=2><input type=hidden " .
"name='tabla_modif" . $def_count."' value='" .
$campos_def[$def_count][$campo_def_add["tabla"]].
"' /><br /></td>\n";
echo "\t\t\t\t\t\t\t</tr>\n";
echo "\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n";
break;
case "fecha":
case "autores":
155
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
case "titulo":
echo "\t\t\t\t<tr>\n";
echo "\t\t\t\t\t<td valign=top>Error:</td>\n";
echo "<td bgcolor=red>" . $mensajes_error[$tokens[$n]] .
"</td>\n";
echo "\t\t\t\t</tr>\n";
break;
default:
break;
}
}
}
unset($tokens);
if ($campos_def[$def_count][$campo_def_add["error"]] == "") {
// Solamente se muestra la posibilidad de "entrada completa"
// si no hay errores
echo "\t\t\t\t<tr>\n\t\t\t\t\t<td colspan=2><input " .
"type='checkbox' id='finished" . $def_count . "' name='finished" .
$def_count . "' /><label for=\"finished" . $def_count .
"\">Active esta casilla si esta entrada ya est completa" .
"</label></td>\n";
echo "\t\t\t\t</tr>\n";
// Tambin se muestra una casilla para el caso en que no se
// quiera aadir una entrada
echo "\t\t\t\t<tr>\n\t\t\t\t\t<td colspan=2><input " .
"type='checkbox' id='nondesired" . $def_count . "' name='nondesired" .
$def_count . "' /><label for=\"nondesired" . $def_count .
"\">En caso de no querer aadir esta entrada, active esta casilla" .
"</label></td>\n";
echo "\t\t\t\t</tr>\n";
}
echo "\t\t\t</table>\n\t\t\t<br />\n";
echo "\t\t\t<hr noshade size='8' />\n";
}
}
//************************************************************************
// SET_FORM: activa una bandera que indica si hay que mostrar el formulario de
// actualizacin de la base de datos o no.
// Entrada: - Bandera => $formulario
// Salida: - Ninguna
//************************************************************************
function set_form(&$formulario)
{
if ($formulario == 0)
$formulario = 1;
}
//************************************************************************
// CODIGO_JAVASCRIPT: inserta funciones javascript (una abre la nueva ventana
// de copia de ficheros, y las restantes se utilizan para cambiar la
// naturaleza del campo de entrada de seleccin de fichero).
// Entrada: - Bandera que indica si el formulario de actualizacin de la base de
// datos se ha de mostrar => $formulario
// - Ruta del fichero que almacena los nombres de los ficheros pdf a
// subir al servidor => $log_file
// Salida: - Ninguna
//************************************************************************
function codigo_javascript($formulario, $log_file)
{
print "\t\t<script type=\"text/javascript\">";
print "\n\t\t\tvar winName=\"Progreso de la copia de ficheros\"";
print "\n\t\t\tvar sec_window;";
print "\n\t\t\tfunction Abrir_Ventana(theURL, w, h) {" .
"\n\t\t\t\tvar winl = (screen.width-w)/2;" .
156
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
"\n\t\t\t\tvar wint = (screen.height-h)/2;" .
"\n\t\t\t\tif (winl < 0) winl = 0;" .
"\n\t\t\t\tif (wint < 0) wint = 0;" .
"\n\t\t\t\tvar windowprops =\"top=\"+wint+\",left=\"+winl+\"," .
"toolbar=no,location=no,status=no, " .
"menubar=no,scrollbars=no, resizable=no,width=\" + w + \",height=\" + h;" .
"\n\t\t\t\tsec_window = window.open(theURL,winName,windowprops);" .
"\n\t\t\t}\n";
print "\t\t\tfunction change_pdf_file(id1, id2, str)\n" .
"\t\t\t{\n" .
"\t\t\t\tvar name = str + id1 + \"-\" + id2;\n" .
"\t\t\t\tvar object = document.getElementById(name);\n" .
"\t\t\t\tobject.type = \"file\";\n" .
"\t\t\t\tobject.size = \"107\";\n" .
"\t\t\t\tdocument.getElementById(\"change_pdf_bt_\" + id1 + \"_\" + id2)." .
"style.visibility = \"hidden\";\n" .
"\t\t\t\tdocument.getElementById(\"percent_\" + id1 + \"_\" + id2)." .
"innerHTML = \"\";\n" .
"\t\t\t}\n";
print "\t\t\tfunction change(id1, id2, str)\n" .
"\t\t\t{\n" .
"\t\t\t\tvar name = str + id1 + \"-\" + id2;\n" .
"\t\t\t\tvar object = document.getElementById(name);\n" .
"\t\t\t\tdocument.getElementById(name).onChange = change;\n" .
"\t\t\t\tif (object.type == \"file\")\n" .
"\t\t\t\t{\n" .
"\t\t\t\t\tvar url = object.value;\n" .
"\t\t\t\t\tobject.type = \"text\";\n" .
"\t\t\t\t\tobject.value = url;\n" .
"\t\t\t\t\tdocument.getElementById(\"change_pdf_bt_\" + id1 + \"_\" + " .
"id2).style.visibility = \"visible\";\n" .
"\t\t\t\t}\n" .
"\t\t\t}\n";
print "\t\t</script>\n";
// En caso de que sea la primera vez que se ejecuta la aplicacin, se procede
// al borrado del contenido del fichero que contiene la informacin de los
// nombres de los pdfs
if ($formulario == 0) {
$desc_write = fopen($log_file, "w");
if ($desc_write != false)
fclose($desc_write);
}
}
//************************************************************************
// IMPRIME_MENSAJE_BIENVENIDA: muestra informacin concerniente al paso
// 3 de la actualizacin de la base de datos.
// Entrada: - Bandera que indica si el formulario de actualizacin de la base de
// datos se ha de mostrar => $formulario
// - Ruta del fichero que almacena los nombres de los ficheros pdf a
// subir al servidor => $log_file
// Salida: - Ninguna
//************************************************************************
function imprime_mensaje_bienvenida($formulario, $log_file)
{
print "<html>\n";
print "\t<head>\n";
codigo_javascript($formulario, $log_file);
print "\t</head>\n";
print "\t<body>\n";
print "\t\t<h2>Actualizacin automtica de la Base de Datos</h2><br />" .
"\n\t\t<h3>Paso 3: Introduccin de los datos de las publicaciones en caso" .
" de no tener constancia de las mismas.</h3><br />A continuacin se " .
"muestran, separados mediante barras horizontales, las entradas de los " .
"ficheros indicados en el paso 1 que no concuerdan con ninguna de las " .
157
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
"publicaciones de que se disponen en este momento.<br />Asimismo, se le " .
"facilita un formulario justo debajo de la entrada no registrada para " .
"que aada el nombre de la publicacin, sus siglas y el conjunto de " .
"palabras claves que se emplearn en la bsqueda posteriormente.<br />" .
"<br />";
print "NOTA 1: si la publicacin aparece repetida varias veces, solamente " .
"debe introducir una vez los datos en los formularios.<br />";
print "NOTA 2: inserte las palabras clave separadas por espacios simples " .
"(ni tabuladores ni retornos de carro).<br />";
print "NOTA 3: para registrar una nueva publicacin se requieren los tres " .
"campos citados anteriormente OBLIGATORIAMENTE.<br />";
print "NOTA 4: si modifica el nombre de los autores, el ao o el ttulo de " .
"la publicacin, asegrese de modificar tambin la referencia, as como " .
"de verificar la exactitud de los ficheros pdfs encontrados, pues se " .
"realizaron con la referencia errnea.<br />";
print "NOTA 5: no aada letras al final de las referencias. En caso de que " .
"ya exista una entrada similar, el sistema aadir la letra pertinente " .
"al final de la referencia en cuestin.<br /><br /><br />\n";
}
//************************************************************************
// ELIMINA_ENTRADA: borra una fila del array que contiene los valores de los
// campos correspondientes a las entradas que se han de insertar en la base
// de datos.
// Entrada: - Array con los valores de los campos para la actualizacin =>
// $campos_def
// - Indice de la entrada que se ha de eliminar => $entrada
// Salida: - Array con la entrada eliminada
//************************************************************************
function elimina_entrada($campos_def, $entrada)
{
$new_ind = 0;
for ($i=0; $i<count($campos_def); $i++) {
if ($i != $entrada) {
$nueva_tabla[$new_ind] = $campos_def[$i];
$new_ind++;
}
}
return $nueva_tabla;
}
//************************************************************************
// CREA_ORDEN_SQL: crea una cadena con una sentencia SQL para actualizar una
// nueva entrada de la base de datos.
// Entrada: - Array con los valores de los campos de la entrada a actualizar =>
// $entrada
// - Campos adicionales necesarios para la actualizacin => $campo_def_add
// - Nombres de los campos de la tabla a actualizar => $campos_tablas
// Salida: - Cadena con la orden SQL => $sentencia_SQL
//************************************************************************
function crea_orden_sql($entrada, $campo_def_add, $campos_tablas)
{
// Creacin de la orden SQL
$sentencia_SQL = "INSERT INTO " . $entrada[$campo_def_add["tabla"]] . " (";
$valores = "";
for ($k=0; $k<count($campos_tablas[$entrada[$campo_def_add["tabla"]]]); $k++)
{
if ($campos_tablas[$entrada[$campo_def_add["tabla"]]][$k] != "id")
{
$sentencia_SQL .= $campos_tablas[$entrada[$campo_def_add["tabla"]]][$k];
$valores .= "\"" . $entrada[$k+count($campo_def_add)] . "\"";
if ($k != (count($campos_tablas[$entrada[$campo_def_add["tabla"]]]) - 1))
{
$sentencia_SQL .= ",";
$valores .= ",";
158
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
}
}
$sentencia_SQL .= ") VALUES (" . $valores . ");";
return $sentencia_SQL;
}
//************************************************************************
// BUSCA_ENTRADA_SIMILAR: busca una entrada dada en la tabla que se va a
// actualizar para comprobar si ya existe otra entrada idntica.
// Entrada: - Objeto con los resultados de una consulta SQL solicitando todos
// los ttulos y referencias de las publicaciones de la tabla => $resultado
// - Array con los valores de los campos de la entrada a actualizar =>
// $entrada
// - Campos adicionales necesarios para la actualizacin => $campo_def_add
// - Nombres de los campos de la tabla a actualizar => $campos_tablas
// - Nmero de referencias similares a la buscada => $num_refs
// Salida: - Bandera que indica si se han encontrado entradas similares en
// la base de datos => $salir
// - Nmero de referencias encontradas similares a la buscada
// (por referencia) => $num_refs
//************************************************************************
function busca_entrada_similar($resultado, $entrada,
$campo_def_add, $campos_tablas, &$num_refs)
{
$ind_title = -1;
$ind_ref = -1;
$salir = false;
// Se buscan las posiciones del ttulo y la referencia
for ($k=0; $k<count($campos_tablas[$entrada[$campo_def_add["tabla"]]]); $k++)
{
if ($campos_tablas[$entrada[$campo_def_add["tabla"]]][$k] == "title")
$ind_title = $k + count($campo_def_add);
if ($campos_tablas[$entrada[$campo_def_add["tabla"]]][$k] == "reference")
$ind_ref = $k + count($campo_def_add);
}
while ($row = mysql_fetch_assoc($resultado)) {
if (strcasecmp(trim($row["title"]), $entrada[$ind_title]) == 0)
{
// Se toma la referencia de la BD y se quitan las posibles
// letras al final debidas a referencias repetidas
$terminar = FALSE;
$m = strlen($row["reference"]);
while (($terminar != TRUE) && ($m > 0)) {
if (ctype_digit($row["reference"][$m]))
$terminar = TRUE;
else
$m--;
}
$ref_db = substr($row["reference"], 0, $m + 1);
// En caso de que coincidan el ttulo y la referencia
// se toma como entrada idntica
if (strcasecmp(trim($ref_db),
trim($entrada[$ind_ref])) == 0)
{
$salir = TRUE;
}
}
if (stripos(trim($row["reference"]),
trim($entrada[$ind_ref])) !== false)
{
$num_refs++;
}
}
// Devuelve TRUE en caso de que exista una entrada
159
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// similar en la base de datos; FALSE en caso contrario
return $salir;
}
//************************************************************************
// OBTAIN_AUTHORS: separa los nombres de los autores en palabras sueltas y las
// inserta en un array.
// Entrada: - Cadena con los nombres de los autores => $autores
// - Separador de los nombres de autores => $separador
// Salida: - Array con los nombres de los autores separados y a su vez cada
// nombre separado en palabras => $authors
//************************************************************************
function obtain_authors($autores, $separador)
{
$tok = strtok ($autores, $separador);
$num_tok = 0;
while ($tok !== false) {
$token[$num_tok] = $tok;
$num_tok++;
$tok = strtok($separador);
}
// Se obtiene el nmero de autores ===> $num_tok
// Para cada autor, se separan todas las palabras del
// nombre en tokens ===> $autores
$num_autores = $num_tok;
for ($j=0;$j<$num_autores;$j++) {
$tok = strtok ($token[$j]," ");
$num_tok = 0;
while ($tok !== false) {
$authors[$j][$num_tok] = quita_tildes(strtolower(trim($tok)));
$num_tok++;
$tok = strtok(" ");
}
}
return $authors;
}
//************************************************************************
// BUSCA_AUTOR: busca un autor determinado en el conjunto de autores
// pertenecientes al grupo de control predictivo.
// Entrada: - Autor de la publicacin => $autor
// - Autores del grupo de control predictivo => $autores_grupo
// Salida: - Indice para buscar el autor en el array de autores del grupo
// (vale -1 si no se encuentra) => $people
//************************************************************************
function busca_autor($autor, $autores_grupo)
{
$fin_busqueda = false;
$encontrado = true;
$people = -1;
$k = 0;
while (($fin_busqueda == FALSE) && ($k < count($autores_grupo))) {
$encontrado = TRUE;
// Bucle para cada palabra del nombre del autor de la publicacin
// "autor" -> autor de la publicacin;
// "autores_grupo" -> autores del grupo de control predictivo
for ($l=0;$l<count($autor);$l++) {
// Buscamos la palabra
if (($encontrado == TRUE) &&
(stripos(" ".$autores_grupo[$k], $autor[$l]) == FALSE))
{
// Si no se ha encontrado, se comprueba si hay alguna abreviatura
if (stripos($autor[$l], ".")) {
// Abreviatura en el autor de la publicacin
// Obtencin de la inicial de la abreviatura
160
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
$inicial = strtok($autor[$l], ".");
$word = strtok ($autores_grupo[$k]," ");
$salir = FALSE;
while (($word !== false) && ($salir != TRUE)) {
if (trim($word) == ($inicial."."))
$salir = TRUE;
$word = strtok(" ");
}
if ($salir !== TRUE)
$encontrado = FALSE;
} elseif (stripos($autores_grupo[$k], ".")) {
// Abreviatura en el autor del grupo
$word = strtok ($autores_grupo[$k]," ");
$salir = FALSE;
while (($word !== false) && ($salir != TRUE)) {
if (stripos($word, "."))
$salir = TRUE;
$word = strtok(" ");
}
// Obtencin de la inicial de la abreviatura
$inicial = trim($word);
if ($autor[$l] != ($inicial."."))
$encontrado = FALSE;
} else {
// Si no hay abreviaturas y no se ha encontrado
// la palabra, es que no se trata de este autor
$encontrado = FALSE;
}
}
}
if ($encontrado == TRUE) {
$people = $k + 1;
$fin_busqueda = TRUE;
}
$k++;
}
return $people;
}
//************************************************************************
// CREA_ORDEN_SQL_AUTOR: crea la orden SQL para actualizar la tabla de autores
// tras haber actualizado la tabla de la publicacin.
// Entrada: - Orden SQL correspondiente a la actualizacin de la publicacin
// de este autor => $orden_SQL
// - Tipo de la publicacin => $tipo
// - Id del autor en la tabla "people" de autores del grupo => $people
// - Id devuelto al insertar la publicacin en la tabla => $id
// - Orden del autor => $i
// - Nombre del autor en caso que no pertenezca al grupo => $autor
// - Jobcode (solamente cuando sea PHD PFC) => $jobcode
// Salida: - Orden SQL para actualizar la tabla de autores => $autor_SQL
//************************************************************************
function crea_orden_sql_autor($orden_SQL, $tipo, $people,
$id, $i, $autor, $jobcode)
{
// Autor pertenece al grupo
if ($people != -1) {
// Caso PFC PHD => Hay que insertar el JOBCODE
if ((stripos(" ".$orden_SQL, "INSERT INTO pfcs") != 0) ||
(stripos(" ".$orden_SQL, "INSERT INTO phds") != 0) ||
(stripos(" ".$orden_SQL, "INSERT INTO books") != 0))
{
$autor_SQL = "INSERT INTO authors (people,publication,type," .
"numorder,jobcode) VALUES (\"".$people."\",\"" . $id .
"\",\"" . $tipo . "\",\"" . ($i+1) . "\",\"". $jobcode .
161
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
"\");";
}
// Cualquier otro caso
else
$autor_SQL = "INSERT INTO authors (people,publication," .
"type,numorder) VALUES (\"" . $people . "\",\"" .
$id . "\",\"" . $tipo . "\",\"" . ($i+1) . "\");";
}
// Autor NO pertenece al grupo
else {
$name = "";
// Obtencin del nombre del autor no perteneciente al grupo
for ($p=0; $p<count($autor); $p++)
$name .= $autor[$p] . " ";
$name = ucwords(strtolower(trim($name)));
// Caso PFC PHD => Hay que insertar el JOBCODE
if ((stripos(" ".$orden_SQL, "INSERT INTO pfcs") != 0) ||
(stripos(" ".$orden_SQL, "INSERT INTO phds") != 0) ||
(stripos(" ".$orden_SQL, "INSERT INTO books") != 0))
{
$autor_SQL = "INSERT INTO authors (name,publication,type," .
"numorder,jobcode) VALUES (\"" . $name . "\",\"" . $id .
"\",\"" . $tipo . "\",\"" . ($i+1) . "\",\"" . $jobcode .
"\");";
}
// Cualquier otro caso
else
$autor_SQL = "INSERT INTO authors (name,publication," .
"type,numorder) VALUES (\"" . $name . "\",\"" .
$id . "\",\"" . $tipo . "\",\"" . ($i+1) . "\");";
}
return $autor_SQL;
}
//************************************************************************
// BARRA_PROGRESO: inserta el div para mostrar la informacin de progreso en
// el anlisis de informacin que se hace la primera vez que se llega al
// paso 3.
// Entrada: - Ninguna
// Salida: - Ninguna
//************************************************************************
function barra_progreso()
{
echo "\t<div id='progress' style='position:relative;padding:" .
"0px;width:450px;height:60px;left:25px;'>";
for ($i=1; $i<=10; $i++) {
echo "\t<div style='float:left;margin:5px 0px 0px 1px;width:2px;" .
"height:12px;background:red;color:red;'> </div>";
flush();
ob_flush();
}
echo "</div>";
echo "<script>document.getElementById('progress').style.display = " .
"'none'</script>";
}
//************************************************************************
// PROCESA_ENTRADA: procesa una nueva entrada para aadir en la base de datos,
// generando todas las rdenes SQL necesarias para llevar a cabo con xito
// la actualizacin.
// Entrada: - Valores de los campos de la entrada a actualizar => $entrada
// - Campos adicionales de la entrada a actualizar => $campo_def_add
// - Nombres de los campos de las tablas de la base de datos =>
// $campos_tablas
// - Tipo de la publicacin => $tipo
162
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// - Array con los autores del grupo => $autores_grupo
// - Id devuelto en la actualizacin de la publicacin en la tabla
// => $id
// Salida: - Bandera que indica si se ha actualizado con xito la entrada o
// no => $salir
// - Id devuelto en la actualizacin de la publicacin en la tabla
// (por referencia) => $id
//************************************************************************
function procesa_entrada($entrada, $campo_def_add, $campos_tablas,
$tipo, $autores_grupo, &$id, $letra)
{
// 1 PARTE: ACTUALIZACIN DE LA ENTRADA CORRESPONDIENTE EN LA TABLA INDICADA
//****************************************************************************
$sentencia_SQL = crea_orden_sql($entrada, $campo_def_add,
$campos_tablas);
$query_sql = "SELECT title, reference FROM " .
$entrada[$campo_def_add["tabla"]];
$resultado = mysql_query($query_sql);
$num_refs = 0;
$duplicada = false;
$salir = busca_entrada_similar($resultado, $entrada,
$campo_def_add, $campos_tablas, $num_refs);
// Si hay varias referencias iguales, entonces se aade
// la letra correspondiente (WARNING: mx. n de letras => abecedario)
if ($num_refs != 0) {
// Se buscan las posiciones del ttulo y la referencia
for ($k=0;$k<count($campos_tablas[$entrada[$campo_def_add["tabla"]]]);$k++)
{
if ($campos_tablas[$entrada[$campo_def_add["tabla"]]][$k] == "reference")
$ind_ref = $k + count($campo_def_add);
}
$entrada[$ind_ref] .= $letra[$num_refs-1];
$sentencia_SQL = crea_orden_sql($entrada, $campo_def_add,
$campos_tablas);
}
if ($salir == FALSE) {
// Ejecutar la actualizacin de la entrada
$resultado = mysql_query($sentencia_SQL);
if ($resultado == FALSE)
echo "<h1>ERROR</h1><br />" . mysql_error() . "<br />";
$id = mysql_insert_id(); // Indice de la ltima insercin de la tabla
}
else {
for ($k=0;$k<count($campos_tablas[$entrada[$campo_def_add["tabla"]]]);$k++)
if ($campos_tablas[$entrada[$campo_def_add["tabla"]]][$k] == "title")
$ind_title = $k;
echo "\t<ul><li>No se ha aadido la entrada correspondiente a " .
"la publicacin con ttulo \"" .
$entrada[$ind_title + count($campo_def_add)] .
"\" porque ya existe una entrada similar en la base de datos." .
"<br /></li></ul>\n";
$duplicada = true;
}
// 2 PARTE: ACTUALIZACIONES COLATERALES EN OTRAS TABLAS (DEPENDENCIAS)
//***************************************************************************
if ($salir == FALSE) {
// Paso 4: Aadir/actualizar los autores
$delete_SQL = "DELETE FROM authors WHERE publication=\"" . $id .
"\" AND type=\"" . $tipo[$entrada[$campo_def_add["tabla"]]] . "\";";
$resultado = mysql_query($delete_SQL);
if ($resultado == FALSE)
echo "<h1>ERROR</h1><br />" . mysql_error() . "<br />";
$autores = obtain_authors($entrada[$campo_def_add["authors"]],
$entrada[$campo_def_add["sep_authors"]]);
// Bucle para cada autor
163
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
for ($i=0;$i<count($autores);$i++) {
$people = busca_autor($autores[$i], $autores_grupo);
$autores_SQL[$i] = crea_orden_sql_autor($sentencia_SQL,
$tipo[$entrada[$campo_def_add["tabla"]]], $people, $id, $i,
$autores[$i], "a");
$resultado = mysql_query($autores_SQL[$i]);
if ($resultado == FALSE)
echo "<h1>ERROR</h1><br />" . mysql_error() . "<br />";
}
// En caso de PFC PHD, hay que procesar tambin los supervisores
if ((stripos($sentencia_SQL, "INSERT INTO pfcs") !== false) ||
(stripos($sentencia_SQL, "INSERT INTO phds") !== false))
{
$supervisores = obtain_authors($entrada[$campo_def_add["supervisors"]],
$entrada[$campo_def_add["sep_supervisors"]]);
// Bucle para cada supervisor
for ($i=0;$i<count($supervisores);$i++) {
$people = busca_autor($supervisores[$i], $autores_grupo);
$supervisores_SQL[$i] = crea_orden_sql_autor($sentencia_SQL,
$tipo[$entrada[$campo_def_add["tabla"]]], $people, $id, $i,
$autores[$i], "s");
$resultado = mysql_query($supervisores_SQL[$i]);
if ($resultado == FALSE)
echo "<h1>ERROR</h1><br />" . mysql_error() . "<br />";
}
}
}
$ind_title = 0;
for ($j=0; $j<=count($entrada)-count($campo_def_add); $j++)
if ($campos_tablas[$entrada[$campo_def_add["tabla"]]][$j] == "title")
$ind_title = $j;
if ($duplicada == false)
echo "\t\tActualizada entrada '" .
$entrada[$ind_title + count($campo_def_add)] . "'.<br />";
// Devuelve TRUE en caso de error, FALSE en caso de
// que se haya podido actualizar la base de datos
return !$salir;
}
//************************************************************************
// INSERTA_PDF: aade los datos necesarios para copiar posteriormente un fichero
// pdf y renombrarlo con las reglas del sitio web del grupo de control
// predictivo al final de un fichero de texto del sistema de actualizacin.
// Entrada: - Url del fichero pdf a copiar => $url
// - Url del fichero de texto a modificar => $log_file
// - Tipo de la publicacin contenida en el pdf => $tipo_publicacion
// - Id devuelto al actualizar la tabla con la informacin de la
// publicacin => $id
// Salida: - Ninguna
//************************************************************************
function inserta_pdf($url, $log_file, $tipo_publicacion, $id)
{
$descriptor = fopen($log_file, "a");
$final = $url."\t".$tipo_publicacion."\t".$id."\n";
fwrite($descriptor, $final, strlen($final));
fclose($descriptor);
}
//************************************************************************
// BUSCA_PUBLICACION_DIR: busca una publicacin en un directorio facilitado por
// el usuario. Si encuentra en la ruta del fichero todas las partes que
// componen la referencia, entonces se toma como fichero vlido de la
// publicacin (pdf).
// Entrada: - Array con los directorios facilitados por el usuario => $dirs
// - Referencia de la publicacin buscada => $referencia
164
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// - Url del fichero que contiene las siglas y acrnimos de las revistas y
// congresos => $pubs_file
// - Array para insertar las rutas y porcentajes de los ficheros
// encontrados => $pdfs
// Salida - Array con las rutas y porcentajes de los ficheros encontrados
// (por referencia) => $pdfs
//************************************************************************
function busca_publicacion_dir($dirs, $referencia, $pubs_file, &$pdfs)
{
$path = 0;
$percent = 1;
// Obtencin del ao, primer apellido y publicacin a
// partir de la referencia => array $token
$i = 0;
$pos2 = 0;
$pos1 = $pos2;
while (!ctype_upper($referencia[$pos2]))
$pos2++;
$token[$i] = substr($referencia, $pos1, $pos2);
$i++;
$pos2;
$pos1 = $pos2;
while (!ctype_digit($referencia[$pos2]))
$pos2++;
$token[$i] = substr($referencia, $pos1, $pos2-$pos1);
$i++;
$pos2 +=2;
$token[$i] = substr($referencia, $pos2);
$keywords = get_keywords($pubs_file, $token[1]);
for ($i=0; $i<count($dirs); $i++) {
if (is_dir($dirs[$i])) {
// Se obtiene un listado de todos los directorios
// y ficheros bajo este directorio
$content = scandir($dirs[$i]);
// Para cada entrada del array se comprueba si es fichero,
// enlace simblico o directorio
for ($j=0; $j<count($content); $j++) {
$ruta = $dirs[$i] . "\\\\" . $content[$j];
// Caso de ser directorio se almacena en otro array
// para llamar recursivamente esta funcin
if ((is_dir($ruta)) && ($content[$j] != ".") &&
($content[$j] != ".."))
{
$coincidencias = busca_publicacion_dir(array($ruta),
$referencia, $pubs_file, $pdfs);
}
// Caso de ser fichero, se mira si se trata del buscado o no
// REQUISITO: se debe encontrar SIEMPRE el apellido, el ao
// Y las siglas de la publicacin o un % > 0.6 en las palabras claves
else if (is_file($ruta)) {
$filename = quita_tildes($content[$j]);
$nueva_ruta = $dirs[$i] . "\\\\" . $filename;
$valido = true;
// Bsqueda del primer apellido del autor principal
if (stripos($nueva_ruta, $token[0]) === false)
$valido = false;
// Bsqueda de la publicacin
$num_cases = 0;
if (stripos($nueva_ruta, $token[1]) === false) {
// Si la bsqueda de las siglas falla, entonces
// se buscan las palabras claves
for ($k=0; $k<count($keywords); $k++) {
if (stripos($nueva_ruta, $keywords[$k]) !== false)
$num_cases++;
}
165
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
else
$num_cases = count($keywords);
// Aqu se tiene en cuenta un porcentaje de similitud,
// esto es, que se encuentren como mnimo un determinado
// nmero de palabras claves
if (($num_cases/count($keywords)) < 0.6)
$valido = false;
// Bsqueda del ao
if (stripos($nueva_ruta, $token[2]) === false)
$valido = false;
if ($valido) {
$n_pdfs = count($pdfs);
if (!isset($pdfs[$n_pdfs-1][0]))
$n_pdfs = 0;
else if ($pdfs[$n_pdfs-1][0] == "")
$n_pdfs--;
$pdfs[$n_pdfs][0] = stripslashes($ruta);
$pdfs[$n_pdfs][1] = ($num_cases/count($keywords))*100;
}
}
}
}
}
}
//************************************************************************
// GET_KEYWORDS: obtiene las palabras clave de una publicacin a partir de sus
// siglas. Esto es til para la bsqueda de ficheros pdf en los directorios, ya
// que algunas veces usan las siglas y otras los nombres completos.
// Entrada: - Url del fichero que contiene las siglas y acrnimos de las
// revistas y congresos => $pubs_file
// - Siglas de la publicacin => $siglas
// Salida: - Palabras clave de la publicacin => $keywords
//************************************************************************
function get_keywords($pubs_file, $siglas)
{
// Se buscan las palabras clave de la publicacin basndose en las siglas
$pubs = "";
$archivo = fopen($pubs_file, "r");// Apertura del fichero
if ($archivo) {
while (!feof($archivo))
$pubs .= fread($archivo, 8192);
$pos_siglas = stripos($pubs, $siglas.";") + strlen($siglas) + 1;
$cadena = trim(substr($pubs, $pos_siglas,
strpos(substr($pubs, $pos_siglas), "\n")));
$parte = strtok($cadena, "\t");
$i = 0;
$empezado = false;
for ($j=0; $j<strlen($cadena); $j++) {
if ((ctype_alnum($cadena[$j])) && (!$empezado)) {
$empezado = true;
$pos_ini = $j;
}
else if (!ctype_alnum($cadena[$j]) && $empezado) {
$empezado = false;
$pos_fin = $j;
$keywords[$i] = trim(substr($cadena, $pos_ini, $pos_fin-$pos_ini));
$i++;
}
else if (ctype_alnum($cadena[$j]) &&
$empezado && ($j == (strlen($cadena)-1)))
{
$keywords[$i] = trim(substr($cadena, $pos_ini));
}
166
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
}
return $keywords;
}
?>
10.#.1.10 HELP.HTML
<html>
<body>
A continuacin se muestran las distintas tablas y sus correspondientes campos,
junto con una descripcin de cada uno:<br></br>
<table cellspacing=10>
<caption><h3>Tabla CONGRESS</h3></caption>
<thead>
<tr>
<th>Nombre del campo</th>
<th>Descripcin</th>
</tr>
</thead>
</tbody>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TITLE
<td> Ttulo de la ponencia del congreso
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ABSTRACT
<td> Resumen de la ponencia
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REFERENCE
<td> Referencia de la publicacin
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOKTITLE
<td> Nombre del congreso
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YEAR
<td> Ao de publicacin de la ponencia
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MONTH
<td> Mes de publicacin de la ponencia
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADDRESS
<td> Direccin
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PAGES
<td> Pginas del documento de publicacin de la ponencia
</tr>
</tbody>
</table>
<table cellspacing=10>
<caption><h3>Tabla JOURNALS</h3></caption>
<thead>
<tr>
<th>Nombre del campo</th>
<th>Descripcin</th>
167
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
</tr>
</thead>
</tbody>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TITLE
<td> Ttulo del artculo
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ABSTRACT
<td> Resumen del artculo
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REFERENCE
<td> Referencia de la publicacin
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JOURNAL
<td> Nombre de la revista o publicacin
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YEAR
<td> Ao de publicacin del artculo
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VOLUME
<td> Volumen de publicacin
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PAGES
<td> Pginas del artculo en la publicacin
</tr>
</tbody>
</table>
<table cellspacing=10>
<caption><h3>Tabla BOOKS</h3></caption>
<thead>
<tr>
<th>Nombre del campo</th>
<th>Descripcin</th>
</tr>
</thead>
</tbody>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TITLE
<td> Ttulo del libro
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ABSTRACT
<td> Resumen del libro
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REFERENCE
<td> Referencia de la publicacin
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUBLISHER
<td> Editorial
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YEAR
<td> Ao de publicacin del libro
</tr>
168
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISBN
<td> ISBN del libro
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CODE
<td> Cdigo del documento: 1) Libro de texto 2) Libro de actas
</tr>
</tbody>
</table>
<table cellspacing=10>
<caption><h3>Tabla PFCS</h3></caption>
<thead>
<tr>
<th>Nombre del campo</th>
<th>Descripcin</th>
</tr>
</thead>
</tbody>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TITLE
<td> Ttulo del libro
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AUTHOR
<td> Autor del proyecto fin de carrera
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ABSTRACT
<td> Resumen del libro
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REFERENCE
<td> Referencia de la publicacin
</tr>
</tbody>
</table>
<table cellspacing=10>
<caption><h3>Tabla PHDS</h3></caption>
<thead>
<tr>
<th>Nombre del campo</th>
<th>Descripcin</th>
</tr>
</thead>
</tbody>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TITLE
<td> Ttulo del libro
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ABSTRACT
<td> Resumen del libro
</tr>
<tr>
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATEPHD
<td> Fecha de finalizacion del doctorado
</tr>
<tr>
169
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
<td width="30%" align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REFERENCE
<td> Referencia de la publicacin
</tr>
</tbody>
</table>
NOTAS:
<ul>
<li>
No se facilita el campo de insercin de documentos. Se ha de hacer mediante
modificacin manual desde el sitio web del grupo de control predictivo.
</li>
<li>
Existe en la pgina de actualizacin un campo no existente en ninguna de las
tablas, "authors", ya que se suele almacenar el conjunto de autores al
completo, y no de forma separada. El script de actualizacin se encarga de
separarlos posteriormente.
</li>
<li>
En condiciones normales no es necesario modificar la tabla "authors", ya que
los cambios los realiza automticamente el programa de actualizacin.
</li>
</ul>
</body>
</html>
10.#.2 CONTROL REMOTO DE PROCESOS MEDIANTE MATLAB %TCP%IP.
10.#.2.1 TUNNING.ASP(.CS
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.Odbc;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Solar.Classes;
namespace Solar.RemoteTunning
{
/// <summary>
/// Esta clase define los mtodos necesarios para proporcionar el control remoto
/// de la planta a un usuario logeado en el sistema
/// </summary>
public class RemoteTunning : System.Web.UI.Page
{
170
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
protected System.Web.UI.WebControls.Label Parameter_1_name;
protected System.Web.UI.WebControls.Label Parameter_2_name;
protected System.Web.UI.WebControls.Label Parameter_3_name;
protected System.Web.UI.WebControls.Label Parameter_4_name;
protected System.Web.UI.WebControls.Label Parameter_5_name;
protected System.Web.UI.WebControls.Label Parameter_6_name;
protected System.Web.UI.WebControls.Label Parameter_7_name;
protected System.Web.UI.WebControls.Label Parameter_8_name;
protected System.Web.UI.WebControls.Label Parameter_9_name;
protected System.Web.UI.WebControls.Label Parameter_10_name;
protected System.Web.UI.WebControls.TextBox Parameter_1_value;
protected System.Web.UI.WebControls.TextBox Parameter_2_value;
protected System.Web.UI.WebControls.TextBox Parameter_3_value;
protected System.Web.UI.WebControls.TextBox Parameter_4_value;
protected System.Web.UI.WebControls.TextBox Parameter_5_value;
protected System.Web.UI.WebControls.TextBox Parameter_6_value;
protected System.Web.UI.WebControls.TextBox Parameter_7_value;
protected System.Web.UI.WebControls.TextBox Parameter_8_value;
protected System.Web.UI.WebControls.TextBox Parameter_9_value;
protected System.Web.UI.WebControls.TextBox Parameter_10_value;
protected System.Web.UI.WebControls.Button ButtonChangeParams;
protected System.Web.UI.WebControls.Label LabelError;
protected System.Web.UI.WebControls.TextBox Old_value1;
protected System.Web.UI.WebControls.TextBox Old_value5;
protected System.Web.UI.WebControls.TextBox Old_value2;
protected System.Web.UI.WebControls.TextBox Old_value3;
protected System.Web.UI.WebControls.TextBox Old_value4;
protected System.Web.UI.WebControls.TextBox Old_value6;
protected System.Web.UI.WebControls.TextBox Old_value7;
protected System.Web.UI.WebControls.TextBox Old_value8;
protected System.Web.UI.WebControls.TextBox Old_value9;
protected System.Web.UI.WebControls.TextBox Old_value10;
protected System.Web.UI.WebControls.Label LabelOld1;
protected System.Web.UI.WebControls.Label LabelNew1;
protected System.Web.UI.WebControls.Label LabelNew2;
protected System.Web.UI.WebControls.Label LabelOld2;
protected System.Web.UI.WebControls.Image ModeloSimulink;
private UserInfo ui = new UserInfo();
//private System.Windows.Forms.Button();
private void Page_Load(object sender, System.EventArgs e)
{
try
{
//solamente se permite el acceso a usuarios logados
//con privilegio de administrador
if (ui.UserLogged())
{
if ((ui.GetHasTest()=="True") || (ui.GetTypeOfUser()=="root"))
{
int NUM_PARAMS = 10;
bool fallo = false;
string dir_path =
@"C:\Inetpub\ProyectoFC\Solar\Tests\Files\Simulink";
string[] files = null;
// Obtain name and path of the model file
files = Directory.GetFiles(dir_path, "*.mdl");
string mdl_name = null;
string mdl_path = null;
if (files.Length != 0)
{
mdl_name = files[0].Substring(files[0].LastIndexOf("\\") + 1);
mdl_path = files[0];
171
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
else
fallo = true;
// Obtain name and path of the image file
files = Directory.GetFiles(dir_path, "*.png");
string png_name = null;
string png_path = null;
if (files.Length != 0)
{
png_name = files[0].Substring(files[0].LastIndexOf("\\") + 1);
png_path = files[0];
}
else
fallo = true;
// Obtain name and path of the log file
files = Directory.GetFiles(dir_path, "*.log");
string log_name = null;
string log_path = null;
if (files.Length != 0)
{
log_name = files[0].Substring(files[0].LastIndexOf("\\") + 1);
log_path = files[0];
}
else
fallo = true;
// Check if the file exists
if (!fallo && (File.Exists(@mdl_path)))
{
Bitmap imagen = new Bitmap(png_path);
int height = imagen.Height;
int width = imagen.Width;
ModeloSimulink.Height = height;
ModeloSimulink.Width = width;
using (StreamReader sr = new StreamReader(log_path))
{
string line = null;
int i = 0;
while ((line = sr.ReadLine()) != null)
{
string[] parts = line.Split(new Char [] {'='});
switch (parts[0])
{
case "var0":
Old_value1.ReadOnly = false;
Old_value1.Text = parts[1];
Old_value1.ReadOnly = true;
i++;
break;
case "var1":
Old_value2.Text = parts[1];
i++;
break;
case "var2":
Old_value3.Text = parts[1];
i++;
break;
case "var3":
Old_value4.Text = parts[1];
i++;
break;
case "var4":
Old_value5.Text = parts[1];
i++;
172
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
break;
case "var5":
Old_value6.Text = parts[1];
i++;
break;
case "var6":
Old_value7.Text = parts[1];
i++;
break;
case "var7":
Old_value8.Text = parts[1];
i++;
break;
case "var8":
Old_value9.Text = parts[1];
i++;
break;
case "var9":
Old_value10.Text = parts[1];
i++;
break;
}
}
if (i != NUM_PARAMS)
{
LabelError.Text += "You must specify " + NUM_PARAMS +
" parameters" + " in your .mdl file.";
LabelError.Visible = true;
}
}
// Create an instance of StreamReader to read from a file.
// The using statement also closes the StreamReader.
string url = "http://servigar2.us.es/Solar/Tests/Files/Simulink/"
+ png_name;
ModeloSimulink.ImageUrl = url;
}
else if (fallo == true)
{
LabelError.Text="There is no controller availabe at this "+
"moment. If you have booked a period and it is running now,"+
" please, contact the web administrator "+
"(soladmin@cartuja.us.es) or the solar plant supervisor "+
"(solarplant@hotmail.com).";
LabelError.Visible = true;
ModeloSimulink.Visible = false;
}
}
else
Response.Redirect("../LogInOut/ForbiddenAccess.aspx");
}
else
Response.Redirect("../LogInOut/LogExpired.aspx");
}
catch (Exception exc)
{
LabelError.Text = "Exception caught: " + e.ToString();
LabelError.Visible = true;
ModeloSimulink.Visible = false;
}
}
#region Cdigo generado por el Diseador de Web Forms
override protected void OnInit(EventArgs e)
173
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
{
//
// CODEGEN: llamada requerida por el Diseador de Web Forms ASP.NET.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Mtodo necesario para admitir el Diseador. No se puede modificar
/// el contenido del mtodo con el editor de cdigo.
/// </summary>
private void InitializeComponent()
{
this.ButtonChangeParams.Click += new
System.EventHandler(this.ButtonChangeParams_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void ButtonChangeParams_Click(object sender, System.EventArgs e)
{
Socket s = null; // Socket descriptor
int SERVICE_PORT = 32000; // Port to send the data to the server
IPHostEntry iphe = Dns.Resolve("193.147.161.89");
// Obtain name and path of the log file
string dir_path = @"C:\Inetpub\ProyectoFC\Solar\Tests\Files\Simulink";
string[] files = Directory.GetFiles(dir_path, "*.log");
string log_name = files[0].Substring(files[0].LastIndexOf("\\") + 1);
string log_path = files[0];
try
{
foreach(IPAddress ipad in iphe.AddressList)
{
IPEndPoint ipe = new IPEndPoint(ipad, SERVICE_PORT);
// Open the socket
Socket tmpS = new Socket(ipe.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
// Connect the socket
tmpS.Connect(ipe);
if(tmpS.Connected)
{
s = tmpS;
break;
}
else
continue;
}
if (s == null)
{
Console.WriteLine("Cannot connect the socket to the specified " +
"address.\n");
}
else
{
string Texto1 = Parameter_1_value.Text;
string Texto2 = Parameter_2_value.Text;
string Texto3 = Parameter_3_value.Text;
string Texto4 = Parameter_4_value.Text;
string Texto5 = Parameter_5_value.Text;
174
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
string Texto6 = Parameter_6_value.Text;
string Texto7 = Parameter_7_value.Text;
string Texto8 = Parameter_8_value.Text;
string Texto9 = Parameter_9_value.Text;
string Texto10 = Parameter_10_value.Text;
string muestra = Texto1 + Texto2 + Texto3 + Texto4 + Texto5 + Texto6 +
Texto7 + Texto8 + Texto9 + Texto10;
// Creacion del mensaje con el contenido del fichero a modificar
string content = "";
if (Texto1 != "")
content += "var0=" + Texto1 + "\n";
else
content += "var0=" + Old_value1.Text + "\n";
if (Texto2 != "")
content += "var1=" + Texto2 + "\n";
else
content += "var1=" + Old_value2.Text + "\n";
if (Texto3 != "")
content += "var2=" + Texto3 + "\n";
else
content += "var2=" + Old_value3.Text + "\n";
if (Texto4 != "")
content += "var3=" + Texto4 + "\n";
else
content += "var3=" + Old_value4.Text + "\n";
if (Texto5 != "")
content += "var4=" + Texto5 + "\n";
else
content += "var4=" + Old_value5.Text + "\n";
if (Texto6 != "")
content += "var5=" + Texto6 + "\n";
else
content += "var5=" + Old_value6.Text + "\n";
if (Texto7 != "")
content += "var6=" + Texto7 + "\n";
else
content += "var6=" + Old_value7.Text + "\n";
if (Texto8 != "")
content += "var7=" + Texto8 + "\n";
else
content += "var7=" + Old_value8.Text + "\n";
if (Texto9 != "")
content += "var8=" + Texto9 + "\n";
else
content += "var8=" + Old_value9.Text + "\n";
if (Texto10 != "")
content += "var9=" + Texto10 + "\n";
else
content += "var9=" + Old_value10.Text + "\n";
// Send the remote modify request
// Cambiar aqui la direccion del neoxite
string msg = "MOD_REQUEST*OVERWRITE*193.147.161.89*" +
content.Length + "*tunning.txt";
s.Send(ASCIIEncoding.ASCII.GetBytes(msg));
// Receiving the ack message
string data = null;
byte[] bytes = new byte[1024];
int bytesRec = s.Receive(bytes);
data += Encoding.ASCII.GetString(bytes,0,bytesRec);
if (data.CompareTo("PROCEED") == 0)
s.Send(ASCIIEncoding.ASCII.GetBytes(content));
175
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// Once we receive the MODIFY_ACK, we update the log file with new
// values
using (StreamWriter sw = new StreamWriter(log_path, false))
{
sw.Write(content);
}
// Refresh info boxes with new values
if (Texto1 != "")
Old_value1.Text = Texto1;
if (Texto2 != "")
Old_value2.Text = Texto2;
if (Texto3 != "")
Old_value3.Text = Texto3;
if (Texto4 != "")
Old_value4.Text = Texto4;
if (Texto5 != "")
Old_value5.Text = Texto5;
if (Texto6 != "")
Old_value6.Text = Texto6;
if (Texto7 != "")
Old_value7.Text = Texto7;
if (Texto8 != "")
Old_value8.Text = Texto8;
if (Texto9 != "")
Old_value9.Text = Texto9;
if (Texto10 != "")
Old_value10.Text = Texto10;
// Delete content of the other text boxes
Parameter_1_value.Text = null;
Parameter_2_value.Text = null;
Parameter_3_value.Text = null;
Parameter_4_value.Text = null;
Parameter_5_value.Text = null;
Parameter_6_value.Text = null;
Parameter_7_value.Text = null;
Parameter_8_value.Text = null;
Parameter_9_value.Text = null;
Parameter_10_value.Text = null;
}
}
catch (SocketException ex)
{
LabelError.Text += "No se pudo establecer la conexin con el servidor." +
"Lamentamos las molestias.";
LabelError.Visible = true;
}
}
}
}
10.#.2.2 CP2SERVER 2SERVIGAR
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace cp_server_servigar
{
176
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
/// <summary>
/// Class Servidor_Servigar: This class implements a server which can copy
/// remote files and modify files with remote parameters
/// </summary>
class Servidor_Servigar
{
/// <summary>
/// The main entry point for the application.
/// The server receive first a message containing the operation it has to do:
/// *) COPY_REQUEST: remote copy of a file, transfer over IP and create
/// new
/// *) MOD_REQUEST: remote modification of a file on the server, do not
/// create a new file
/// *) ABORT: self message for exiting the program and stop listening
/// The server has two threads: the main thread listen at a specific port for
/// incoming requests, and the secondary thread is only for terminating
/// purposes (it reads the command line and when user enters "exit" it
/// finishes the program.
/// </summary>
[STAThread]
static void Main(string[] args)
{
string server_address = "servigar2.us.es";
int server_port = 39854;
try
{
// Welcome message
Console.WriteLine("Server running at " +
SERVIGAR:\n===========================");
// Just after that message, we start the secondary thread for aborting
Reader lector = new Reader();
Thread hilo_lector = new Thread(new ThreadStart(lector.KeyboardRead));
hilo_lector.Start();
// Allowed IPs for requesting
string[] allowed_ips = {"193.147.161.89", "193.147.160.155",
"172.16.1.4", "127.0.0.1"};
bool salir = false; // Flag for exiting the main loop
string data = null; // Incoming data from the client.
byte[] bytes = new Byte[1024]; // Data buffer for incoming data.
// Create the local endpoint
IPHostEntry ipHostInfo = Dns.Resolve("servigar2.us.es");
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, server_port);
// Create a TCP/IP socket.
Socket listener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp );
// Bind the socket to the local endpoint and listen for incoming
// connections.
listener.Bind(localEndPoint);
listener.Listen(10);
// Start listening for connections.
while (salir == false)
{
Console.WriteLine("\n\nWaiting for a connection...");
// Program is suspended while waiting for an incoming connection.
Socket handler = listener.Accept();
data = null;
177
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// Filtering remote IP
string remoteIP =
((IPEndPoint)handler.RemoteEndPoint).Address.ToString();
Console.WriteLine("Incoming request from " + remoteIP);
bool allowed = false;
foreach (string ip in allowed_ips)
{
if (ip.CompareTo(remoteIP) == 0)
{
Console.WriteLine("Allowed IP => Processing request");
allowed = true;
break;
}
}
// If it is an allowed ip address (white list), go on...
if (allowed)
{
// Receiving the request message
bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
data += Encoding.ASCII.GetString(bytes,0,bytesRec);
// What does the user want to do?
String[] tokens = data.Split(new Char [] {'*'});
data = null;
FileStream fs_write = null;
BinaryWriter w = null;
long size = 0;
switch (tokens[0])
{
case "COPY_REQUEST":
#region COPY REQUEST: remote copy of a file
// Check the existence of the file to create.
// If it does not exist, create the new, empty data file.
string ack_msg = null;
int flag = 0;
if (File.Exists(tokens[4]))
{
if (tokens[1].CompareTo("CREATE") == 0)
{
flag = 1;
ack_msg = "DENIED*Destiny file already exists. " +
"Remote copy denied.\n";
Console.WriteLine("Destiny file already exists. " +
"Remote copy denied.\n");
}
else if (tokens[1].CompareTo("OVERWRITE") == 0)
{
flag = 2;
ack_msg = "PROCEED";
}
}
else
{
flag = 3;
ack_msg = "PROCEED";
}
// Sending the ack message
handler.Send(ASCIIEncoding.ASCII.GetBytes(ack_msg));
178
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// If the ack_msg is PROCEED, go on with the writing
if (flag > 1)
{
Console.WriteLine("Received COPY request. " +
"Waiting for the data...");
// First, see if there exist files with the same
// extension. In affirmative case, delete them all
String[] partes = tokens[4].Split(new Char [] {'.'});
string dir_path =
@"C:\Inetpub\ProyectoFC\Solar\Tests\Files\Simulink";
string[] dirs =
Directory.GetFiles(dir_path, "*." + partes[1]);
if (dirs.Length != 0)
foreach (string dir in dirs)
File.Delete(dir);
// Create the writer for data.
if (flag == 2)
// File will be overwrited
fs_write = new FileStream(tokens[4],
FileMode.Create);
else if (flag == 3)
// File does not exist
fs_write = new FileStream(tokens[4],
FileMode.CreateNew);
else
Console.WriteLine("Internal error.\n");
w = new BinaryWriter(fs_write);
// Receiving the data (file)
size = 0;
string data_mod = "";
Console.WriteLine("Starting receiving data...");
while (true)
{
bytes = new byte[1024];
bytesRec = handler.Receive(bytes);
size += bytesRec;
w.Write(bytes, 0, bytesRec);
data_mod += Encoding.ASCII.GetString(bytes,
0, bytesRec);
if (size == Convert.ToInt64(tokens[3]))
break;
}
Console.WriteLine("File \"" + tokens[4] +
"\" has been created");
fs_write.Close();
w.Close();
// If this is a model file, we create a log file for
// variables storage purposes
if (partes[1].CompareTo("mdl") == 0)
{
int pos = data_mod.IndexOf("Block {");
pos = data_mod.IndexOf("BlockType", pos + 1);
pos = data_mod.IndexOf("\"S-Function\"", pos + 1);
pos = data_mod.IndexOf("Parameters", pos + 1);
int pos2 = data_mod.IndexOf("}", pos + 1);
pos = data_mod.IndexOf("\"", pos + 1);
if (pos < pos2)
{
pos2 = data_mod.IndexOf("\"", pos + 1);
string[] parameters = (data_mod.Substring(pos+1,
pos2-pos-1)).Split(new Char [] {','});
179
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// Before creating log file, we delete all
// log files
dirs = Directory.GetFiles(dir_path, "*.log");
if (dirs.Length != 0)
foreach (string dir in dirs)
File.Delete(dir);
// Creating the log file
StreamWriter sr = File.CreateText(partes[0] +
".log");
for (int i=0; i<10; i++)
sr.WriteLine("var" + i + "=" +
parameters[i] + "\n");
sr.Close();
}
}
}
break;
#endregion
case "MOD_REQUEST":
#region MODIFY REQUEST: remote modification of a file
// Sending the ack message
ack_msg = "PROCEED";
handler.Send(ASCIIEncoding.ASCII.GetBytes(ack_msg));
// Create the writer for data.
fs_write = new FileStream(tokens[4], FileMode.Append,
FileAccess.Write);
w = new BinaryWriter(fs_write);
// Receiving the data to be added to the file
size = 0;
while (true)
{
bytes = new byte[1024];
bytesRec = handler.Receive(bytes);
size += bytesRec;
w.Write(bytes, 0, bytesRec);
if (size == Convert.ToInt64(tokens[3]))
break;
}
fs_write.Close();
w.Close();
break;
#endregion
case "ABORT":
salir = true;
break;
default:
Console.WriteLine("Request of the user is not allowed.\n");
break;
}
}
}
}
# region Specific CATCHS
// Thrown by: Thread (Constructor), Dns.Resolve, Socket.Bind,
// Socket.Receive, ASCIIEncoding.GetString, Socket.Send,
// Directory.GetFiles, File.Delete, FileStream (Constructor),
180
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// BinaryWriter (Constructor), BinaryWriter.Write,
// String.IndexOf, File.CreateText
catch (System.ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Thread.Start
catch (System.Threading.ThreadStateException e)
{
Console.WriteLine("ThreadStateException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Thread.Start, Dns.Resolve, Socket.Bind, Socket.Receive,
// FileStream (Constructor)
catch (System.Security.SecurityException e)
{
Console.WriteLine("SecurityException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Thread.Start
catch (System.OutOfMemoryException e)
{
Console.WriteLine("OutOfMemoryException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Thread.Start
catch (System.NullReferenceException e)
{
Console.WriteLine("NullReferenceException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Dns.Resolve, Socket (Constructor), Socket.Bind, Socket.Listen,
// Socket.Accept, Socket.RemoteEndPoint, Socket.Receive, Socket.Send
catch (System.Net.Sockets.SocketException e)
{
Console.WriteLine("SocketException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: IPEndPoint (Constructor), ASCIIEncoding.GetString,
// FileStream (Constructor), BinaryWriter.Write, String.IndexOf,
// String.Substring
catch (System.ArgumentOutOfRangeException e)
{
Console.WriteLine("ArgumentOutOfRangeException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Socket.Bind, Socket.Listen, Socket.Accept,
// Socket.RemoteEndPoint, Socket.Receive, Socket.Send,
// BinaryWriter.Write, StreamWriter.WriteLine
catch (System.ObjectDisposedException e)
{
Console.WriteLine("ObjectDisposedException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Socket.Accept
catch (System.InvalidOperationException e)
181
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
{
Console.WriteLine("InvalidOperationException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Directory.GetFiles, File.Delete, File.CreateText
catch (System.UnauthorizedAccessException e)
{
Console.WriteLine("UnauthorizedAccessException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Directory.GetFiles, File.Delete, FileStream (Constructor),
// BinaryWriter (Constructor), BinaryWriter.Write, Convert.ToInt64,
// File.CreateText
catch (System.ArgumentException e)
{
Console.WriteLine("ArgumentException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Directory.GetFiles, File.Delete, FileStream (Constructor),
// File.CreateText
catch (System.IO.PathTooLongException e)
{
Console.WriteLine("PathTooLongException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Directory.GetFiles, File.Delete, FileStream (Constructor),
// File.CreateText
catch (System.IO.DirectoryNotFoundException e)
{
Console.WriteLine("DirectoryNotFoundException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: File.Delete, File.CreateText
catch (System.NotSupportedException e)
{
Console.WriteLine("NotSupportedException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: FileStream (Constructor)
catch (System.IO.FileNotFoundException e)
{
Console.WriteLine("FileNotFoundException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Console.WriteLine, File.Delete, FileStream (Constructor),
// BinaryWriter.Write, StreamWriter.WriteLine
catch (System.IO.IOException e)
{
Console.WriteLine("IOException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Convert.ToInt64
catch (System.FormatException e)
{
Console.WriteLine("FormatException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
182
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
// Thrown by: Convert.ToInt64
catch (System.OverflowException e)
{
Console.WriteLine("OverflowException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
#endregion
// Thrown by: any
catch (Exception e)
{
Console.WriteLine("Exception caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
Console.WriteLine("\nPress ENTER to continue...");
Console.Read();
}
}
/// <summary>
/// Class Reader: this class implements a keyboard reader for exiting the
/// executable program. When user writes a line, it reads the command line
/// and if the sentence is "exit", the class sends a message to the listening
/// port on this machine to exit the socket loop of the class
/// Servidor_Servigar
/// </summary>
internal class Reader
{
public void KeyboardRead()
{
int server_port = 39854; // Server port for sending the data
string server_address = "193.147.161.89"; // Servigar2.us.es IP address
string opt = null; // Line entered
Socket s = null; // Socket descriptor
bool salir = false; // Flag for exiting the loop
IPHostEntry iphe = null;
while (salir == false)
{
try
{
Console.Write("(You can type \"exit\" at any moment to exit " +
"the program)\n");
opt = Console.ReadLine();
// If the user writes "exit", proceed with the termination process
if (opt.ToLower() == "exit")
{
// Format check of the IP address
IPAddress address = IPAddress.Parse(server_address);
if(address.AddressFamily == AddressFamily.InterNetwork)
{
// Check if the IP address is valid
iphe = Dns.Resolve(server_address);
foreach(IPAddress ipad in iphe.AddressList)
{
IPEndPoint ipe = new IPEndPoint(ipad, server_port);
// Open the socket
Socket tmpS =
new Socket(ipe.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
183
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// Connect the socket
tmpS.Connect(ipe);
if(tmpS.Connected)
{
s = tmpS;
break;
}
else
continue;
}
if (s == null)
{
Console.WriteLine("Cannot connect the socket to the " +
"specified address.\n");
}
else
{
string msg = "ABORT";
s.Send(ASCIIEncoding.ASCII.GetBytes(msg));
salir = true;
}
}
}
}
#region Specific CATCHs
// Thrown by: Console.ReadLine, Console.WriteLine
catch(System.IO.IOException e)
{
Console.WriteLine("IOException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Console.ReadLine
catch(System.OutOfMemoryException e)
{
Console.WriteLine("OutOfMemoryException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: IPAddress.Parse, Dns.Resolve, Socket.Connect,
// ASCIIEncoding.GetBytes, Socket.Send
catch(System.ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: IPAddress.Parse
catch(System.FormatException e)
{
Console.WriteLine("FormatException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Dns.Resolve, Socket (Constructor), Socket.Connect,
// Socket.Send
catch(System.Net.Sockets.SocketException e)
{
Console.WriteLine("SocketException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Dns.Resolve, Socket.Connect
184
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
catch(System.Security.SecurityException e)
{
Console.WriteLine("SecurityException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: IPEndPoint (Constructor)
catch(System.ArgumentOutOfRangeException e)
{
Console.WriteLine("ArgumentOutOfRangeException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Socket.Connect, Socket.Send
catch(System.ObjectDisposedException e)
{
Console.WriteLine("ObjectDisposedException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
#endregion
// Thrown by: any
catch(Exception e)
{
Console.WriteLine("Exception caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
}
}
}
}
10.#.2.3 TUNNING.C
/*
* sfuntmpl_basic.c: Basic 'C' template for a level 2 S-function.
*
* -------------------------------------------------------------------------
* | See matlabroot/simulink/src/sfuntmpl_doc.c for a more detailed template |
* -------------------------------------------------------------------------
*
* Copyright 1990-2002 The MathWorks, Inc.
* $Revision: 1.27 $
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NUM_VARS 10
FILE *pfile; //Exchange file descriptor
char s[255]; //Global variable to store the read lines from the exchange file
char var_name[255]; //Global variable to store the name of a variable
char var_value[255]; //Global variable to store the value of a variable
int changed_var; //Temporal index for selecting the changed variable
int allowed; //Flag indicating if a variable value is an allowed value
int valid; //Flag indicating if a variable name is a valid name
int i; //Loops counter
int count_orig; //Counter for the originating string
int count_dest; //Counter for the destiny string
int prueba = 0;
185
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
//Allowed variable names for tunning parameters
const char* valid_vars[NUM_VARS] =
{"var0","var1","var2","var3","var4","var5","var6","var7","var8","var9"};
//Array for the new values
double change_value[10];
int changed_value[10] = {0,0,0,0,0,0,0,0,0,0};
/*
* You must specify the S_FUNCTION_NAME as the name of your S-function
* (i.e. replace sfuntmpl_basic with the name of your S-function).
*/
#define S_FUNCTION_NAME tunning
#define S_FUNCTION_LEVEL 2
/*
* Need to include simstruc.h for the definition of the SimStruct and
* its associated macro definitions.
*/
#include "simstruc.h"
/* Error handling
* --------------
*
* You should use the following technique to report errors encountered within
* an S-function:
*
* ssSetErrorStatus(S,"Error encountered due to ...");
* return;
*
* Note that the 2nd argument to ssSetErrorStatus must be persistent memory.
* It cannot be a local variable. For example the following will cause
* unpredictable errors:
*
* mdlOutputs()
* {
* char msg[256]; {ILLEGAL: to fix use "static char msg[256];"}
* sprintf(msg,"Error due to %s", string);
* ssSetErrorStatus(S,msg);
* return;
* }
*
* See matlabroot/simulink/src/sfuntmpl_doc.c for more details.
*/
/*====================*
* S-function methods *
*====================*/
/* Function: mdlInitializeSizes ===============================================
* Abstract:
* The sizes information is used by Simulink to determine the S-function
* block's characteristics (number of inputs, outputs, states, etc.).
*/
static void mdlInitializeSizes(SimStruct *S)
{
/* See sfuntmpl_doc.c for more details on the macros below */
ssSetNumSFcnParams(S, 10); /* Number of expected parameters */
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
/* Return if number of expected != number of actual parameters */
return;
}
186
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
ssSetNumContStates(S, 0);
ssSetNumDiscStates(S, 0);
if (!ssSetNumInputPorts(S, 1)) return;
ssSetInputPortWidth(S, 0, 1);
ssSetInputPortRequiredContiguous(S, 0, true); /*direct input signal access*/
/*
* Set direct feedthrough flag (1=yes, 0=no).
* A port has direct feedthrough if the input is used in either
* the mdlOutputs or mdlGetTimeOfNextVarHit functions.
* See matlabroot/simulink/src/sfuntmpl_directfeed.txt.
*/
ssSetInputPortDirectFeedThrough(S, 0, 1);
if (!ssSetNumOutputPorts(S, NUM_VARS)) return;
ssSetOutputPortWidth(S, 0, 1);
ssSetOutputPortWidth(S, 1, 1);
ssSetOutputPortWidth(S, 2, 1);
ssSetOutputPortWidth(S, 3, 1);
ssSetOutputPortWidth(S, 4, 1);
ssSetOutputPortWidth(S, 5, 1);
ssSetOutputPortWidth(S, 6, 1);
ssSetOutputPortWidth(S, 7, 1);
ssSetOutputPortWidth(S, 8, 1);
ssSetOutputPortWidth(S, 9, 1);
ssSetNumSampleTimes(S, 1);
ssSetNumRWork(S, 0);
ssSetNumIWork(S, 0);
ssSetNumPWork(S, 0);
ssSetNumModes(S, 0);
ssSetNumNonsampledZCs(S, 0);
ssSetOptions(S, 0);
}
/* Function: mdlInitializeSampleTimes =========================================
* Abstract:
* This function is used to specify the sample time(s) for your
* S-function. You must register the same number of sample times as
* specified in ssSetNumSampleTimes.
*/
static void mdlInitializeSampleTimes(SimStruct *S)
{
ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);
ssSetOffsetTime(S, 0, 0.0);
}
#define MDL_INITIALIZE_CONDITIONS /* Change to #undef to remove function */
#if defined(MDL_INITIALIZE_CONDITIONS)
/* Function: mdlInitializeConditions ========================================
* Abstract:
* In this function, you should initialize the continuous and discrete
* states for your S-function block. The initial states are placed
* in the state vector, ssGetContStates(S) or ssGetRealDiscStates(S).
* You can also perform any other initialization activities that your
* S-function may require. Note, this routine will be called at the
* start of simulation and if it is present in an enabled subsystem
* configured to reset states, it will be call when the enabled subsystem
187
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
* restarts execution to reset the states.
*/
static void mdlInitializeConditions(SimStruct *S)
{
}
#endif /* MDL_INITIALIZE_CONDITIONS */
#define MDL_START /* Change to #undef to remove function */
#if defined(MDL_START)
/* Function: mdlStart =======================================================
* Abstract:
* This function is called once at start of model execution. If you
* have states that should be initialized once, this is the place
* to do it.
*/
static void mdlStart(SimStruct *S)
{
}
#endif /* MDL_START */
/* Function: mdlOutputs =======================================================
* Abstract:
* In this function, you compute the outputs of your S-function
* block. Generally outputs are placed in the output vector, ssGetY(S).
*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
int nOutputPorts = ssGetNumOutputPorts(S);
int i,j;
prueba = prueba + 1;
for (i = 0; i < nOutputPorts; i++) {
real_T *y = (real_T *) ssGetOutputPortSignal(S,i);
real_T *pr;
int_T ny = ssGetOutputPortWidth(S,i);
for (j = 0; j < ny; j++) {
//SomeFunctionToFillInOutput(y[j]);
if (changed_value[i] == 1)
y[j] = change_value[i];
else
{
if (mxIsEmpty( ssGetSFcnParam(S,i)) ||
mxIsSparse( ssGetSFcnParam(S,i)) ||
mxIsComplex( ssGetSFcnParam(S,i)) ||
!mxIsNumeric( ssGetSFcnParam(S,i)) )
{
ssSetErrorStatus(S,"Parameters must be real finite vectors");
return;
}
else
{
pr = mxGetPr(ssGetSFcnParam(S,i));
y[j] = *pr;
}
}
}
}
pfile = fopen("tunning.txt","r");
if (pfile != NULL)
{
// The file exist. We must check if there are new values.
188
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
Do
{
fgets (s, 255, pfile); //Read a new line
count_orig = 0;
if (s[0] != '\0')
{
//New line character terminating a line or a variable assignment
while ((s[count_orig] != '\n') && (s[count_orig] != '\0'))
{
count_dest = 0;
//Extracting the variable name
while (s[count_orig] != '=')
{
var_name[count_dest] = s[count_orig];
count_dest++;
count_orig++;
}
var_name[count_dest] = '\0';
count_orig++;
count_dest = 0;
//Extracting the value of the variable
//New line can finish with '\0' if only one variable is wanted to
//change or with '\n' or ';' if more than one variable are needed
while ((s[count_orig] != ';') && (s[count_orig] != '\n')
&& (s[count_orig] ! '\0'))
{
var_value[count_dest] = s[count_orig];
count_dest++;
count_orig++;
}
var_value[count_dest] = '\0';
/************************************/
/*Processing the variable assignment*/
/************************************/
//First, we check if the variable name is a valid name
valid = 0;
for (i=0;i<NUM_VARS;i++)
{
if (strcmp(var_name, valid_vars[i]) == 0)
{
valid = 1;
changed_var = i;
}
}
//If the name is valid, then check the value restrictions
//(Limitations about the changing range)
allowed = 1;
//If the restrictions are accomplished, then proceed with the
//new value assignment
if (allowed && valid)
{
change_value[changed_var] = atof(var_value);
changed_value[changed_var] = 1;
}
}
}
s[0] = '\0';
} while (!feof(pfile) && !ferror(pfile));
}
// Once we have read the file, we delete the contents
fclose(pfile);
pfile = fopen("tunning.txt","w");
if (pfile != NULL)
{
fclose(pfile);
189
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
// The file does not exist, so we create an empty file here
/*fclose(pfile);
pfile = fopen("prueba.txt","w");
if (pfile != NULL)
{
fprintf(pfile, "%d", prueba);
fclose(pfile);
}*/
}
#define MDL_UPDATE /* Change to #undef to remove function */
#if defined(MDL_UPDATE)
/* Function: mdlUpdate ======================================================
* Abstract:
* This function is called once for every major integration time step.
* Discrete states are typically updated here, but this function is useful
* for performing any tasks that should only take place once per
* integration step.
*/
static void mdlUpdate(SimStruct *S, int_T tid)
{
}
#endif /* MDL_UPDATE */
#define MDL_DERIVATIVES /* Change to #undef to remove function */
#if defined(MDL_DERIVATIVES)
/* Function: mdlDerivatives =================================================
* Abstract:
* In this function, you compute the S-function block's derivatives.
* The derivatives are placed in the derivative vector, ssGetdX(S).
*/
static void mdlDerivatives(SimStruct *S)
{
}
#endif /* MDL_DERIVATIVES */
/* Function: mdlTerminate =====================================================
* Abstract:
* In this function, you should perform any actions that are necessary
* at the termination of a simulation. For example, if memory was
* allocated in mdlStart, this is the place to free it.
*/
static void mdlTerminate(SimStruct *S)
{
}
/*======================================================*
* See sfuntmpl_doc.c for the optional S-function methods *
*======================================================*/
/*=============================*
* Required S-function trailer *
*=============================*/
#define RT
#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
#include "simulink.c" /* MEX-file interface mechanism */
190
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
#else
#include "cg_sfun.h" /* Code generation registration function */
#endif
10.#.2.# S ENDTOSERVIGAR .M
ip_address = '193.147.161.89'; %193.147.161.89 == servigar2.us.es
%172.16.1.231 == neoxite
clear nombre ok str_name pos filename file_contents descriptor caracter coords;
clear tokens new_contents x1 x2 y1 y2 nombre_mod orden s w comando fichero ans;
nombre = input('Introduzca el nombre del fichero que contiene el modelo de
Simulink:\n>>>>> ','s');
% Se comprueba el formato del nombre y si existe el fichero
ok = 0;
% Si existe un fichero mdl con ese nombre (es irrelevante si incluye extension o
% no)
if (exist(nombre) == 4)
str_name = java.lang.String(nombre);
pos = str_name.lastIndexOf('.');
if (pos > 0)
% Caso en que se especifica '.mdl'
if ((nombre(pos+2) == 'm') && (nombre(pos+3) == 'd') && (nombre(pos+4) == 'l'))
disp('Fichero de modelo de Simulink encontrado...')
str_name = str_name.substring(0, pos);
nombre = char(str_name.toString);
pos = str_name.indexOf('.');
if (pos > 0)
disp('Error: El nombre del modelo de simulink no debe contener el carcter
"."')
ok = 1;
end
% Caso en que el nombre contiene '.' pero no se trata de la extension '.mdl'
else
disp('Error: El nombre del modelo de simulink no debe contener el carcter
"."')
ok = 1;
end
else
disp('Fichero de modelo de Simulink encontrado...')
end
else
disp('Error: No se encuentra el fichero especificado')
ok = 1;
end
if (ok == 0)
% Posicionado de la ventana de modelo en la esquina superior izquierda
% Por que? Porque si se tapa parte del controlador, no se ve en la imagen
filename = java.lang.StringBuffer(nombre);
filename = filename.append('.mdl');
descriptor = java.io.FileReader(filename.toString);
file_contents = java.lang.StringBuffer('');
caracter = descriptor.read;
while (caracter ~= -1)
file_contents.append(char(caracter));
caracter = descriptor.read;
end
descriptor.close;
pos = file_contents.toString.indexOf('System {');
pos = file_contents.toString.indexOf('Location', pos + 1);
pos = file_contents.toString.indexOf('[', pos + 1);
coords = file_contents.substring(pos +
191
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
1,file_contents.toString.indexOf(']',pos+1));
tokens = java.util.StringTokenizer(coords, ',');
x1 = str2num(tokens.nextToken.toString.trim);
y1 = str2num(tokens.nextToken.toString.trim);
x2 = str2num(tokens.nextToken.toString.trim);
y2 = str2num(tokens.nextToken.toString.trim);
new_contents = java.lang.StringBuffer(file_contents.substring(0, pos + 1));
new_contents.append('0, 0, ');
new_contents.append(num2str(x2-x1));
new_contents.append(', ');
new_contents.append(num2str(y2-y1));
new_contents.append(file_contents.substring(file_contents.toString.indexOf(']',
pos + 1)));

descriptor = java.io.FileWriter(strcat(nombre,'modified.mdl'));
descriptor.write(new_contents.toString);
descriptor.close;
nombre_mod = strcat(nombre, 'modified');

% Apertura del modelo se Simulink facilitado
if (exist(nombre_mod) ~= 0)
evalin('base', nombre_mod);
else
disp('Error')
end
% Almacenado de la imagen en formato BMP
disp('Generando fichero de imagen del modelo...')
orden = java.lang.StringBuffer('print -s');
orden.append(nombre_mod);
orden.append(' -dbitmap ');
orden.append(nombre_mod);
orden = char(orden.toString);
evalin('base', orden);
bdclose(nombre_mod);
% Almacenado de la imagen en formato PNG
disp('Convirtiendo formato de imagen...')
orden = java.lang.StringBuffer('convert ');
orden = orden.append(nombre_mod);
orden.append('.bmp -transparent "#FFFFFF" ');
orden.append(nombre_mod);
orden.append('.png');
orden = char(orden.toString);
[s, w] = dos(orden);
if (s == 0)
% Caso en que no se ha producido error alguno
disp('Modelo de Simulink almacenado en fichero .png para visionado en web.')
% Copia del fichero de imagen al servidor
comando = java.lang.StringBuffer('cp_client_neoxite OVERWRITE ');
comando.append(nombre_mod);
comando.append('.png ');
comando.append(ip_address);
comando.append(' ');
comando.append(nombre);
comando.append('.png');
comando = char(comando.toString);
[s, w] = dos(comando);
if (s ~= 0)
% Caso en que se ha producido algun error
ok = 1;
disp(w)
else
% Se procede a la copia del modelo de Simulink
192
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
comando = java.lang.StringBuffer('cp_client_neoxite OVERWRITE ');
comando.append(nombre);
comando.append('.mdl ');
comando.append(ip_address);
comando.append(' ');
comando.append(nombre);
comando.append('.mdl');
comando = char(comando.toString);
[s, w] = dos(comando);
if (s ~= 0)
% Caso en que se ha producido algun error
ok = 1;
disp(w)
end
end
else
ok = 1;
disp(w)
disp('Asegurese de que el fichero "convert.exe" se encuentra en el directorio
de trabajo')
end
end
if (ok == 1)
disp('***********************************************************************')
disp('Se produjo un error en el proceso. Corrija los errores con ayuda de los')
disp('mensajes anteriores y vuelva a ejecutar el proceso.')
end
% Borrado de todos los ficheros intermedios creados en el proceso
disp('Borrando los ficheros intermedios generados...')
fichero = strcat(nombre_mod, '.mdl');
if (exist(fichero) ~= 0)
delete(fichero);
end
fichero = strcat(nombre_mod, '.bmp');
if (exist(fichero) ~= 0)
delete(fichero);
end
fichero = strcat(nombre_mod, '.png');
if (exist(fichero) ~= 0)
delete(fichero);
end
% Borrado de todas las variables intermedias creadas en el proceso
disp('Eliminando las variables intermedias generadas...')
clear nombre ok str_name pos filename file_contents descriptor caracter coords ans;
clear tokens new_contents x1 x2 y1 y2 nombre_mod orden s w comando fichero
ip_address;
disp('Listo')
disp(sprintf('\n\n'))
10.#.2.$ CP2CLIENT2NEO(ITE
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace cp_client_neoxite
{
193
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
/// <summary>
/// Class Cliente_Neoxite: implements a tcp/ip client for remote
/// copy/modification of files from NEOXITE computer to any other.
/// </summary>
class Cliente_Neoxite
{
/* Method Main: main method of the class Cliente_Neoxite.
* ======================================================
* Exit codes:
* 0: No error
* 1: Insufficient parameters at the command line
* 2: Socket error
* 3: File does not exist
* 4: The IP address does not have the correct format
*/
[STAThread]
static int Main(string[] args)
{
int exit_code = 0; // Returned value
int SERVICE_PORT = 39854; // Server port for sending the data
// User calls the program with the correct number of parameters
if (args.Length == 4)
{
Socket s = null; // Socket descriptor
IPHostEntry iphe = null;
try
{
// Format check of the IP address
IPAddress address = IPAddress.Parse(args[2]);
if(address.AddressFamily == AddressFamily.InterNetwork)
{
// Check if the IP address is valid
iphe = Dns.Resolve(args[2]);
foreach(IPAddress ipad in iphe.AddressList)
{
IPEndPoint ipe = new IPEndPoint(ipad, SERVICE_PORT);
// Open the socket
Socket tmpS =
new Socket(ipe.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
// Connect the socket
tmpS.Connect(ipe);
if(tmpS.Connected)
{
s = tmpS;
break;
}
else
continue;
}
if (s == null)
{
Console.WriteLine("Cannot connect the socket to the specified" +
" address.\n");
exit_code = 2;
}
194
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
else
{
// First of all, check the existence of the file
FileInfo userfile = new FileInfo(args[1]);
if (userfile.Exists)
{
long filelength = userfile.Length;
// Send the remote copy request
String[] tokens = args[1].Split(new Char [] {'\\'});
string filename = tokens[tokens.Length-1];
string msg = "COPY_REQUEST*" + args[0] + "*" + filename +
"*" + filelength + "*" + args[3];
s.Send(ASCIIEncoding.ASCII.GetBytes(msg));
// Receive the ack message
string data = null;
byte[] bytes = new byte[1024];
int bytesRec = s.Receive(bytes);
data += Encoding.ASCII.GetString(bytes,0,bytesRec);
Console.WriteLine(data);
// Create the reader for data.
FileStream fs_read = new FileStream(args[1], FileMode.Open,
FileAccess.Read);
BinaryReader r = new BinaryReader(fs_read);
// Read data from the specified file.
byte[] buffer = new byte[255];
do
{
buffer = r.ReadBytes(255);
s.Send(buffer);
}
while (buffer.Length != 0);
// Close the streams
r.Close();
fs_read.Close();
}
else
{
Console.WriteLine("The specified file does not exist.\n");
exit_code = 3;
}
s.Close();
}
}
else
{
Console.WriteLine("Incorrect format of the remote machine IP " +
"address.\n");
exit_code = 4;
}
}
#region Specific CATCHs
// Thrown by: FileStream (Constructor)
catch (System.IO.DirectoryNotFoundException e)
{
Console.WriteLine("DirectoryNotFoundException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: FileInfo (Constructor), FileStream (Constructor)
catch (System.IO.FileNotFoundException e)
195
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
{
Console.WriteLine("FileNotFoundException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: FileInfo (Constructor), FileStream (Constructor)
catch (System.UnauthorizedAccessException e)
{
Console.WriteLine("UnauthorizedAccessException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: FileInfo (Constructor), FileStream (Constructor)
catch (System.IO.PathTooLongException e)
{
Console.WriteLine("PathTooLongException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: FileInfo (Constructor)
catch (System.NotSupportedException e)
{
Console.WriteLine("NotSupportedException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Console.WriteLine, FileInfo.Length, FileStream
// (Constructor), BinaryReader.ReadBytes, FileStream.Close
catch (System.IO.IOException e)
{
Console.WriteLine("IOException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Socket.Connect, Socket.Send, Socket.Receive,
// BinaryReader.ReadBytes
catch(System.ObjectDisposedException e)
{
Console.WriteLine("ObjectDisposedException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: IPEndPoint (Constructor), Encoding.GetString,
// FileStream (Constructor), BinaryReader.ReadBytes
catch(System.ArgumentOutOfRangeException e)
{
Console.WriteLine("ArgumentOufOfRangeException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: IPAddress.Parse
catch(System.FormatException e)
{
Console.WriteLine("FormatException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: IPAddress.Parse, DNS.Resolve, Socket.Connect,
// FileInfo (Constructor), Socket.Send, Encoding.GetBytes,
// Socket.Receive, Encoding.GetString, FileStream (Constructor)
catch(System.ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
196
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
// Thrown by: DNS.Resolve, Socket (Constructor), Socket.Connect,
// Socket.Send, Socket.Receive
catch(System.Net.Sockets.SocketException e)
{
Console.WriteLine("SocketException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
exit_code = 2;
}
// Thrown by: DNS.Resolve, Socket.Connect, FileInfo (Constructor),
// Socket.Receive, FileStream (Constructor)
catch(System.Security.SecurityException e)
{
Console.WriteLine("SecurityException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
exit_code = 2;
}
// Thrown by: FileInfo (Constructor), FileStream (Constructor),
// BinaryReader (Constructor)
catch (System.ArgumentException e)
{
Console.WriteLine("ArgumentException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
#endregion
// Thrown by: any
catch(Exception e)
{
Console.WriteLine("Exception caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
}
// Show how call the program
else
{
Console.WriteLine("Syntax:\n" +
"\tcp_client_neoxite COPY_MODE local_filename remote_ip_address " +
"remote_filename\n\nCOPY_MODE:\n" +
"\tCREATE: Create the file only if it does not exist.\n" +
"\tOVERWRITE: Create the file in any case.\n" +
"local_filename: name of the file at the local side (client side). " +
"Ex:\n\tc:\\mydir\\myfile.ext (full path)\n" +
"\tmyfile.ext (only the filename, local path)\n" +
"remote_ip_address: IP address of the remote machine. Ex:\n" +
"\t127.0.0.1 (local copy)\n" +
"\t165.35.2.98 (remote copy)\n" +
"remote_filename: name of the file at the remote side (server " +
"side). Ex:\n\t\\..\\..\\myfile2.ext (copy the file two levels " +
"up from the server dir\n" +
"\tmyfile2.ext (copy the file in the dir in which the server is\n");
exit_code = 1;
}
return exit_code;
}
}
}
197
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
10.#.2.& CP2SERVER 2NEO(ITE
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace cp_server_neoxite
{
/// <summary>
/// Class Servidor_Neoxite: This class implements a server which can copy remote
/// files and modify files with remote parameters
/// </summary>
class Servidor_Neoxite
{
/// <summary>
/// The main entry point for the application.
/// The server receive first a message containing the operation it has to do:
/// *) COPY_REQUEST: remote copy of a file, transfer over IP and create
/// new
/// *) MOD_REQUEST: remote modification of a file on the server, do not
/// create a new file
/// *) ABORT: self message for exiting the program and stop listening
/// The server has two threads: the main thread listen at a specific port for
/// incoming requests, and the secondary thread is only for terminating
/// purposes (it reads the command line and when user enters "exit" it
/// finishes the program.
/// </summary>
[STAThread]
static void Main(string[] args)
{
string server_address = "servigar2.us.es"; // NEOXITE: 172.16.1.231
int server_port = 32000;
try
{
// Welcome message
Console.WriteLine("Server running at
NEOXITE:\n===========================");
// Just after that message, we start the secondary thread for aborting
Reader lector = new Reader();
Thread hilo_lector = new Thread(new ThreadStart(lector.KeyboardRead));
hilo_lector.Start();
// Allowed IPs for requesting
string[] allowed_ips = {"193.147.161.89", "193.147.160.155",
"172.16.1.4", "127.0.0.1", "172.16.1.231"};
bool salir = false; // Flag for exiting the main loop
string data = null; // Incoming data from the client.
byte[] bytes = new Byte[1024]; // Data buffer for incoming data.
// Create the local endpoint
IPHostEntry ipHostInfo = Dns.Resolve(server_address);
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, server_port);
// Create a TCP/IP socket.
Socket listener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp );
// Bind the socket to the local endpoint and listen for incoming
// connections.
198
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
listener.Bind(localEndPoint);
listener.Listen(10);
// Start listening for connections.
while (salir == false)
{
Console.WriteLine("\n\nWaiting for a connection...");
// Program is suspended while waiting for an incoming connection.
Socket handler = listener.Accept();
data = null;
// Filtering remote IP
string remoteIP =
((IPEndPoint)handler.RemoteEndPoint).Address.ToString();
Console.WriteLine("Incoming request from " + remoteIP);
bool allowed = false;
foreach (string ip in allowed_ips)
{
if (ip.CompareTo(remoteIP) == 0)
{
Console.WriteLine("Allowed IP => Processing request");
allowed = true;
break;
}
}
// If it is an allowed ip address (white list), go on...
if (allowed)
{
// Receiving the request message
bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
data += Encoding.ASCII.GetString(bytes,0,bytesRec);
// What does the user want to do?
String[] tokens = data.Split(new Char [] {'*'});
data = null;
FileStream fs_write = null;
BinaryWriter w = null;
long size = 0;
switch (tokens[0])
{
case "COPY_REQUEST":
#region COPY REQUEST: remote copy of a file
// Check the existence of the file to create.
// If it does not exist, create the new, empty data file.
string ack_msg = null;
int flag = 0;
if (File.Exists(tokens[4]))
{
if (tokens[1].CompareTo("CREATE") == 0)
{
flag = 1;
ack_msg = "DENIED*Destiny file already exists. " +
"Remote copy denied.\n";
Console.WriteLine("Destiny file already exists. " +
"Remote copy denied.\n");
}
else if (tokens[1].CompareTo("OVERWRITE") == 0)
{
flag = 2;
ack_msg = "PROCEED";
199
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
}
else
{
flag = 3;
ack_msg = "PROCEED";
}
// Sending the ack message
handler.Send(ASCIIEncoding.ASCII.GetBytes(ack_msg));
// If the ack_msg is PROCEED, go on with the writing
if (flag > 1)
{
Console.WriteLine("Received COPY request. " +
"Waiting for the data...");
// Create the writer for data.
// File will be overwrited
if (flag == 2)
fs_write = new FileStream(tokens[4], FileMode.Create);
// File does not exist
else if (flag == 3)
fs_write = new FileStream(tokens[4], FileMode.CreateNew);
else
Console.WriteLine("Internal error.\n");
w = new BinaryWriter(fs_write);
// Receiving the data (file)
size = 0;
Console.WriteLine("Starting receiving data...");
while (true)
{
bytes = new byte[1024];
bytesRec = handler.Receive(bytes);
size += bytesRec;
w.Write(bytes, 0, bytesRec);
if (size == Convert.ToInt64(tokens[3]))
break;
}
Console.WriteLine("File \"" + tokens[4] + "\" has " +
"been overwrited");
fs_write.Close();
w.Close();
}
break;
#endregion
case "MOD_REQUEST":
#region MODIFY REQUEST: remote modification of a file
Console.WriteLine("Received MODIFY request. " +
"Waiting for the data...");
// Sending the ack message
ack_msg = "PROCEED";
handler.Send(ASCIIEncoding.ASCII.GetBytes(ack_msg));
// Receiving the data to be added to the file
size = 0;
string text_modif = "";
Console.WriteLine("Starting receiving data...");
while (text_modif.Length != Convert.ToInt64(tokens[3]))
{
bytes = new byte[1024];
200
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
bytesRec = handler.Receive(bytes);
text_modif += Encoding.ASCII.GetString(bytes,0,bytesRec);
}
using (StreamWriter sw = new StreamWriter(tokens[4]))
{
sw.Write(text_modif);
}
break;
Console.WriteLine("File \"" + tokens[4] + "\" has " +
"been modified");
#endregion
case "ABORT":
salir = true;
break;
default:
Console.WriteLine("Request of the user is not allowed.\n");
break;
}
}
}
}
# region Specific CATCHS
// Thrown by: Thread (Constructor), Dns.Resolve, Socket.Bind,
// Socket.Receive, ASCIIEncoding.GetString, Socket.Send,
// Directory.GetFiles, File.Delete, FileStream (Constructor),
// BinaryWriter (Constructor), BinaryWriter.Write,
// String.IndexOf, File.CreateText, StreamWriter (Constructor)
catch (System.ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Thread.Start
catch (System.Threading.ThreadStateException e)
{
Console.WriteLine("ThreadStateException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Thread.Start, Dns.Resolve, Socket.Bind, Socket.Receive,
// FileStream (Constructor), StreamWriter (Constructor)
catch (System.Security.SecurityException e)
{
Console.WriteLine("SecurityException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Thread.Start
catch (System.OutOfMemoryException e)
{
Console.WriteLine("OutOfMemoryException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Thread.Start
catch (System.NullReferenceException e)
{
Console.WriteLine("NullReferenceException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Dns.Resolve, Socket (Constructor), Socket.Bind, Socket.Listen,
201
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// Socket.Accept, Socket.RemoteEndPoint, Socket.Receive, Socket.Send
catch (System.Net.Sockets.SocketException e)
{
Console.WriteLine("SocketException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: IPEndPoint (Constructor), ASCIIEncoding.GetString,
// FileStream (Constructor), BinaryWriter.Write, String.IndexOf,
// String.Substring
catch (System.ArgumentOutOfRangeException e)
{
Console.WriteLine("ArgumentOutOfRangeException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Socket.Bind, Socket.Listen, Socket.Accept,
// Socket.RemoteEndPoint, Socket.Receive, Socket.Send,
// BinaryWriter.Write, StreamWriter.WriteLine,
// StreamWriter.Write
catch (System.ObjectDisposedException e)
{
Console.WriteLine("ObjectDisposedException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Socket.Accept
catch (System.InvalidOperationException e)
{
Console.WriteLine("InvalidOperationException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Directory.GetFiles, File.Delete, File.CreateText,
// StreamWriter (Constructor)
catch (System.UnauthorizedAccessException e)
{
Console.WriteLine("UnauthorizedAccessException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Directory.GetFiles, File.Delete, FileStream (Constructor),
// BinaryWriter (Constructor), BinaryWriter.Write, Convert.ToInt64,
// File.CreateText, StreamWriter (Constructor)
catch (System.ArgumentException e)
{
Console.WriteLine("ArgumentException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Directory.GetFiles, File.Delete, FileStream (Constructor),
// File.CreateText, StreamWriter (Constructor)
catch (System.IO.PathTooLongException e)
{
Console.WriteLine("PathTooLongException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Directory.GetFiles, File.Delete, FileStream (Constructor),
// File.CreateText, StreamWriter (Constructor)
catch (System.IO.DirectoryNotFoundException e)
{
Console.WriteLine("DirectoryNotFoundException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
202
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
}
// Thrown by: File.Delete, File.CreateText, StreamWriter.Write
catch (System.NotSupportedException e)
{
Console.WriteLine("NotSupportedException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: FileStream (Constructor)
catch (System.IO.FileNotFoundException e)
{
Console.WriteLine("FileNotFoundException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Console.WriteLine, File.Delete, FileStream (Constructor),
// BinaryWriter.Write, StreamWriter.WriteLine, StreamWriter
// (Constructor), StreamWriter.Write
catch (System.IO.IOException e)
{
Console.WriteLine("IOException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Convert.ToInt64
catch (System.FormatException e)
{
Console.WriteLine("FormatException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Convert.ToInt64
catch (System.OverflowException e)
{
Console.WriteLine("OverflowException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
#endregion
// Thrown by: any
catch (Exception e)
{
Console.WriteLine("Exception caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
Console.WriteLine("\nPress ENTER to continue...");
Console.Read();
}
}
/// <summary>
/// Class Reader: this class implements a keyboard reader for exiting the
/// executable program. When user writes a line, it reads the command
/// line and if the sentence is "exit", the class sends a message to the
/// listening port on this machine to exit the socket loop of the class
/// Servidor_Servigar
/// </summary>
internal class Reader
{
public void KeyboardRead()
{
int server_port = 32000; // Server port for sending the data
string server_address = "193.147.161.89"; // Servigar2.us.es IP address
203
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
string opt = null; // Line entered
Socket s = null; // Socket descriptor
bool salir = false; // Flag for exiting the loop
IPHostEntry iphe = null;
while (salir == false)
{
try
{
Console.Write("(You can type \"exit\" at any moment to exit " +
"the program)\n");
opt = Console.ReadLine();
// If the user writes "exit", proceed with the termination process
if (opt.ToLower() == "exit")
{
// Format check of the IP address
IPAddress address = IPAddress.Parse(server_address);
if(address.AddressFamily == AddressFamily.InterNetwork)
{
// Check if the IP address is valid
iphe = Dns.Resolve(server_address);
foreach(IPAddress ipad in iphe.AddressList)
{
IPEndPoint ipe = new IPEndPoint(ipad, server_port);
// Open the socket
Socket tmpS =
new Socket(ipe.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
// Connect the socket
tmpS.Connect(ipe);
if(tmpS.Connected)
{
s = tmpS;
break;
}
else
continue;
}
if (s == null)
{
Console.WriteLine("Cannot connect the socket to the " +
"specified address.\n");
}
else
{
string msg = "ABORT";
s.Send(ASCIIEncoding.ASCII.GetBytes(msg));
salir = true;
}
}
}
}
#region Specific CATCHs
// Thrown by: Console.ReadLine, Console.WriteLine
catch(System.IO.IOException e)
{
Console.WriteLine("IOException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
204
SISTEMA DE GESTIN DOCUMENTAL A TRAVS DE INTERNET
// Thrown by: Console.ReadLine
catch(System.OutOfMemoryException e)
{
Console.WriteLine("OutOfMemoryException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: IPAddress.Parse, Dns.Resolve, Socket.Connect,
// ASCIIEncoding.GetBytes, Socket.Send
catch(System.ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: IPAddress.Parse
catch(System.FormatException e)
{
Console.WriteLine("FormatException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Dns.Resolve, Socket (Constructor), Socket.Connect,
// Socket.Send
catch(System.Net.Sockets.SocketException e)
{
Console.WriteLine("SocketException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Dns.Resolve, Socket.Connect
catch(System.Security.SecurityException e)
{
Console.WriteLine("SecurityException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: IPEndPoint (Constructor)
catch(System.ArgumentOutOfRangeException e)
{
Console.WriteLine("ArgumentOutOfRangeException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
// Thrown by: Socket.Connect, Socket.Send
catch(System.ObjectDisposedException e)
{
Console.WriteLine("ObjectDisposedException caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
#endregion
// Thrown by: any
catch(Exception e)
{
Console.WriteLine("Exception caught!!!");
Console.WriteLine("Source : " + e.Source);
Console.WriteLine("Message : " + e.Message);
}
}
}
}
}
205

You might also like