miércoles, 23 de diciembre de 2009

Convertir un Calendar a Date

Calendar cal=Calendar.getInstance();
Date date=cal.getTime();

viernes, 18 de diciembre de 2009

Añadir nuevo campo a una tabla existente

Para ello utilizamos la sentencia :

ALTER TABLE NOMBRE_TABLA ADD(nombre_campo tipo);

jueves, 3 de diciembre de 2009

Migrar la aplicacion a Tomcat6

Estoy migrando mi aplicacion con tomcat 5 a tomcart 6.

Le he metido el tomcat 6 y he arrncado y me ha aparecido el siguiente error:
java.lang.LinkageError: loader constraints violated when linking javax/el/ExpressionFactory
class
.

Al mirar en internet he encontrado que es un conflicto de la libreria EL, para ello le pusieramos un scope provided. Lo hice y me dejo de salir este error.

Normalmente suele ser el-api.jar y el-ri.jar para saber cual tenemos que excluir miramos en el lib de tomcat cual tenemos.

martes, 17 de noviembre de 2009

Crear un hilo

Vamos por ejemplo a crear un hilo para hacer una importación de datos a la base de datos.
Vamos a imaginarnos un proyecto en el que tenemos un enlace llamado "Importar Datos" al pinchar sobre se no va a un método que su código seria seria similar al siguiente:

public String actionImportarDatos(){

Thread hilo = new Thread() {
public void run() {

******* lineas de código para la inserción de datos ***********

}
};

hilo.start();
return null;
}

Esto nos servirá por ejemplo si después de pulsar el enlace queremos seguir navegando por la aplicación sin que se interrumpa la importación de datos.

Datamart

Un datamart es una base de datos con muchísimos datos al cual puedo realizar consultas rápidamente

Un datamart es un DataWarehouse a un nivel más pequeño.

Un datamart tendrá tablas llamadas DIMENSIONES y otras tablas llamadas de HECHO o FACT TABLE, estas tablas tendrán todas las combinaciones posibles de dichas DIMENSIONES.

También tendremos tablas detalles estas tablas son por ejemplo, tengo una tabla llamada empresa, otra tabla llamada datos personales y en empresa hay un id que hace referencia a datos personales, pues unimos estas dos tablas en una y será la de detalles.

La tabla de HECHO también llamada agregada, es la tabla central de un sistema dimensional. Esta tabla es final no se puede crear mas a partir de ella.Esta tablas su claves serna los id relaciones con las tablas que estan relacionadas.

Por ejemplo tengo una tabla empresas, otra operaciones, otra provincia, otra clientes pues la tabla hecho seria una tabla con los id de cada tabla mas alguno campos necesarios dependiendo de lo que queramos mostrar. Serán datos numéricos que se pueden resumir para proporcionar información sobre el historial de las operaciones de la organización.

Modificar nombre y tipo de una columna

Para modificar el nombre y el tipo utilizamos la siguiente instrucción:

ALTER TABLE nombre_tabla RENAME COLUMN columna_antigua TO columna_nueva;
ALTER TABLE nombre_tabla MODIFY columna tipo_nuevo;

viernes, 13 de noviembre de 2009

Dependencias de un jar

He necesitado una librería nueva en mi proyecto, pero para meterla en el pom.xml necesitaba saber el groupId,artifactId.

Para ello me he descargado la librería la he descomprimido, he entrado en la carpeta META-INF/MANIFEST.MF.

Lo abrimos , abrimos un navegador y entramos en esta dirección http://mvnrepository.com, aquí buscamos la librería , entramos dentro y comparamos los manifiest y vemos que tienen el mismo tamaño y las mismas cosas, si copiamos el codigo con groupId,artifactId que no viene en esa página en nuestro pom.xml ,hacemos maven para que se la descargue y ya tenemos nuestra librería en el proyecto.

miércoles, 11 de noviembre de 2009

Crear una tarea a una hora determinada

Para ello vamos a utilizar la clase java.util.TimerTasK y Timer.

La clase TimerTask tiene un metodo run que es como los Thread, lo que contiene el metodo run es lo que se va a ejecutar cada cierto periodo.

La clase Timer la utilizamos para para programar tareas para ejecutar en el futuro en un hilo de fondo. Las tareas se pueden programar para un tiempo de ejecución, o para la ejecución repetida a intervalos regulares.

En mi proyecto lo he colocado en la clase que arranca el proyecto, dentro de esa clase me he creado un clase interna:

class ImportarDatos extends TimerTask {
public void run() {
//// Damos baja prioridad al hilo
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

*********************tareas a realizar*****************************

}

Y dentro de la clase del listener me he creado lo siguiente:

System.out.println("*************************************");
System.out.println("* Iniciando recarga Datos...*");
System.out.println("*************************************");
try{
Timer timer= new Timer();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR, 2);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.AM_PM, 0);
Date date = calendar.getTime();
timer.schedule(new ImportarDatos(), date, 24 * 60 * 60 * 1000);
}catch (Exception e) {
log.debug("Error no controlado");
}
System.out.println("");

Cada vez que arranque la aplicacion se ejecutara esta tarea y tambien a la hora que le hmos puesto, hay que saber que la hora es una menos si yo he puesto a las 2 de la madrugada se ejecutara a la 1.

viernes, 6 de noviembre de 2009

Creando nueva base de datos

Estoy empezando a crear una base de datos desde cero para una aplicación de mi empresa.

Nosotros nos creamos unos ficheros para luego utilizarlos en la instalación.
Los ficheros que nos creamos son:
  1. Crear fichero con las tablas.
  2. Crear fichero con las constraints de las tablas.
  3. Crear fichero con los índices necesarios.
  4. Crear fichero con las secuencias de las tablas.
  5. Crear fichero con los triggers.
  6. Crear fichero con los views.
  7. Crear fichero con los insert de las tablas.
  8. Crear fichero con los permisos a las tablas
  9. Crear ficheros de sinónimos.
Voy a explicar como hago cada ficheros y que es cada cosa:

Fichero de las tablas
En este fichero vamos a tener la instrucción siguiente para crear las tablas que necesitemos:

CREATE TABLE NOMBRE_TABLA(
campo1 tipo de variable (number, varchar,.....) null or not null,
campo2 tipo de variable (number, varchar,.....) null or not null,
campo3 tipo de variable (number, varchar,.....) null or not null,
....... tipo de variable (number, varchar,.....) null or not null,
);

Fichero con las constraints
La cláusula constraints la utilizamos para crear o eliminar índices que pueden ser único o múltiples.
Puede ir seguido de:
  • UNIQUE --> para decir que el valor de ese campo es único
  • PRIMARY KEY -->crea un índice primario el campo o los campos especificados. Todos los campos de la clave principal deben ser únicos y no nulos, cada tabla sólo puede contener una única clave principal.
  • FOREIGN KEY -->crea un índice sobre el campo cuyo valor sera el contenido de otro campo de otra tabla o de la misma. Puede ser null y se pueden crear varias claves ajenas
En este fichero vamos a crear las claves primarias por cada tabla que hayamos creado:
ALTER TABLE NOMBRE_TABLA ADD (
CONSTRAINT PK_NOMBRE_TABLA PRIMARY KEY (campo));

Fichero de los índices
Yo me he creado un fichero de índices para las tablas que tiene muchos datos , así las búsquedas serán más rápidas,los índices se crean sobre el o los campos que vayamos mas a utilizar, la sentencia para crear índices es la siguiente:

CREATE UNIQUE INDEX NOMBRE_INDICE ON TABLA(campo);

