Mostrando entradas con la etiqueta java. Mostrar todas las entradas
Mostrando entradas con la etiqueta java. Mostrar todas las entradas

miércoles, 13 de julio de 2011

Procesamiento de anotaciones en Java

Hay un bug en la JVM de Sun Oracle que hace fallar el procesamiento de anotaciones. Me pasó que compilando el proyecto funcionaba OK, pero al agregar "-processor ....", aparecía el siguiente problema:


[javac] /...../ValidationCheck.java:25: incompatible types
[javac] found   : ......annotations.Type
[javac] required: ......Type
[javac] Type type() default Type.WORKER;

El problema es el Enum "Type". Este Enum existe y está en el classpath, pero javac "no la ve". Está definido de la siguiente manera:

Type type() default Type.WORKER;

La solución para zafar de este bug es introducir el paquete en el nombre del Enum, de manera que quede:

Type type() default my.package.annotations.Type.WORKER;


Y con eso compila!

BUGhttp://bugs.sun.com/view_bug.do?bug_id=6512707

viernes, 14 de noviembre de 2008

Minimización de JS

Buscando algún servicio online para minimizar JS, encontré una librería, creada por el proyecto Dojo que se puede bajar. Está hecho en Java y son sólo 2 jars.

http://dojotoolkit.org/docs/shrinksafe

Hay que bjajar js.jar y shrinksafe.jar y ejecutar:

java -cp js.jar -jar shrinksafe.jar archivo.js > archivo-minimizado.js

domingo, 2 de noviembre de 2008

Java theory and practice: Are all stateful Web applications broken?

Java theory and practice: Are all stateful Web applications broken?
HttpSession and friends are trickier than they look

The session state management mechanism provided by the Servlets framework, HttpSession, makes it easy to create stateful applications, but it is also quite easy to misuse. Many Web applications that use HttpSession for mutable data (such as JavaBeans classes) do so with insufficient coordination, exposing themselves to a host of potential concurrency hazards.

Link





sábado, 30 de agosto de 2008

FindBugs, Hudson, Groovy y errores de alta prioridad

Usando Groovy encontré una manera fácil de forzar el fallo de un "build" cuando FindBugs haya encontrado problemas con prioridad alta. Este script Groovy puede agregarse en un scritp Ant o como un ultimo paso dentro de un proyecto Hudson. Esto es necesario porque el plugin de Findbugs para Hudson (en la versión estable) no se puede configurar para que marque el build como inestable dependiendo de la cantidad de warnings de ALTA prioridad (aunque esto ya está en desarrollo, e implementado en HEAD).

Usando Groovy + XPath:


import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.xpath.*

content = new File("ant_build/findbugs/findbugs-report.xml").getText("UTF-8")

builder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
doc = builder.parse(new ByteArrayInputStream(content.bytes))
xpath = '/BugCollection/BugInstance[@priority="1"]'
expr = XPathFactory.newInstance().newXPath().compile(xpath)
nodes = expr.evaluate(doc, XPathConstants.NODESET)
if(nodes.length>0) {
throw new RuntimeException("FindBugs reporto ${nodes.length} warning(s) de prioridad ALTA")
}


Usando GPath es mucho más fácil:


def bugCollection = new XmlParser().parseText(content)
highPriorityBugs = bugCollection.BugInstance.findAll { it['@priority'] == '1' }
if(highPriorityBugs.size()>0) {
throw new RuntimeException("FindBugs reporto ${highPriorityBugs.size()} warning(s) de prioridad ALTA")
}


El 'target' de Ant puede definirse así:


