martes, 21 de abril de 2009
Obtener Beans del IoC de Spring en JSP's
Lo primero que hice fue declarar los Daos asi:
<%!DaoCatalogo daoCatalogo = new DaoCatalogo();%>
Con lo anterior aseguro que solo habrá una instancia del objeto para cada peticion al jsp, pero ya que estamos usando spring porque no mejor obtener los objetos del contenedor de spring (IoC).
Este pequeño detalle no se hubiera dado si el desarrollador anterior hubiera ocupado bien el springMVC, pero bueno lo que hice fue una clase estatica con un metodo estatico al cual le paso el nombre del bean definido en nuestro applicationContext y el ServletContext para poder obtener el objeto la clase es la siguiente
package com.example.nl;
import javax.servlet.ServletContext;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class SpringLocateBean {
public static Object getBean (String nameBean, ServletContext sc){
Object objBean = null;
ApplicationContext actx = WebApplicationContextUtils.
getWebApplicationContext(sc);
objBean = actx.getBean(nameBean);
return objBean;
}
}
Como se observa en la clase lo que hace es obtener el ApplicationContext con la ayuda de la clase WebApplicationContextUtils con el metodo getWebApplicationContext(ServletContext) al cual se le pase el contexto de nuestro servlet (jsp), una vez obtenido el ApplicationContext obtenemos el bean (objeto) que queremos a travez del nombre que le pasamos al metodo getBean(String), este metodo nos devuelve el bean que queremos pero en tipo Object por lo que en el jsp tenemos que hacer un cast al tipo de objeto adecuado
En el jsp tenemos lo siguiente :
<%@ page import="com.example.nl.SpringLocateBean"%>
<%!
DaoCatalogo daoCatalogo;
public void jspInit() {
daoCatalogo = (DaoCatalogo) SpringLocateBean.
getBean ("daoCatalogo", getServletConfig().getServletContext());
}
%>
Como vemos en el jsp importamos nuestra clase que obtiene los objetos de spring, despues declaramos la variable DaoCatalogo y posteriorme un metodo jspInit() en el cual se inicializa el objeto con nuestra clase SpringLocateBean ejecutando el metodo getBean y pasando el nombre del bean (ojo este nombre esta definido en el applicationContext.xml ) y el contexto del jsp
Nota: el metodo jspInit() se ocupa cuando ocupamos alguna libreria de etiquetas (custom tags) como por ejemplo JSTL, si no utilizamos ninguna en nuestro jsp podemos usar el metodo _jspInit(), esto si usas algun servidor basado en tomcat o tomcat en otros no he probado
Bueno esto les puede servir si necesitan incorporar Spring a una aplicacion web con servltes y jsp pero sin usar springMVC.
lunes, 13 de abril de 2009
Problema texto largo en jasperreports y linux
Para saber mas acerca de este bug pueden leer en este FAQ de jasper, en la parte donde dice:
Why is my text not displayed correctly in PDF?
Para instalar la fuente arial segui los siguientes pasos (el servidor linux que usamos es un red hat enterprise 5):
1.- Crear una carpeta en la ruta /usr/share/fonts
mkdir windowsfonts
2.- Copiar las fuentes Arial de la carpeta c:\WINDOWS\fonts a la carpeta creada en el punto 1 (windowsfonts)
3.- Cambiar el propietario y los permisos de las fuentes que se copiaron
Ejecutar :
cd /usr/share/fonts/windowsfonts
chown root.root *.tff
chmod 644 *.ttf
4.- Ejecutar el commando mkfontdir dentro de la carpeta que contiene las fuentes (windowsfonts)
5.- Cambiar al directorio padre (fonts), ejecutando cd ..
6.- Ejecutar el comando fc-cache windowsfonts
Para mas referencias sobre installar la fuente arial aqui estan estos links:
http://linuxhelp.blogspot.com/2005/12/adding-windows-fonts-in-linux.html
Este es de redhat
http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.2/html/Deployment_Guide/s3-x-fonts-fontconfig-add.html
miércoles, 25 de marzo de 2009
Substance, JComboBox, Problema al colocar una fuente en JComboBox
Para empezar un JComboBox esta compuesto por otros objetos (una lista desplegable y una caja de texto), cuando queria agregar el keyLystener lo hacia directo a mi objeto JComboBox y cuando lo ejecutaba pues no se realizaba la accion del enter ya que no estaba dando enter al JComboBox sino a su campo de texto, entonces para solucionar esto añadi el listener a el campo de texto, asi:
JTextComponent editor;
//myJcomboBox es el objeto JComboBox
editor = (JTextComponent) myJcomboBox.getEditor().getEditorComponent();
final ComboBoxEditor cmboxEditor = this.getEditor();
editor.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
System.out.println("KeyAdapter keypressed " + e.getKeyCode() );
}
});
como la aplicacion usa substance para hacer mas amigable la intefaz, cuando la aplicacion despliega algunos JComboBox les coloca un tipo de fuente y al hacer eso y estar utilizando substance podemos decir que se rehacia ese objeto por lo cual los listeners que le colocaba desaparecian, bien para solucionar esto debemos añadir un PropertyChangeListener a el JComboBox :
JComboBox myComboBox = new MyComboBox();
//al colocar la fuente los listeners se pierden
myComboBox.setFont(new Font("Arial",Font.BOLD,12));
//Se coloca final para poder utilizar esta variable dentro de la clase anonima
final JComboBox mycmb = myComboBox;
//Se agrega un PropertyChangeListener para añadir el listener del teclado
myComboBox.addPropertyChangeListener( new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
String property = propertyChangeEvent.getPropertyName();
System.out.println("En property changer " + property);
if ("editor".equals(property)) {
// Si queremos obtener la propiedad editor en este punto
// Obtenemos un nullpointer exception
System.out.println("Entra en property changer " + property);
}
if ("UI".equals(property)) {
System.out.println("Entra en property changer " + property);
System.out.println(mycmb);
//aqui es donde se agrega el listener del teclado
mycmb.getEditor().getEditorComponent()
.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
System.out.println("KeyAdapter keypressed " + e.getKeyCode() );
}
});
}
}
} );
Y asi los listeners que le agrego al combobox ya no se pierden y esta resuelto el problema
Les dejo el codigo que estuve probando pero necesitaran substance aqui esta su link https://substance.dev.java.net/
Y el codigo es el siguiente :
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;import javax.swing.*;
import javax.swing.text.JTextComponent;
public class ExampleJComboBox extends JFrame {
MyComboBox myComboBox;
public ExampleJComboBox() {
String[] names = { "hemanth", "Shawn", "Hunter", "Undertaker", "Big Show" }; myComboBox = new MyComboBox();
myComboBox.setFont(new Font("Arial",Font.BOLD,12));
getContentPane().add(myComboBox, BorderLayout.NORTH);
JButton jbnOk = new JButton("Ok");
getContentPane().add(jbnOk, BorderLayout.SOUTH);
JTextComponent editor;
editor = (JTextComponent) myComboBox.getEditor().getEditorComponent();
final JTextComponent jedit = editor;
editor.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
System.out.println("KeyAdapter keypressed " + e.getKeyCode() ); } });
// Print Name of the Selected Combo Box Item to Console when OK button is pressed
jbnOk.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println( myComboBox.getSelectedItem() ); }
});
// Print Name of the Selected Combo Box Item to Console when Enter is pressed myComboBox.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println( myComboBox.getSelectedItem() );
}
});
final MyComboBox mycmb = myComboBox;
myComboBox.addPropertyChangeListener( new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
String property = propertyChangeEvent.getPropertyName();
System.out.println("En property changer " + property);
if ("editor".equals(property)) {
System.out.println("Entra en property changer " + property);
System.out.println(mycmb);
}
if ("UI".equals(property)) {
System.out.println("Entra en property changer " + property);
System.out.println(mycmb);
mycmb.getEditor().getEditorComponent()
.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
System.out.println("KeyAdapter keypressed " + e.getKeyCode() );
}
});
}
}
}
);
}
class MyComboBox extends JComboBox {
public MyComboBox(){
super( new Object[] {"Ester", "Jordi", "Jordina", "Jorge", "Sergi"});
// has to be editable
this.setEditable(true);
// JTextComponent editor;
// editor = (JTextComponent) this.getEditor().getEditorComponent();
// final ComboBoxEditor cmboxEditor = this.getEditor();
// editor.addKeyListener(new KeyAdapter() {
// public void keyPressed(KeyEvent e) {
// System.out.println("KeyAdapter keypressed " + e.getKeyCode() );
// }
// });
}
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceMistAquaLookAndFeel");
} catch (UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InstantiationException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
ExampleJComboBox frame = new ExampleJComboBox();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack(); frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
});
}
}
Nota: no olviden agregar substance.jar a su classpath
martes, 24 de febrero de 2009
Hola mundo Flex compilado con Ant
Lo que necesitamos :
Que es flex ?
Flex es un conjunto de librerías o framework – para desarrollo de interfaces de usuario. Este framework usa ActionScript 3.0 (AS3). Si el código AS3 que se programe utiliza los componentes y métodos definidos en el Flex framework, entonces se esta usando Flex. Es decir, AS3 no es por si solo flex.
Tendremos la siguiente estructura de nuestro proyecto
- Carpeta raiz del proyecto: hello_flex_ant
- dentro de la carpeta raiz tendremos los archivos build.xml, build.properties, y una subcarpeta src
- dentro de la subcarpeta src creamos una subcarpeta flex y dentro de esta crearemos el archivo HelloFlexAnt.mxml
Les debe quedar asi:
En el archivo HelloFlexAnt.mxml colocaremos lo siguiente:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
viewSourceURL="src/HelloWorld/index.html"
horizontalAlign="center" verticalAlign="middle"
width="300" height="160"
>
<mx:Panel
paddingTop="10" paddingBottom="10"
paddingLeft="10" paddingRight="10"
title="My Application"
>
<mx:Label text="Hello World!" fontWeight="bold"
fontmxmlString">24"/>
</mx:Panel>
</mx:Application>
En al archivo build.properties colocaremos la ruta donde tengamos instalado el SDK de flex, o podemos ponerlo directamente el el archivo build.xml
Ejemplo en build.properties :
ruta.FLEX_HOME = C:/flex_sdk_3
Ejemplo en build.xml
<property name="FLEX_HOME" location="/Users/mykola/java/flex">
Si colocamos la ruta de flex en el build properties entonces en nuestro build.xml tendremos la siguientes linas:
<property file="build.properties">
<property name="FLEX_HOME" location="${ruta.FLEX_HOME}">
El build.xml contendra lo siguiente:
<?xml version="1.0"?>
<project name="HelloFlexAnt" default="all">
<!-- Init the build process -->
<target name="init" unless="initialized">
<!-- Name of project and version -->
<property name="FLEX_HOME" location="/Users/mykola/java/flex"/>
<property name="proj.name" value="${ant.project.name}" />
<property name="proj.shortname" value="${ant.project.name}" />
<property name="version.major" value="0" />
<property name="version.minor" value="9" />
<property name="version.revision" value="0" />
<property name="APP_TITLE" value="Sample Application" />
<property name="APP_WIDTH" value="800" />
<property name="APP_HEIGHT" value="600" />
<!-- Global properties for this build -->
<property name="build.dir" location="${basedir}/build" />
<property name="flex_src" location="${basedir}/src" />
<path id="project.classpath">
<pathelement path="${java.class.path}" />
</path>
<taskdef resource="flexTasks.tasks"
classpath="${FLEX_HOME}/ant/lib/flexTasks.jar" />
<echoproperties/>
<property name="initialized" value="true" />
<mkdir dir="${build.dir}" />
</target>
<!-- Default target: clean and build the application -->
<target name="all" depends="init">
<antcall target="clean" />
<antcall target="build" />
</target>
<!-- Compile Flex files -->
<target name="compile.flex" depends="init">
<property name="module"
value="${ant.project.name}"
description="The name of the application module." />
<mxmlc file="${flex_src}/${module}.mxml"
keep-generated-actionscript="true"
output="${build.dir}/${ant.project.name}/${module}.swf"
actionscript-file-encoding="UTF-8"
incremental="true"
context-root="${ant.project.name}"
debug="true">
<load-config filename="${FLEX_HOME}/frameworks/flex-config.xml" />
<source-path path-element="${FLEX_HOME}/frameworks" />
<compiler.source-path path-element="${flex_src}" />
</mxmlc>
<html-wrapper title="${APP_TITLE}"
file="index.html"
application="app"
swf="${module}"
width="${APP_WIDTH}"
height="${APP_HEIGHT}"
version-major="${version.major}"
version-minor="${version.minor}"
version-revision="${version.revision}"
history="true"
template="express-installation"
output="${build.dir}/${ant.project.name}/" />
</target>
<!-- Build the application -->
<target name="build" depends="init">
<antcall target="compile.flex" />
</target>
<!-- Clean build files -->
<target name="clean" depends="init">
<delete dir="${basedir}/generated" />
<delete dir="${build.dir}" />
</target>
<target name="usage" description="Usage documentation">
<echo>
all - clean and build the project
</echo>
</target>
</project>
Este build lo encontre en este blog : blog on programming
Para compilar nuestro hola mundo abrimos una consola de comandos, y nos vamos hasta la carpeta de nuestro proyecto donde se encuentra nuestro build xml, y ahi ejecutamos ant all, para observar lo que se ha compilado entramos a la carpeta build y ahi podemos darle en el index.html o darle en el archivo swf que se genera si tenemos el reproductor de flash
El codigo del hola mundo desde la pagina de flex hola mundo flexY al final debemos tener lo siguiente:
jueves, 22 de enero de 2009
Invertir los Ejes en una Grafica de jfreechart
Las gráficas que se estaban generando tenían un pequeño detalle y es que la gráfica debería de contener los valores negativos de las y en la parte superior y no en la parte inferior que es como esta por default y es por eso que revisando ejemplos, asi como el api de jfreechart pues encontré la forma de hacerlo y se puede hacer tanto para el eje x como para el eje y.
por ejemplo tenemos la siguiente grafica con dos series de valores, uno corresponde a la funcion
y = x, y el segundo corresponde a la serie de valores y = x + 2
Bien para esto tengo el siguiente código:import java.awt.Color;
import java.awt.image.BufferedImage;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.io.File;
import java.io.*;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class EjemploGrafica {
public BufferedImage generaGrafica(ArrayList areo, ArrayList oseo, String title) {
System.out.println(" Generando la grafica con titulo " + title);
BufferedImage buf = null;
try {
XYSeries series = this.llenaSerie(areo,"Serie Uno");
XYSeries series2 = this.llenaSerie(oseo,"Serie Dos");
XYSeriesCollection data = new XYSeriesCollection(series);
XYSeriesCollection data2 = new XYSeriesCollection(series2);
//Se crea el objeto para generar la grafica
JFreeChart chart = ChartFactory.createXYLineChart(
title,
"",
"",
null,
PlotOrientation.VERTICAL,
false,
true,
false
);
chart.setBorderVisible(true);
chart.setBorderPaint(Color.black);
XYPlot plot = chart.getXYPlot();
pintaSerieCirculo(plot,data );
pintaSerieCirculo(plot,data2 );
/*Comentar esta linea si únicamente queremos que retorne la BufferreImage y el catch con la IOException */
ChartUtilities.saveChartAsJPEG(new File("c:\\Barchart.jpg"), chart, 500,
300);
buf = chart.createBufferedImage(500,300);
} catch (IOException e) {
e.printStackTrace();
System.err.println("Error creando grafico.");
} catch (Exception e) {
System.out.println(e.toString());
System.err.println("Error creando grafico.");
}
return buf;
}
private void pintaSerie(XYPlot plot, XYSeriesCollection data){
int index = plot.getDatasetCount();
System.out.println(" numero de data sets " + index);
plot.setDataset(index,data);
System.out.println(" numero de data sets " + index);
StandardXYItemRenderer sxyiRender = new StandardXYItemRenderer();
//sxyiRender.setPlotImages(true);
plot.setRenderer(index,sxyiRender);
}
private void pintaSerieCirculo(XYPlot plot, XYSeriesCollection data){
int index = plot.getDatasetCount();
System.out.println(" numero de data sets " + index);
plot.setDataset(index,data);
System.out.println(" numero de data sets " + index);
StandardXYItemRenderer sxyiRender = new StandardXYItemRenderer();
//sxyiRender.setPlotImages(true);
sxyiRender.setShapesFilled(true);
sxyiRender.setBaseSeriesVisible(true);
sxyiRender.setBaseShapesVisible(true);
plot.setRenderer(index,sxyiRender);
}
private XYSeries llenaSerie(ArrayList data, String title) {
BeanValoresGrafica valores = null;
XYSeries series = new XYSeries(title);
for(Object valorXy : data){
valores = (BeanValoresGrafica) valorXy;
series.add(valores.getX(), valores.getY());
}
return series;
}
public static void main(String[] args) {
BeanValoresGrafica b = null;
ArrayList a = new ArrayList();
for(int i = -5 ; i < b =" new" ab =" new" i =" -2" b =" new">
Ahora yo necesito que mi gráfica quede asi :
Como observan los valores negativos de y se encuentran en la parte superior y no en la inferior para invertirlos realizaremos lo siguiente (incluir esta parte de codigo despues de obtener el objeto XYPlot y las llamadas del metodo pintaSerieCirculo).
.
pintaSerieCirculo(plot,data2 );
plot.setDomainAxisLocation(AxisLocation.TOP_OR_LEFT);
NumberAxis domainAxis = (NumberAxis) plot.getDomainAxis();
//*Invierte los valores del eje x */
// domainAxis.setInverted(true);
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
//*Aqui es donde se invirte el eje y*/
rangeAxis.setInverted(true);
ChartUtilities.saveChartAsJPEG(new File("c:\\Barchart.jpg"), chart, 500,
300);
El metodo que genera la grafica nos retorna un objeto de tipo java.awt.image.BufferedImage este objeto podemos utilizarlo par mostrarlo en una aplicación swing o en un reporte de jasperreport o guardar la imagen en jpg y adjuntarla en algún informe, etc.
Bien pues es lo que yo necesitaba y espero que les sirva
La grafica final :

Como observan es lo mismo que lo anterior solo que se colocaron las etiquetas del eje x en la parte superior para eso tenemos el siguiente código:
AxisLocation axloc = plot.getDomainAxisLocation();
plot.setDomainAxisLocation(AxisLocation.TOP_OR_LEFT);
Bueno eso es todo, ha se me olvidaba que yo utilizo un bean para pasar valores le coloco el bean que no es la gran cosa pero es parte del codigo
import java.io.Serializable;
public class BeanValoresGrafica implements Serializable {
public BeanValoresGrafica() {
}
private double x;
private double y;
public double getX(){
return x;
}
public double getY(){
return y;
}
public double setX(double x){
return this.x = x;
}
public double setY(double y){
return this.y = y;
}
}
martes, 13 de enero de 2009
Acceder a un Ftp con jakarta commons-net
- FTP/FTPS
- NNTP
- SMTP
- POP3
- Telnet
- TFTP
- Finger
- Whois
- rexec/rcmd/rlogin
- Time (rdate) and Daytime
- Echo
- Discard
- NTP/SNTP
En este ejemplo veremos como acceder a un ftp con esta libreria
Para usarlo tenemos que descargar los siguientes jar de la pagina oficial:
- commons-net-1.4.1.jar
- jakarta-oro-2.0.8.jar
El primer jar nos proporciona las clases que implementan los protocolos antes mencionados y en el segundo jar contiene algunas clases para evaluar expresiones. El primero usa clases del segundo por lo cual necesitamos agregar ambos a nuestro classpath.
Aquí tenemos el ejemplo :
import java.io.IOException;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
public class Main {
public static void main(String[] args) {
FTPClient f = new FTPClient();
try {
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX); //Este objeto nos
f.configure(conf); //permite configurar opciones de conexion como idioma y sistema de archivos
f.connect("127.0.0.1"); // ip del servidor ftp
f.login("usuario", "usuario"); // usuario y password para conectarnos al ftp
f.changeWorkingDirectory("diruno"); // Cambiamos de la raiz al subdirectorio uno
System.out.println(" Crea directorio ? "+f.mkd("dirprueba")); //crea un directorio en diruno
FTPFile[] files = f.listFiles(); // Obtiene los archivos del servidor y los mostramos
System.out.println(f.isConnected());
for (FTPFile arch : files){
System.out.println(arch.toString());
}
f.disconnect();
System.out.println(f.isConnected());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Les dejo el link de la pagina oficial http://commons.apache.org/net/
Upate: Les dejo un ejemplo mas, es como el anterior pero almacena un arcivo de la maquina local en el ftp
public class Main {
public static void main(String[] args) {
FTPClient f = new FTPClient();
try {
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX); //Este objeto nos
f.configure(conf); //permite configurar opciones de conexion como idioma y sistema de archivos
f.connect("127.0.0.1"); // ip del servidor ftp
f.login("usuario", "usuario"); // usuario y password para conectarnos al ftp
System.out.println(f.isConnected());
f.changeWorkingDirectory("diruno"); // Cambiamos de la raiz al subdirectorio uno
System.out.println(" Crea directorio ? "+f.mkd("dirprueba")); //crea un directorio en diruno
FileInputStream fis = new FileInputStream("archivo.doc"); //Se abre un archivo de nuestra maquina local
f.setFileType(f.BINARY_FILE_TYPE); //Se pone tipo binario para poder enviar archivos de cualquier tipo
boolean res = ftpClient.storeFile("/diruno/dirprueba", fis ); //Con esta instruccion se sube el archivo al ftp
System.out.println("Resultado de subir el archivo es " + res);
FTPFile[] files = f.listFiles(); // Obtiene los archivos del servidor y los mostramos
for (FTPFile arch : files){
System.out.println(arch.toString());
}
f.disconnect();
System.out.println(f.isConnected());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
jueves, 8 de enero de 2009
Usar el protocolo samba con jCIFS
También es posible usar esta librería para compartir recursos entre maquinas windows y máquinas unix que cuenten con el servicio samba.
Por ejemplo en este metodo escribimos un archivo en la carpeta compartida por otra maquina:
private boolean escribeArchivo(String encodedMessage, String nombreArchivo)
throws SmbException, MalformedURLException, UnknownHostException, IOException{
boolean exitoArchivo = false;
//String url = "smb://127.0.0.1/compartida/"+ nombreArchivo ;
//String url = "smb://usuario:usuario@127.0.0.1/compartida/"+ nombreArchivo ;
String url = "smb://"+ USR_SERVIDOR +":"+ PASS_SERVIDOR +"@"
+ URL_SERVIDOR + nombreArchivo + EXT_ARCHIVO;
try{
SmbFileOutputStream out = new SmbFileOutputStream(url, false);
out.write(encodedMessage.getBytes());
// encodeMessage es el texto que contiene el archivo
// aqui podemos enviar los bytes de algun archivo de la maquina local
out.close();
exitoArchivo = true;
System.out.println("generado " + url );
} catch(IOException ex){
exitoArchivo = false;
} finally{
return exitoArchivo;
}
}
Para borrar un archivo en la carpeta compartida:
private void borraArchivo(String archivo) throws SmbException,
MalformedURLException, UnknownHostException{
//String url = "smb://127.0.0.1/compartida/"+ nombreArchivo ;
//String url = "smb://usuario:usuario@127.0.0.1/compartida/"+ nombreArchivo ;
String url = "smb://"+ USR_SERVIDOR +":"+ PASS_SERVIDOR +"@"+ URL_SERVIDOR ;
String rutArchivo = url + archivo;
SmbFile sFile = new SmbFile(rutArchivo);
if(sFile.exists())
sFile.delete();
}
Para descargar la libreria y un poco de mas informacion pues sigan este link
http://jcifs.samba.org/