Fichero de las secuencias
Para la generación de códigos numéricos automáticos utilizamos las secuencias

CREATE SEQUENCE
[MINVALUE ] -->valor mínimo de la secuencia
[MAXVALUE ]--> valor máximo de la secuencia
[START WITH ]--> por el numero que va a empezar la secuencia
[INCREMENT BY ] --> valor que va a incrementar cada vez que insertemos
[NOCACHE | CACHE ]--> se utiliza para que la generación de secuencia vaya mas rápido
[CYCLE] ;-->nocycle or cycle, si ponemos cycle cuando llega al MAXVALUE volvera a empezar desde el MINVALUE, esto puede que no cree exclusividad y si ponemos nocycle nos saldrá un error:
RDB%-E-SEQNONEXT, el siguiente valor para la secuencia "NOMBRE SECUENCIA" no está disponible.

Ficheros con los triggers
Los triggers son disparadores que se ejecuta cuando se cumple una condición establecida al realizar un INSERT, UPDATE o DELETE.
Si vamos a necesitar triggers nos creamos este archivo, la sintaxis de un trigger con update podría ser la siguiente:

CREATE TRIGGER nombre_trigger
BEFORE UPDATE ON nombre_tabla
REFERENCING NEW ROW AS campo,OLD ROW AS campo
FOR EACH ROW
condición THEN
END IF;

Fichero de views
Las vistas (views) son consultas, que refleja el contenido de una o más tablas, desde la que se puede acceder a los datos como si fuera una tabla. Así obtenemos seguridad en nuestras tablas sino queremos que el usuario acceda a otras datos de las tablas.O nos evitamos el escribir complejas sentencias sql.

Fichero de insert
En este fichero vamos a tener las sentencias sql de inserción de datos de las tablas.

Fichero de permisos (grant)
Concede permiso a un usuario sobre las tablas o vistas. Permiso de SELECT,INSERT, DELETE o UPDATE.

Ficheros de sinónimos
Este fichero contiene las sentencia de creación de sinónimos sobre las tablas o vistas, esto quiere decir que una tabla o vista puede tener dos nombre diferentes, el de la tabla y el de sinónimo que hace referencia a esa tabla. Los sinónimos nos proporciona la ventaja de independizar las tablas físicas de las aplicaciones y que un usuario acceda a otra tablas de otro usuario si tiene permisos para ello.

martes, 3 de noviembre de 2009

Barra de progreso con Rich Faces

Estoy importando unos datos y para que el usuario no se crea que no esta haciendo nada la aplicacion he creado una barra de progreso para que veo como va la importación de datos.

Para ello he utilizado las etiquetas siguiente:

y el metodo en mi clase que hace la importacion es :

public String actionImportarDatos(){
progreso = 1;
enProgreso = true; //sino esta a true no sale la barrita

List listadoDatosImportar = new LinkedList();
listadoDatosImportar =método para rellenar esta lista con los datos que voy a importar;

total = listadoDatosImportar.size();
for (DatosIMportar datos : listadoDatosImportar) {
progreso++;

BO. save(datos); //en el BO tengo un metodo que guarda ese dato importado en la tabla.

}

mensaje = "Libros importados correctamente";
return null;
}


public int getPorcentaje() {
try {
return Math.min(progreso * 100 / total, 100);
} catch (ArithmeticException e) {
return 0;
}
}

jueves, 22 de octubre de 2009

Primeros pasos con Pentaho Report Designer

Me han pedido en mi trabajo unos informes con datos ,graficas de la aplicacion que estamos haciendo y me han dicho que tiene que ser con Pentaho.

Me descargue la version 1.7 Pentaho Report Designer y empece a hacer pruebas con la aplicación.

Voy a explicar lo que he aprendido hasta ahora, pues llevo con esto desde ayer.

La carpeta que me baje tenia 3 archivos :
  1. startdesigner.bat --> windows
  2. startdesigner_linux.sh --> linux
  3. startdesigner_osx.sh --> mac
Yo utilo el de linux, para ejecutar el programa tuve que darle persimos de ejecucion al archivo y luego doble click y la pantalla que me aparecio fue la siguiente:



Vemos a la izquierda un menu lateral que contiene los elementos de diseño como gráficas lineas etc..., que puede tener un reporte.

Para crear un reporte nuevo , le damos a File Report Wizar para darle formato al reporte y la base de datos que vamos a utilizar.

Si le damos ala pestaña Design que hay en el centro de la aplicacion nos vamos directamente al reporte con el diseño basico y para decirle que base de datos vamos autilizar en la parte derecha donde pone Data Source pinchamos con el boton derecho y elegimos Añadir.

Para elegir la base de datos nos saldra una pantalla similar a la siguiente:

En esta pantalla podemos elegir entre 3 tipos de bases de datos:
  1. JNDI
  2. Xquery
  3. MQL
Una vez que hayamos elegido el tipo de base de datos por ejemplo yo escogi la de JNDI y le di a añadir,me salio una pantalla para meter los datos de conexion a la base de datos.
Metemos los datos necesario y se nos añade al listado.

Para realizar una consulta sore la cula queremos el inform le damos a "Query Designer" :

Abajo a la izquierda nos saldra un listado con las tablas de nuestra base de datos, para hacer la consulta sobre la o las que queramos pinchamos sobre ella y la arrastramos a la parte derecha.

Sobre las tablas que hemos elegido podemos selecionar los campos que quermos que se muestren en el report y realizar operacion de sum(), conunt() etc.. sobre los campos.

Para ello nos ponemos encima del campo y pinchamos boton derecho. También podemos escribir la query a mano.

Una vez hecho la consulta le damos a Ok y se nos abre la pantalla con los datos elegido, podemos meterle grafico lineas, etc.... para ello elegimo de la paleta izquierda el componente a añadir y lo arrastramos al centro.

Cuando tengamos listo el reporte le damos a File /Create Report.

En otro explicare el crear un gráfico.

miércoles, 14 de octubre de 2009

Datawarehouse

http://www.sinnexus.com/business_intelligence/datawarehouse.aspx

Datamart

Un Datamart es una base de datos departamental, especializada en el almacenamiento de los datos de un área de negocio específica. Se caracteriza por disponer la estructura óptima de datos para analizar la información al detalle desde todas las perspectivas que afecten a los procesos de dicho departamento.

Por tanto, para crear el datamart de un área funcional de la empresa es preciso encontrar la estructura óptima para el análisis de su información, estructura que puede estar montada sobre una base de datos OLTP, como el propio datawarehouse, o sobre una base de datos OLAP. La designación de una u otra dependerá de los datos, los requisitos y las características específicas de cada departamento. De esta forma se pueden plantear dos tipos de datamarts:

  • Datamart OLAP --> Se basan en los populares cubos OLAP, que se construyen agregando, según los requisitos de cada área o departamento, las dimensiones y los indicadores necesarios de cada cubo relacional. El modo de creación, explotación y mantenimiento de los cubos OLAP es muy heterogéneo, en función de la herramienta final que se utilice.
  • Datamart OLTP -- >Pueden basarse en un simple extracto del datawarehouse, no obstante, lo común es introducir mejoras en su rendimiento (las agregaciones y los filtrados suelen ser las operaciones más usuales) aprovechando las características particulares de cada área de la empresa. Las estructuras más comunes en este sentido son las tablas report, que vienen a ser fact-tables reducidas (que agregan las dimensiones oportunas), y las vistas materializadas, que se construyen con la misma estructura que las anteriores, pero con el objetivo de explotar la reescritura de queries (aunque sólo es posibles en algunos SGBD avanzados, como Oracle).