<target name="groovy">
<taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy">
<classpath>
<fileset dir="lib/groovy">
<include name="*.jar"></include>
</fileset>
</classpath>
<groovy>
<!--[CDATA[ // SCRIPT GROOVY AQUI ]]-->
</groovy>
</taskdef>
</target>

.

viernes, 5 de octubre de 2007

Comunicación Java / Python con XML-RPC

Estuve investigando cómo conectar Java y Python. Lo primero que se me ocurrió fue XMLRPC, y verdaderamente fue muy facil!
La info la saqué de:

El servidor Java:



1 package ar.com.hgdeoro.xmlrpc;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.Random;
8
9 import org.apache.xmlrpc.server.PropertyHandlerMapping;
10 import org.apache.xmlrpc.server.XmlRpcServer;
11 import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
12 import org.apache.xmlrpc.webserver.WebServer;
13
14 public class Server {
15
16 private static final int port = 8000;
17
18 public static void main(String[] args) throws Exception {
19
20 final WebServer webServer = new WebServer(port);
21 final XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
22 final PropertyHandlerMapping phm = new PropertyHandlerMapping();
23
24 phm.addHandler("Calculator", Calculator.class);
25
26 xmlRpcServer.setHandlerMapping(phm);
27 XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
28 serverConfig.setEnabledForExtensions(true);
29 serverConfig.setContentLengthOptional(false);
30 webServer.start();
31 }
32
33 public static class Calculator {
34
35 public int add(int i1, int i2) {
36 return i1 + i2;
37 }
38
39 public List<Integer> randomList(int num) {
40 if (num <= 0) {
41 throw new RuntimeException("num debe ser > 0");
42 }
43 final List<Integer> list = new ArrayList<Integer>();
44 for (int i = 0; i < num; i++) {
45 list.add(new Random().nextInt());
46 }
47 return list;
48 }
49
50 public Map<Integer, Integer> randomMap(int num) {
51 if (num <= 0) {
52 throw new RuntimeException("num debe ser > 0");
53 }
54 final Map<Integer, Integer> list = new HashMap<Integer, Integer>();
55 for (int i = 0; i < num; i++) {
56 list.put(Integer.valueOf(i), Integer.valueOf(new Random().nextInt()));
57 }
58 return list;
59 }
60
61 public Map<String, Integer> randomMap2(int num) {
62 if (num <= 0) {
63 throw new RuntimeException("num debe ser > 0");
64 }
65 final Map<String, Integer> list = new HashMap<String, Integer>();
66 for (int i = 0; i < num; i++) {
67 list.put(Integer.valueOf(i).toString(), Integer.valueOf(new Random().nextInt()));
68 }
69 return list;
70 }
71
72 }
73 }



El cliente Java:



1 package ar.com.hgdeoro.xmlrpc;
2
3 import java.net.MalformedURLException;
4 import java.net.URL;
5
6 import org.apache.xmlrpc.XmlRpcException;
7 import org.apache.xmlrpc.client.XmlRpcClient;
8 import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
9
10 public class Client {
11
12 public static void dump(Object obj) {
13 System.out.println("======================================================================");
14 System.out.println("Clase: " + obj.getClass());
15 System.out.println("toString(): " + obj.toString());
16
17 if (obj.getClass().isArray()) {
18 Object[] objs = (Object[]) obj;
19 System.out.println("---------- ARRAY ----------");
20 System.out.println("Tamanio: " + objs.length);
21 for (int i = 0; i < objs.length; i++) {
22 System.out.println("Object[" + i + "]: " + objs[i]);
23 }
24 }
25 }
26
27 public static void main(String args[]) throws MalformedURLException, XmlRpcException {
28 final XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
29 config.setServerURL(new URL("http://127.0.0.1:8000"));
30 final XmlRpcClient client = new XmlRpcClient();
31 client.setConfig(config);
32
33 Object obj = client.execute("add", new Object[] { new Integer(33), new Integer(9) });
34 dump(obj);
35
36 obj = client.execute("random_list", new Object[] { new Integer(14) });
37 dump(obj);
38
39 obj = client.execute("random_map", new Object[] { new Integer(9) });
40 dump(obj);
41
42 try {
43 obj = client.execute("random_map", new Object[] { new Integer(-1) });
44 throw new RuntimeException("La llamada remote deberia haber generado excepcion");
45 } catch (XmlRpcException e) {
46 e.printStackTrace();
47 }
48 }
49
50 }



El servidor Python:



1 from SimpleXMLRPCServer import SimpleXMLRPCServer
2 import random
3
4 def add(x,y):
5 return x + y
6
7 def random_list(num):
8 num = int(num)
9 if(num <= 0):
10 raise Exception("num debe ser mayor a 0")
11 list = []
12 for i in range(num):
13 list.append(random.randint(1, 999999))
14 return list
15
16 def random_map(num):
17 num = int(num)
18 if(num <= 0):
19 raise Exception("num debe ser mayor a 0")
20 map = {}
21 for i in range(num):
22 key = "elem_%d" % i
23 map[key] = random.randint(1, 999999)
24 return map
25
26 if __name__ == '__main__':
27 server = SimpleXMLRPCServer(("127.0.0.1", 8000))
28 server.register_function(add, 'add')
29 server.register_function(random_list, 'random_list')
30 server.register_function(random_map, 'random_map')
31 server.serve_forever()



El cliente Python:



1 import xmlrpclib
2 from pprint import pprint
3
4 if __name__ == '__main__':
5 proxy = xmlrpclib.Server('http://localhost:8000/xmlrpc')
6 pprint(proxy.Calculator.add(2,3))
7 pprint(proxy.Calculator.randomList(8))
8 pprint(proxy.Calculator.randomMap2(8))



Al ejecutar el cliente Python, obtengo:


5
[-816678161,
1435519307,
-648064553,
1198345419,
-332555131,
1349182312,
1286868314,
1756261972]
{'0': -1238582501,
'1': -711045786,
'2': 1242324380,
'3': 453035820,
'4': 727377110,
'5': 1443025388,
'6': -280665009,
'7': -1336015917}


y al ejecutar el cliente Java (esa excepcion que se muestra es un error producido adrede, para ejemplificar qué pasa cuando en el servidor se produce una excepción):


======================================================================
Clase: class java.lang.Integer
toString(): 42
======================================================================
Clase: class [Ljava.lang.Object;
toString(): [Ljava.lang.Object;@11a698a
---------- ARRAY ----------
Tamanio: 14
Object[0]: 140980
Object[1]: 917718
Object[2]: 951678
Object[3]: 405149
Object[4]: 758315
Object[5]: 412932
Object[6]: 488689
Object[7]: 721836
Object[8]: 658873
Object[9]: 590256
Object[10]: 667364
Object[11]: 552500
Object[12]: 784894
Object[13]: 865306
======================================================================
Clase: class java.util.HashMap
toString(): {elem_8=85992, elem_7=47193, elem_6=599464, elem_5=331449, elem_4=982397, elem_3=88299, elem_2=723048, elem_1=462681, elem_0=565753}
org.apache.xmlrpc.XmlRpcException: :num debe ser mayor a 0
at org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:186)
at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:145)
at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:94)
at org.apache.xmlrpc.client.XmlRpcSunHttpTransport.sendRequest(XmlRpcSunHttpTransport.java:44)
at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:53)
at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:166)
at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:136)
at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:125)
at ar.com.hgdeoro.xmlrpc.Client.main(Client.java:43)