Información sacada del siguiente enlace:
http://www.sinnexus.com/business_intelligence/datamart.aspx

Alterian

Es un software cuyo funcionamiento se basa en bases de datos optimizadas con el fin de realizar consultas mas rapidas sobre una cantidad de datos grandes.

Para ello el SGBD indexas las columnas y traspone las filas de las tablas por columnas.

miércoles, 7 de octubre de 2009

lunes, 28 de septiembre de 2009

Lenguaje Ensamblador

Lenguaje de bajo nivel que se utiliza para escribir programas informaticos.Estos programas son generalmente más rápidos y consumen menos recursos del sistema.

lunes, 21 de septiembre de 2009

Manual de Log4j

He visto en internet un manual sobre esto, aqui dejo el enlace:

http://emmersonmiranda.blogspot.com/2009/09/manual-de-log4j-1215.html

lunes, 31 de agosto de 2009

SimpleDateFormat

La clase SimpleDateFormat nos ayuda a mostrar las fechas en el formato que queramos o a reconstruirlas a partir de una cadena de texto.

Si queremos por ejemplo obtener un fecha en formto dd/mm/aaaa seri de la siguente forma:

SimpleDateFormat parsear = new SimpleDateFormat("dd/MM/yyyy");

pasear.format(fecha);

Donde fecha es la que vamos a formatear.

Podemos realizar otras funciones para mas información mirar en la API

jueves, 6 de agosto de 2009

Tipos de Threads

Existen varios tipos de threads que pueden aparecer en una aplicación:

* Threads completamente independientes, que realizan tareas no relacionadas. Como el caso de imprimir un documento.
* Threads que trabajan con una misma tarea, es decir se ayudan entre ellos, pero sin interferir ni intercambiar relación entre ellos. Por ejemplo, threads que colaboran en el producto de dos matrices, ocupándose cada una de ellas de calcular ciertas filas de la matriz producto.
* Threads que utilizan recursos de modo mutuamente exclusivo, aunque sin tener que coordinar sus actividades. Este ocurre en los threads que intentan leer o actualizar un registro en la base de datos.
* Threads que deben coordinar sus actividades, de modo que una de ellas no puede empezar o continuar hasta que la otra haya realizado su tarea. Un ejemplo muy conocido es el problema del productor-consumidor .

Threads

Los threads o hilos de ejecución son segmentos de código de un prograna que se ejecutan secuencialmente de modo independiente de las otras partes del programa.

Utilizamos los threads en un programa para aislar y sincronizar tareas.Cada hilo se encarga de una parte del programa, por ejemplo:
  • tranferencia de ficheros
  • pintar los graficos
  • conectar a la base de datos.

La clase Thread desciente de Object e implementa la interface Runnable y no es necesario importarlas a nuestro programa ya que se encuentran dentro del paquete java.lang.

Método sleep()

Este método le dice al Thread que duerma durante los milisegundos especificados entre sus paréntesis.

Se debería utilizar cuando se pretenda retrasar la ejecución del hilo.

El sleep() no consume recursos del sistema, mientras duerme el hilo, los demás hilos se siguen ejecutando sin problema alguno

viernes, 24 de julio de 2009

Leer Pdf desde Java

Vamos a utilizar la libreria PDFBox, que nos permite manejar diferntes tipos de PDF y convertir pdf a texto.

Mediante lineas de comando convertimos el pdf en un archivo de texto.

Aqui tenemos un ejemplo de una clase para Leer PDF

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.util.List;

import org.pdfbox.cos.COSDocument;
import org.pdfbox.pdfparser.
PDFParser;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDDocumentInformation;
import org.pdfbox.util.PDFTextStripper;

public class LeerPDF {

PDFParser parser;
String parsedText;
PDFTextStripper pdfStripper;
PDDocument pdDoc;
COSDocument cosDoc;
PDDocumentInformation pdDocInfo;

// PDFTextParser Constructor
public LeerPDF() {
}

// Extract text from PDF Document
public String pdftoText(String fileName) {

//System.out.println("Parsing text from PDF file " + fileName + "....");
File f = new File(fileName);

if (!f.isFile()) {
System.out.println("File " + fileName + " does not exist.");
return null;
}

try {
parser = new PDFParser(new FileInputStream(f));
} catch (Exception e) {
System.out.println("Unable to open PDF Parser.");
return null;
}

try {
parser.parse();
cosDoc = parser.getDocument();
pdfStripper = new PDFTextStripper();
pdDoc = new PDDocument(cosDoc);
parsedText = pdfStripper.getText(pdDoc);
} catch (Exception e) {
System.out.println("An exception occured in parsing the PDF Document.");
e.printStackTrace();
try {
if (cosDoc != null) cosDoc.close();
if (pdDoc != null) pdDoc.close();
} catch (Exception e1) {
e.printStackTrace();
}
return null;
}
System.out.println("Done.");
return parsedText;
}

// Write the parsed text from PDF to a file
/* void writeTexttoFile(String pdfText, String fileName) {

System.out.println("\nWriting PDF text to output text file " + fileName + "....");
try {
PrintWriter pw = new PrintWriter(fileName);
pw.print(pdfText);
pw.close();
} catch (Exception e) {
System.out.println("An exception occured in writing the pdf text to file.");
e.printStackTrace();
}
System.out.println("Done.");
}*/

// Extracts text from a PDF Document and writes it to a text file
public static void main(String args[]) {

/* if (args.length != 2) {
System.out.println("Usage: java PDFTextParser ");
System.exit(1);
}*/

LeerPDF pdfTextParserObj = new LeerPDF();
//String pdfToText = pdfTextParserObj.pdftoText(args[0]);
String pdfToText = pdfTextParserObj.pdftoText("C:/datos/Java2.pdf");
System.out.println(pdfToText);

/* if (pdfToText == null) {
System.out.println("PDF to Text Conversion failed.");
}
else {
System.out.println("\nThe text parsed from the PDF Document....\n" + pdfToText);
// pdfTextParserObj.writeTexttoFile(pdfToText, args[1]);

pdfTextParserObj.writeTexttoFile(pdfToText, "C:/datos/Java2.txt");
}*/
}
}

jueves, 2 de julio de 2009

Jaxb

http://www.programacion.com/java/tutorial/jaxb/

lunes, 29 de junio de 2009

Convertir tipo File a InputStream y viceversa

Para convertir de file a inputstream:

InputStream is = new FileInputStream (file);

Para convertir de inputstream a file:

byte[] data = IOUtils.toByteArray(inputStream);
File temportal = new File("/tmp/" + nombreFichero);
org.apache.commons.io.FileUtils.writeByteArrayToFile(temportal, data);

lunes, 22 de junio de 2009

Crear Excel desde Java

Introducción
POI consiste en APIs para manipular varios formatos de ficheros basados en el formato de Documento Compuesto OLE 2 de Microsoft, utilizando Java puro. En concreto, se pueden leer y escribir ficheros MS Excel utilizando Java.

Voy a poner un ejemplo que yo tuve que hacer:

public class Prueba(){

public String actionExportarExcel(){
ExportarUtils exportar= ExportarUtils.getInstance();
Vector v= new Vector();
// cabecera del excel
v.addElement("Cabecera1, cabecera2,....");
v.addElement(dato1, dato2,dato3,........);

// Generar el fichero
try {
exportar.crearExcel(v, "Titulo", "nombreFichero.xls");
} catch (Exception e) {
log.debug(e.getMessage());
}
return null;
}
}//fin de clase