sábado, 4 de agosto de 2007

JBoss IDE: nightly builds

Para aquellos que (como yo) están ansiosos por la llegada de la versión 2 de JBoss IDE (por estar basado en Eclipse 3.3 y el soporte para JBoss Seam), pueden ir chequeando la lista de correo y bajar y probar los "nightly builds".

sábado, 28 de julio de 2007

JSF con Eclipse 3.3

Salió la nueva versión de Eclipse (v3.3), con soporte completo para JSF. El tutorial es bastante explicativo, lo complicado es encontrar las últimas versiones de las librerías, así que les incluyo los links a las versiones que utilicé yo:
Si no tenés eclipse instalado, lo mejor es bajarlo desde la página del proyecto WTP. (linux, macos, win32).
Yo seguí el tutorial usando Tomcat 6 y todo funcionó de maravillas!!!

viernes, 27 de julio de 2007

Problemas con Hibernate y @Where

Intenté utilizar @Where en un proyecto, donde una clase esta mapeada asi:

@Where(clause="borrada = false")
private List opciones;

La lista posee instancias de 'Opcion' y quiero que NO se incluyan las borradas (Opcion posee un campo booleano llamado 'borrada').

Eso NO funciona y genera una Excepcion:

org.postgresql.util.PSQLException: ERROR: column opciones0_.false does not exist


org.hibernate.exception.SQLGrammarException: could not initialize a collection: [xxxxxxxxxxxxxxxx.PreguntaMultipleOpcion.opciones#201]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.loadCollection(Loader.java:1992)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:249)
.............
Caused by: org.postgresql.util.PSQLException: ERROR: column opciones0_.false does not exist
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1512)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1297)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:188)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:430)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:346)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:250)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:92)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1778)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.loadCollection(Loader.java:1985)
... 29 more
... Removed 21 stack frames




El problema es que genera un SQL erroneo:

from Opcion opciones0_ where ( opciones0_.borrada = opciones0_.false)

Utilizando PostgreSql 8, encontré una forma de hacerlo funcionar:

@Where(clause="borrada = ('false'::BOOLEAN)")

esto genera un SQL correcto:

from Opcion opciones0_ where ( opciones0_.borrada = ('false'::BOOLEAN))

Será esto un bug, o es el funcionamiento normal de Hibernate?