//Clase para la preparacion del fichero Excel

import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.StringTokenizer;
import java.util.Vector;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;



public class ExportarUtils {
private ExportarUtils() {
}

public static ExportarUtils getInstance() {
if (singleton == null) {
singleton=new ExportarUtils();
}
return singleton;
}

public static void createCell(HSSFRow row, short i, String value, HSSFCellStyle style) {
HSSFCell cell = row.createCell(i);
value = value+" ";
cell.setCellValue(value);
// si no hay estilo, no se aplica
if (style != null)
cell.setCellStyle(style);
}

public void crearExcel(Vector v, String namesheet, String filename)
throws Exception {
try {
workbook = new HSSFWorkbook();
HSSFSheet sheet=workbook.createSheet("Nueva Hoja");
int filas = v.size();
for (int i = 0; i < filas; i++) {
String fila = (String) v.elementAt(i);
StringTokenizer st = new StringTokenizer(fila, ",");
HSSFRow row = sheet.createRow((short) i);
int j = 0;
while (st.hasMoreTokens()) {
String token = st.nextToken();
// para la cabecera, la primera fila, aplicamos un estilo (negrita y color de fondo azul)
if (i == 0) {
HSSFCellStyle style = workbook.createCellStyle();
//style.setFillForegroundColor(IndexedColors.BLUE_GREY.getIndex()); );

style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short)10);
font.setFontName("Courier New");
font.setItalic(true);
// font.setStrikeout(true);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//font.setColor(Short.parseShort("#ffffff"));
style.setFont(font);
createCell(row, (short)j, token, style);
} else
createCell(row, (short)j, token, null);

j = j + 1;

}

}

// Asignar automaticamente el tamaño de las celdas en funcion del contenido
//for (int i = 0; i < filas; i++) {
sheet.setDefaultColumnWidth((short) 55);
// }

// Escribir el fichero.
FileOutputStream fileOut = new FileOutputStream(filename);
workbook.write(fileOut);
fileOut.close();

} catch (Exception e)
{
e.printStackTrace();
}
}


Aui en este enlace bien mejor explicado POI

miércoles, 10 de junio de 2009

Problema con File

Necesitaba saber si un fichero es correcto o no y para ello utilicé :

File fichero = new File(rutaFichero);
if(fichero.exists()){

}

Pues esto siempre me decía que no existía ese fichero cuando si existía perfectamente.Entonces vi que había una opción de createNewFile() lo utilicé en vez del exists() y esto si me funcionaba, y me dijeron que esto podía ser porque File crea una referencia pero puede ser que todavía no se ha relacionado con el fichero físico y por eso me daba siempre false al comprobarlo con exists().

Una vez hecho esto del createNewFile ya si podemos hacerle el exists().

martes, 9 de junio de 2009

INNER CLASS

Una clase embebida es una clase que se define dentro de otra.

Se puede definir una clase embebida de la siguiente forma:
class Externa {
. . .
class Interna {
. . .
}

Una diferencia importante es que un objeto de la clase embebida está relacionado siempre con un objeto de la clase que la envuelve, de tal forma que las instancias de la clase embebida deben ser creadas por una instancia de la clase que la envuelve. Desde el exterior estas referencias pueden manejarse, pero calificandolas completamente, es decir nombrando la clase externa y luego la interna. Además una instancia de la clase embebida tiene acceso a todos los datos miembros de la clase que la envuelve sin usar ningún calificador de acceso especial (como si le pertenecieran).

martes, 26 de mayo de 2009

Interface

Los Interfaces son unas clases completamente abstractas que contiene sólo una colección de métodos abstractos y propiedades constantes.

Algunas especificaciones para interfaces:



  • Puede contener solo variables estáticas.
  • Las interfaces pueden extender otras interfaces.En este caso la clase que implemente una interface que extiende de otra interface tiene que implementar todos los métodos de ambas interfaces.
  • Una clase puede implementar cualquier número de interfaces.
  • Una interfaz es implícitamente abstracta. 
  • No es necesario utilizar la palabra clave abstracta al declarar una interfaz.
  • Cada método en una interfaz también es implícitamente abstracto, por lo que la palabra clave abstracta no es necesaria. Esto era antes de Java 8, con esta versión una inteface puede tener un método default o static y con cuerpo.
  • Los métodos en una interfaz son implícitamente públicos.
  • Las variables declaradas en una interfaz no son variables de instancia. En cambio, son implícitamente public, final, y static, y deben inicializarse.  
  • Los métodos son abstratos, default o static pero no ambos.
  • Una clase puede heredar de una sola superclase, pero puede implementar múltiples interfaces.








  • Normas de Nomenclatura

    Esto hace que los programas sean más fáciles de leer y estándar
    • Clases--> Los nombres de clases deben ser palabras completas, en mayúsculas y minúsculas, con la primera letra de cada palabra en mayúscula. Los nombres de clases deben ser simples y descriptivos, utilizando palabras completas y acrónimos o abreviaturas (a no ser que la abreviatura sea ampliamente conocida, como URL o HTML). Por ejemplo: class Coche ,class EmpresaProductora.
    • Interfaces--> Siguen las mismas reglas que las clases. Por ejemplo: interface AlmacenarCoche, class Almacen.
    • Métodos-->Los métodos deberían ser verbos, en mayúsculas y minúsculas, con la primera letra en minúscula, y la primera letra de cada una de las palabras internas en mayúscula. Por ejemplo: correr(), numeroRuedas(), pintarCoche().
    • Variables--> Todas los nombres de variables de instancia o de clase deben estar constituidos por palabras con la primera letra de la primera palabra en minúscula y la primera letra de las palabras internas en mayúscula.Los nombres de variables deben ser cortos y significativos. La elección de un nombre de variable debe ser mnemotécnico, es decir, pensado para que un lector casual al verla comprenda su uso. Se deben evitar las variables de una sola letra, excepto en variables temporales de corto uso. Nombres comunes para este tipo de variables son: i, j, k, m y n para enteros; c, d y e para caracteres.Por ejemplo: int i; char *cp, float miVariable.
    • Constantes-->Los nombres de variables declaradas como constantes de clase y constantes ANSI, deberías escribirse siempre en mayúsculas, con las palabras internas separadas por el signo de subrayado ("_"). Las constantes ANSI se deben evitar en lo posible, para facilitar la depuración del código. Por ejemplo int MIN_WIDTH = 4;

    miércoles, 20 de mayo de 2009

    Métodos y Variables estáticas

    Los utilizamos para realizar acciones que no están asociados a ningún objeto en particular, son
    comunes para todos los objetos de la clase.

    Para acceder a ellos ponemos NombreClase.metodoStatic, no se instancia como los métodos y variables objetos.

    No conviene usar muchos métodos estáticos, pues si bien se aumenta la rapidez de ejecución, se pierde flexibilidad, no se hace un uso efectivo de la memoria y no se trabaja según los principios de la Programación Orientada a Objetos.

    Para crear atributos o métodos estaticos se usa la palabra static.
    static String nombre
    static int nombreMetodo(){}

    lunes, 18 de mayo de 2009

    Errores de lógica

    Los errores de lógica son conocidos como BUGS. Estos son los errores que nos tomarán tiempo hasta encontrarlos
    Puede costar encontrarlo y para ello hacemos el debug cuando suceden errores de lógica, para ir viendo pasao a paso el programa y ver donde hemos podio fallar.

    Errores de ejecución

    Los errores en tiempo de ejecución son errores que aparecen mientras se ejecuta su programa. Estos errores aparecen normalmente cuando su programa intenta una operación que es imposible que se lleve a cabo.

    Errores de compilación

    Los errores de compilación son errores que impiden que su programa se ejecute, es decir si el compilar Java (javac) no puede reconocer la sentencia,este devuelve un mensaje de error, usualmente con una línea de código de referencia. También se conoce a los errores de sintaxis como errores en tiempo de compilación.

    Variables

    Las variables son la manera en que indicamos al compilador el espacio en memoria que debe de reservar para almacenar la información.

    Las variables pueden ser de 2 tipos:
    • primitivo--> int, char, long,byte,boolean,float,double.Estas variable tiene el valor asignado directamente .
    • referenciadas-->no tienen el valor directamente sino que apuntan a una espacio de memoria donde se encuentra el valor,(los objetos).

    Clases

    Una clase es una agrupación de datos (variables o campos) y de funciones (métodos) que operan sobre esos datos.

    Estrcutura de una clase:

    acceso class nombre clase{

    //cuerpo

    }

    Las características de una clase son las siguientes:
    • 1) Todas las variables y funciones de Java deben pertenecer a una clase.
    • 2) Si una clase deriva de otra (extends), hereda todas sus variables y métodos.
    • 3) En un fichero se pueden definir varias clases, pero en un fichero no puede haber más que una clase public.
    • 6) Si una clase contenida en un fichero no es public, no es necesario que el fichero se llame como la clase.
    • 7) Los métodos de una clase pueden referirse de modo global al objeto de esa clase al que se aplican por medio de la referencia this.
    • 8) Las clases se pueden agrupar en packages, introduciendo una línea al comienzo del fichero (package packageName;).

    Métodos

    Un método es una función que puede ser llamado desde dentro de la clase o de otra clase.

    Un método puede devolver datos o nada, en el caso que no se devuelva nada como tipo de retorno void.

    Si el metodo que estamos creando recibe una lista de argumentos la forma de ponerlo seria
    acceso tipoRetorno nombre_metodo(TipoVariable arg1, TipoVariable arg2, ....)

    Los métodos se crean de la siguiente manera:

    acceso tipodeRetorno nombre_método(lista de arguementos){
    //cuerpo
    }

    La llamada al método, se realiza poniendo el nombre y pasandole los argumentos en el caso que tuvieran.Por ejemplo:

    int actionCalcular(int num1, int num2){
    int suma=0;
    suma=num1+num2;

    return suma
    }

    Los método tambien tiene modificadores de acceso.En java hay 4 tipos de accesos a los métodos:
    1. public-->todo el mundo accede a este método, ya sea desde otra clase, paquete, subclase, ....
    2. private--> sólo acceden se al método dentro de la misma clase.
    3. protected-->pueden acceder a este mñetodo los que esten en el mismo paquete, la misma clase y su subclases.
    4. predeterminado-->pueden acceder la misma clase y los que estén en el mismo paquete.

    Constantes

    En Java, se utiliza la palabra clave final para indicar que una variable debe comportarse como si fuese constante, significando con esto que no se permite su modificación una vez que haya sido declarada e inicializada.

    Como es una constante, se le ha de proporcionar un valor en el momento en que se declare, por ejemplo:

    class Prueba {
    final int version = 1';
    . . .
    }

    Si se intenta modificar el valor de una variable final desde el código de la aplicación, se generará un error de compilación.

    Si se usa la palabra clave final con una variable o clase estática, se pueden crear constantes de clase, haciendo de esto modo un uso altamente eficiente de la memoria, porque no se necesitarán múltiples copias de las constantes.

    La palabra clave final también se puede aplicar a métodos, significando en este caso que los métodos no pueden ser sobreescritos.

    Literales

    Un valor constante en Java se crea utilizando una representación literal de él.

    String nombre--> donde nombre es el literal.

    Java utiliza 5 tipos de elementos:

    Enteros:

    • byte 8 bits complemento a dos
    • short 16 bits complemento a dos
    • int 32 bits complemento a dos
    • long 64 bits complemento a dos

    Reales en coma flotante:

    • float 32 bits IEEE 754
    • double 64 bits IEEE 754

    Booleanos:

    • true
    • false

    Caracteres:

    Por ejemplo: a \t \u???? [????] es un número unicode

    Cadenas:

    Por ejemplo: “Esto es una cadena literal”

    lunes, 11 de mayo de 2009

    Definir mi proyecto como repositorio.

    Si queremos acceder a un repositorio que no esa el que tenemos en local, tenemos que crearnos una etiqueta mirror en el fichero setting.xml de la carpeta configuracion de maven.


    En esa etiqueta ponemos todo lo necesario para conectarsno al repositorio, id, url y mirrorof

    El proyecto lo exportamos como jar al repositorio que quieras indicandolo en el pom, con el comando mvn deploy.

    viernes, 8 de mayo de 2009

    Abstracción

    Permite capatar las caraterísticas esenciales de un objeto, asi como su comportamiento.

    Vamos a ver un ejemplo, el de un automovil, que es que todo el mundo usa a la hora de explicar esto.
    Veamos lo que podemos abtraer del automovil:
    • marca
    • modelo
    • nº de puertas
    • color
    Ahora veamos las caracterisiticas semenjantes:
    • arrancar.
    • frenar.
    • acelerar
    La abstracción es clave para diseñar un buen software.

    IBATIS

    Es un framework de código abierto basado en capas que se ocupa de la capa de Persistencia.

    Puede ser implementado en Java y .NET (también existe un port para Ruby on Rails llamado RBatis).

    Asocia objetos de modelo (JavaBeans) con sentencias SQL o procedimientos almacenados mediante ficheros XML, simplificando la utilización de bases de datos.

    A diferencia de Hibernate, se necesitan conocimientos de sql, permite la optimización de las consultas, ya sea con lenguaje estándar o con SQL propietario del motor de base de datos utilizado. Con iBATIS, siempre se sabe lo que se está ejecutando en la base de datos, y tiene herramientas para evitar el problema de las “N + 1 consultas” y para generar consultas dinámicas muy potentes.

    Se configura mediante un fichero XML de configuración, sql-map-config.xml.
    Además cada objeto de modelo, que representa al objeto en la aplicación, se relaciona con un fichero del tipo sqlMap.xml, que contiene sus sentencias SQL. Por ejemplo, un objeto Java Usuario con un objeto XML usuario.xml.

    Es posible subdividir la capa de Persistencia en tres subcapas:

    • La capa de Abstracción será el interfaz con la capa de la lógica de negocio, haciendo las veces de “facade” entre la aplicación y la persistencia. Se implementa de forma general mediante el patrón Data Access Object (DAO), y particularmente en iBATIS se implementa utilizando su framework DAO (ibatis-dao.jar).
    • La capa de Framework de Persistencia será el interfaz con el gestor de Base de Datos ocupándose de la gestión de los datos mediante un API. Normalmente en Java se utiliza JDBC; iBATIS utiliza su framework SQL-MAP (ibatis-sqlmap.jar).
    • La capa de Driver se ocupa de la comunicación con la propia Base de Datos utilizando un Driver específico para la misma.

    Toda implementación de iBATIS incluye los siguientes componentes:

    • Data Mapper: proporciona una forma sencilla de interacción de datos entre los objetos Java y .NET y bases de datos relacionales.
    • Data Access Object: abstracción que oculta la persistencia de objetos en la aplicación y proporciona un API de acceso a datos al resto de la aplicación

    martes, 5 de mayo de 2009

    Tipos de Clases

    Existen varios tipos de clases en java:
    • abstract --> esta clase tiene al menos un método abstracto, no se instancia y se utiliza como clase base para herencia. La clase que deriva de esta tiene que declarar e implementar todos los métodos de la clase abstracta que sean abstracto, sino daria un error de compilación. Lo métodos no pueden ser privados o staticos sino no se pueden acceder a ellos. Ejemplo
    abstract class Prueba {

    abstract metodo1();
    abstract void metodo2();
    void metodo3(){ //implementación }

    }

    public class Prueba2 extends Prueba{

    void metodo1(){ //implementación }
    void metodo2(){ //implementación }

    }
    • synchronizable --> Este modificador especifica que todos los métodos definidos en la clase son sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de colocar los flags necesarios para evitarlo. Este mecanismo hace que desde threads diferentes se puedan modificar las mismas variables sin que haya problemas de que se sobreescriban.
    • public -->Las clases public son accesibles desde otras clases, bien sea directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes, primero tienen que ser importadas.
    • final -->esta se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final. Por ejemplo, la clase Math es una clase final.

    lunes, 4 de mayo de 2009

    Calendar

    Calendar es una clase abstracta base para convertir entre un objeto de tipo Date (java.util.Date) y un conjunto de campos enteros como YEAR (año), MONTH (mes), DAY (día), HOUR (hora), etc.

    Calendar tiene muchas funciones en común con java.util.Date, lo que diferencia es a la hora de extraer datos, los de java.util.Date están obsoletos, y si manejamos algunos de estos métodos en realidad esas accediendo a funcionalidades de la clase Calendar.

    El método getInstance() nos devuelve una subclase de Calendar con la hora actual, y usamos el método set( ) para cambiar a la fecha.

    Tenemos que tener en cuenta que no todos los calendarios tienes años de 365 o 12 meses y a la hora de realizar operaciones tenemos que utilizar las subclases adecuadas el tipo de calendario que queramos.

    Para extraer los datos tenemos:
    • YEAR
    • MONTH
    • DATE, DAY_OF_MONTH
    • HOUR
    • MINUTE
    • SECOND
    Por ejemplo nosotros utilizaríamos la subclase GregorianCalendar.
    Con esta clase podemos sumar varios días sin preocuparnos de calcular luego el año o el mes, lo hace la subclase sola.

    Tenemos dos métodos que nos permiten avanzar un tiempo exacto sobre los datos obtenidos anteriormente, add(Constante, valor) y roll(Constante, valor), recordemos que constante es por ejemplo Calendar.MONTH.

    Roll() este hay que tener en cuanta que cuando llega al limite inferior o superior de constante cambia al limite contrario sin cambiar los siguientes atributos.

    Los que hay que tener en cuenta son add(), get(),set().

    lunes, 20 de abril de 2009

    JAXWS

    Es el API java para el desarrollo de WS XML, forma parte de la distribución J2EE de Sun y al igual que otras APIs utiliza las anotaciones para el despliegue de las aplicación.

    JAX-WS es una tecnología para la construcción de servicios web y los clientes que se comunican a través de XML.

    JAX-WS permite a los desarrolladores escribir mensajes orientados a RPC, así como orientado a servicios web.

    En JAX-WS, una llamada a procedimiento remoto está representado por un protocolo basado en XML, como SOAP.
    La especificación SOAP define sobre la estructura, la codificación de normas y convenciones de representación de llamadas a procedimiento remoto y las respuestas.
    Estas llamadas y respuestas se transmiten como mensajes SOAP (archivos XML) a través de HTTP.

    Aunque los mensajes SOAP son complejas, la API de JAX-WS oculta esta complejidad de la aplicación de desarrolladores En el lado del servidor, el desarrollador especifica los procedimientos remotos mediante la definición de métodos de una interfaz escrita en el lenguaje de programación Java. El desarrollador también los códigos de una o más clases que implementan esos métodos.

    Los programas cliente también son fáciles de código. Un cliente crea un proxy (un objeto que representa el servicio) y luego simplemente invoca los métodos en el proxy. Con JAX-WS, el desarrollador no generar o analizar mensajes SOAP. Es el tiempo de ejecución JAX-WS sistema que convierte las llamadas a la API y las respuestas y los mensajes de SOAP.

    Con JAX-WS, los clientes y los servicios web tienen una gran ventaja: la independencia de la plataforma de lenguaje de programación Java. Además, JAX-WS no es restrictiva: JAX-WS un cliente puede acceder a un servicio web que no se está ejecutando en la plataforma Java, y viceversa.

    Esta flexibilidad es posible gracias a JAX-WS utiliza tecnologías definidas por el World Wide Web Consortium (W3C): HTTP, SOAP, y el Lenguaje de descripción de servicios Web (WSDL)

    WSDL especifica un formato XML para describir un servicio como un conjunto de parámetros de funcionamiento en los mensajes.



    lunes, 13 de abril de 2009

    Comandos DDL

    • CREATE Utilizado para crear nuevas tablas, campos e índices.
    • DROP Empleado para eliminar tablas e índices.
    • ALTER Utilizado para modificar las tablas agregando campos o cambiando la definición de los campos.

    Comandos DML

    • SELECT Utilizado para consultar registros de la base de datos que satisfagan un criterio determinado.
    • INSERT Utilizado para cargar lotes de datos en la base de datos en una única operación.
    • UPDATE Utilizado para modificar los valores de los campos y registros especificados.
    • DELETE Utilizado para eliminar registros de una tabla de una base de datos.

    Introducción Sql

    Es un lenguaje de consulta estructurado que utilizado por el motor de bases de datos de Microsoft Jet.SQL

    Existen dos tipos de comandos para este lenguaje:
    1. Comandos DDL --> que permiten crear y definir nuevas bases de datos, campos e índices.
    2. Comandos DML --> que permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos.

    Índices

    Un índice no es más que una orden para que el servidor de base de datos haga una reorganización física de la tabla respecto a unas normas (índices). Pero claro, si sobre una tabla con muchos índices hacemos muchos INSERT/UPDATE/DELETE (operaciones DML), eso implica un coste muy importante. Con lo que puede al final ir más lento con índices que sin ellos.

    Hay que tener en cuenta:

    • Las consultas más frecuentes deberían tener índices. El que hace la aplicación sabe cuál es más frecuente.
    • Esto es muy importante con campos VARCHAR, cuya búsqueda no indexada es horrible (FULL SCAN).
    • No hay que tener demasiados índices. Nunca 20, por ejemplo. A ser posible, máximo 6 ó 7. Se puede buscar qué consultas son más frecuentes y priorizar.
    • Una PK implica un índice.
    • Una FK también implica un índice. Es decir, si tenéis una tabla NOTICIA con un ID_TEMA que es FK a la PK de una tabla TEMA (ID_TEMA)... ya tenéis un índice sobre ID_TEMA, no hay que volver a hacerlo.
    • los índices deben hacerse para campos que normalmente no deberían permitir valores nulos

    Esto es una explicación muy buena de un compañero de mi trabajo.

    viernes, 27 de marzo de 2009

    CIFS (Common Internet File System)

    Es un protocolo que permite el intercambio de ficheros.

    Es la versión pública y multivendedor del protocolo SMB

    He econtrado una definición más tecnica y mas completa:
    CIFS define un protocolo de acceso a sistemas de archivos remotos normalizado para uso en redes, permitiendo a los grupos de usuarios trabajar juntos y compartir documentos ya sea a través de Internet o dentro de sus intranets corporativas. Es una tecnología multiplataforma, abierta, basada en los protocolos para compartir archivos de MS Windows y otros sistemas operativos comunes, soportada por UNIX y otros sistemas operativos. En su máxima expresión, CIFS permitiría a millones de usuarios compartir sus archivos sin instalar nuevo software o cambiar su forma de trabajo habitual.

    martes, 24 de marzo de 2009

    Drupal

    Primero veamos una definición de Drupal:
    Es un sistema de gestión de contenido para sitios Web.Permite publicar artículos, imágenes, u otros archivos y servicios añadidos como foros, encuestas, votaciones, blogs y administración de usuarios y permisos. Drupal es un sistema dinámico: en lugar de almacenar sus contenidos en archivos estáticos en el sistema de ficheros del servidor de forma fija, el contenido textual de las páginas y otras configuraciones son almacenados en una base de datos y se editan utilizando un entorno Web incluido en el producto.(cogido de la wiki).

    En resumen:
    Drupal es una plataforma increíblemente potente. Su sistema modular y framework básico permiten desarrollos rápidos de sitios con muchas funcionalidades. Todo lo que necesitas es imaginar que quieres construir y empezar a poner una pieza sobre otra.
    Es un CMS pero también podría considerarse un framework

    miércoles, 4 de marzo de 2009

    Añadir un jar Externo

    Pinchamos sobre el proyecto con el botón derecho y elegimos la opción
    Build Path-->Configure Build Path.

    Se nos abre una ventana que son las propiedades del proyecto, y elegimos la pestaña Libraries y pulsamos el botón Add External JARs.

    Buscamos donde tengamos el jar, le damos aceptar y listo.

    Para agregar jar que están el repositorio.

    Es igual que lo de antes pero se pulsa el botón Add Variable.
    Vamos a explicar como crear la variable.
    Para ello se le pulsa Add variable y le damos a Configure Variables, le ponemos la ruta del repositorio en este caso y un nombre. para esa variable.

    Le damos aceptar y ya podemos acceder a las librerías que contiene repositorio.

    Ahora pinchamos sobre esa variable y buscamos la librería que queremos añadir y todo listo.

    Error Server Tomcat en Eclipse

    Muchas veces cuando he instalado eclipse desde cero al ejecutar un proyecto enorme pues puede tardar bastante en arrancar y por defecto viene definido el server con 10 segundos de espera, entonces nunca arranca y te da errores de conexion de tiempo.

    Para solventar esto nos vamos a Window/Preference/Server y ampliamos los segundos de esperas.

    martes, 24 de febrero de 2009

    Portlet

    Son componentes modulares de la interfaz de usuario.

    El portlet permite la personalización, la presentación, y la gestión de la seguridad. Los portlets se diferencian de los servlets por ser estos componentes de servidor con perspectiva funcional.

    El concepto de portlet es propio del mundo Java, y tiene su traducción en el entorno Microsoft como "web parts". (Sharepoint Portal Server)

    Los portales usan portlets como componentes de interfaz de usuario que proveen de una capa de presentación a los sistemas de información.

    Ejemplos de portlets meteorología, foros, encuestas, formularios, canales RSS.

    El contenido generado por los portlets se denomina "fragmento". Es código XHTML, HTML, WML, etc. Los fragmentos agregados resultantes de la operación de varios portlets constituyen un documento que se traduce en el interfaz del portal.

    Liferay

    Es un portal de gestión de contenidos de código abierto escrito en Java.

    CMS (Content Management System)

    Es un programa que permite crear una estructura de soporte (framework) para la creación y administración de contenidos, principalmente en páginas web, por parte de los participantes.

    El sistema permite manejar de manera independiente el contenido y el diseño. Así, es posible manejar el contenido y darle en cualquier momento un diseño distinto al sitio sin tener que darle formato al contenido de nuevo, además de permitir la fácil y controlada publicación en el sitio a varios editores

    jueves, 5 de febrero de 2009

    Ventajas e incovenientes de los Web Services

    Ventajas:
    • Son programable.
    • Están basados en XML, que es un lenguaje abierto.
    • Son auto descriptivo.
    • Pueden buscar registros de otros Web services.
    • Se basan en el estándar existente, es decir, es totalmente independiente de la tecnología subyacente utilizada para construir la aplicación.Son independientes a las plataformas, bases de datos, y los lenguajes de programación, liberando totalmente a los programadores de las limitaciones encontradas previamente al tratar de interconectar aplicaciones entre si.
    • Los Web Services, pueden publicar servicios simples que están desconectados de los objetos de datos y solo envían la respuesta requerida al solicitante. Esto elimina la necesidad de publicar tablas completas de datos y por lo tanto, de proporcionar un ambiente más seguro.
    Inconvenientes:
    • Para realizar transacciones no pueden compararse en su grado de desarrollo con los estándares abiertos de computación distribuida como CORBA (Common Object Request Broker Architecture).
    • Su rendimiento es bajo si se compara con otros modelos de computación distribuida, tales como RMI (Remote Method Invocation), CORBA, o DCOM (Distributed Component Object Model). Es uno de los inconvenientes derivados de adoptar un formato basado en texto. Y es que entre los objetivos de XML no se encuentra la concisión ni la eficacia de procesamiento.
    • Al apoyarse en HTTP, pueden esquivar medidas de seguridad basadas en firewall cuyas reglas tratan de bloquear o auditar la comunicación entre programas a ambos lados de la barrera.

    WS-Security

    Es un protocolo de comunicaciones que suministra un medio para aplicar seguridad a los Servicios Web.

    El protocolo contiene especificaciones sobre como debe garantizarse la integridad y seguridad en mensajería de Servicios Web.

    UDDI

    son las siglas del catálogo de negocios de Internet denominado Universal Description, Discovery and Integration. El registro en el catálogo se hace en XML. UDDI es una iniciativa industrial abierta (sufragada por la OASIS) entroncada en el contexto de los servicios Web. El registro de un negocio en UDDI tiene tres partes:
    • Páginas blancas - dirección, contacto y otros identificadores conocidos.
    • Páginas amarillas - categorización industrial basada en taxonomías.
    • Páginas verdes - información técnica sobre los servicios que aportan las propias empresas.

    UDDI es uno de los estándares básicos de los servicios Web cuyo objetivo es ser accedido por los mensajes SOAP y dar paso a documentos WSDL, en los que se describen los requisitos del protocolo y los formatos del mensaje solicitado para interactuar con los servicios Web del catálogo de registros.

    WSDL (Web Services Description Languages)

    Es un formato XML que se utiliza para describir servicios Web.

    WSDL describe la interfaz pública a los servicios Web. Está basado en XML y describe la forma de comunicación, es decir, los requisitos del protocolo y los formatos de los mensajes necesarios para interactuar con los servicios listados en su catálogo. Las operaciones y mensajes que soporta se describen en abstracto y se ligan después al protocolo concreto de red y al formato del mensaje.

    Así, WSDL se usa a menudo en combinación con SOAP y XML Schema. Un programa cliente que se conecta a un servicio web puede leer el WSDL para determinar que funciones están disponibles en el servidor. Los tipos de datos especiales se incluyen en el archivo WSDL en forma de XML Schema. El cliente puede usar SOAP para hacer la llamada a una de las funciones listadas en el WSDL.

    SOAP

    Es un protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML. Este protocolo deriva de un protocolo creado por David Winer en 1998, llamado XML-RPC. SOAP fue creado por Microsoft, IBM y otros y está actualmente bajo el auspicio de la W3C

    Web Services Protocol Stack

    Estánderes Web services

    Estándares empleados:
    • Web Services Protocol Stack: Así se denomina al conjunto de servicios y protocolos de los servicios Web.
    • XML (Extensible Markup Language): Es el formato estándar para los datos que se vayan a intercambiar.
    • SOAP (Simple Object Access Protocol) o XML-RPC (XML Remote Procedure Call): Protocolos sobre los que se establece el intercambio.
    • Otros protocolos: los datos en XML también pueden enviarse de una aplicación a otra mediante protocolos normales como HTTP (Hypertext Transfer Protocol), FTP (File Transfer Protocol), o SMTP (Simple Mail Transfer Protocol).

    miércoles, 4 de febrero de 2009

    Alfresco

    Es un sistema de administración de código abierto/libre. Esta basado en Java concretamente hecho con Spring, Jsf e Hibernate.

    Incluye un repositorio de contenidos, un framework de portal web para administrar y usar contenidos estándar en portales.

    Contiene un interfaz CIFS para la compatibilidad entre los distintos sistema Windows e Unix.

    Alfresco es utilizado como Software de gestión documental para documentos, páginas web, registros, imágenes y desarrollo de contenido.

    martes, 27 de enero de 2009

    SAP

    Es un suit de aplicaciones, creado por una empresa alemana.

    viernes, 23 de enero de 2009

    Mapeo objeto-relacional

    Es una técnica de programación para convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y el utilizado en una base de datos relacional

    JPA Java persistent api (JPA)

    La API de persistencia JPA es el estándar de Java para mapear objetos Java a una base de datos relacional.

    Es una API de persistencias de POJOS, el mapeo se hacen en la misma clase de la entidad a través de anotaciones.

    El objetivo que persigue el diseño de esta API es no perder las ventajas de la orientación a objetos al interactuar con una base de datos,

    Hay muchas implementaciones de JPA de proveedores utilizadas dentro de la comunidad de desarrolladores de Java. Hibernate es la implementación más popular. Hibernate utiliza ficheros de mapeo (en formato XML que tienen extensión .hbm.xml.) o anotaciones JPA para relacionar tablas con objetos Java.

    Entre estas dos opciones, se recomienda utilizar las anotaciones JPA.


    Criteria

    Criteria Query nos permite definir consultas con un estilo orientado a objetos, muy distinto al clásico SQL o HQ

    Su código es más complicado que el de HQL ya que necesita un análisis más detallado ya que utiliza objetos.

    Una de las ventajas de Criteria es que puede montar consultas dinámicas más fácil, como por ejemplo, si queremos que tenga un where con varias opciones:

    Criteria criteria = session.createCriteria(Coche.class);
    if (nombre != null) {
    criteria.add(Restrictions.eq("color", color));
    }
    if (edad != null) {
    criteria.add(Restrictions.eq("puertas", puertas));
    }

    List coches = criteria.list();

    Y en HQL tendriamos que concatenar string y esto puede inducir errores:
    String query = "from Coche where color like 'Rojo%' and puertas > 2;";
    List coches = sess.createQuery(query).list();

    miércoles, 21 de enero de 2009

    MessageDigest

    Proporciona la funcionalidad de un algoritmo de mensaje, como MD5 o SHA.

    martes, 20 de enero de 2009

    Qué es un Hash?

    Hash se refiere a una función o método para generar claves o llaves que representen de manera casi unívoca a un documento, registro, archivo, etc., resumir o identificar un dato a través de la probabilidad, utilizando una función hash o algoritmo hash. Un hash es el resultado de dicha función o algoritmo.


    Encriptar contraseñas

    Las más usadas con sha1 y md5

    MD5 es un algoritmo de generación de resúmenes de mensajes de longitud arbitraria que genera salidas (resúmenes o firmas) de 128 bits.

    SHA1 es otro algoritmo de generación de resúmenes de mensajes de longitud inferior a 2^64 bits que genera salidas de 160 bits.

    Ambos algoritmos se caracterizan por lo siguiente:

    - es virtualmente imposible que dos mensajes distintos produzcan la misma firma.

    - conocida la firma de un mensaje, es computacionalmente imposible obtener el mensaje.

    - no se basan en clave, sino en una función criptográfica perfectamente conocida, pero de una sola vía (el conocimiento de la entrada determina el conocimiento de la salida, pero no a la inversa).

    Método MD5.

    public static String md5(String s) {

    String r = null;
    try {
    if (s != null) {

    MessageDigest algorithm =MessageDigest.getInstance("MD5");
    algorithm.reset();
    algorithm.update(s.getBytes());
    byte bytes[] = algorithm.digest();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < bytes.length; i++) {
    String hex = Integer.toHexString(0xff & bytes[i]);
    if (hex.length() == 1)
    sb.append('0');
    sb.append(hex);
    }

    r = sb.toString();
    }
    } catch (NoSuchAlgorithmException e) {
    }

    return r;

    }


    Clase sha1

    package com.kriter.utils;

    import sun.misc.BASE64Encoder;
    import java.io.ByteArrayInputStream;
    import java.io.UnsupportedEncodingException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;

    /**
    * Created by IntelliJ IDEA.
    * User: alopez
    * Date: 04-jul-2006
    * Time: 11:06:38
    * To change this template use File | Settings | File Templates.
    */
    public final class SHA1
    {

    public static String encriptarBase64( String textoplano ) throws IllegalStateException
    {
    MessageDigest md = null;

    try
    {
    md = MessageDigest.getInstance( \"SHA\" ); // Instancia de generador SHA-1
    }
    catch( NoSuchAlgorithmException e )
    {
    throw new IllegalStateException( e.getMessage() );
    }

    try
    {
    md.update( textoplano.getBytes( \"UTF-8\" ) ); // Generación de resumen de mensaje
    }
    catch( UnsupportedEncodingException e )
    {
    throw new IllegalStateException( e.getMessage() );
    }

    byte raw[] = md.digest(); // Obtención del resumen de mensaje
    return ( new BASE64Encoder() ).encode( raw ); // Traducción a BASE64
    }

    public static String encriptarHexadecimal( String textoplano ) throws IllegalStateException
    {
    MessageDigest md = null;

    try
    {
    md = MessageDigest.getInstance( \"SHA\" ); // Instancia de generador SHA-1
    }
    catch( NoSuchAlgorithmException e )
    {
    throw new IllegalStateException( e.getMessage() );
    }

    try
    {
    md.update( textoplano.getBytes( \"UTF-8\" ) ); // Generación de resumen de mensaje
    }
    catch( UnsupportedEncodingException e )
    {
    throw new IllegalStateException( e.getMessage() );
    }

    byte raw[] = md.digest(); // Obtención del resumen de mensaje
    return toHexadecimal( raw ); // Traducción a HEXADECIMAL
    }

    //metodo que devuelve el valor hexadecimal (String) de una array de byte.
    private static String toHexadecimal( byte[] datos )
    {
    String resultado = \"\";
    ByteArrayInputStream input = new ByteArrayInputStream( datos );
    String cadAux;
    int leido = input.read();
    while( leido != -1 )
    {
    cadAux = Integer.toHexString( leido );
    if ( cadAux.length() < 2 ) //Hay que añadir un 0
    resultado += \"0\";
    resultado += cadAux;
    leido = input.read();
    }
    return resultado;
    }
    }