viernes, febrero 21, 2014

Windows: Kill / ps equivalentes

Como se puede listar las tareas/procesos de windows desde línea de comandos?

tasklist

Como se puede matar un proceso a partir de su id?


Taskkill /PID 756 /F

De nada! :D.

jueves, febrero 06, 2014

Groovy: Imprimiendo las properties de un objeto

A veces, en especial mientras ejecutas tests, necesitas sacar la información de tus objetos de dominio.

Empiezas con un println sencillo y al rato tu código apesta porque tienes println infumables que además habrá que revisar el día que cambias la definición de tus clases.

Así que para ahorrarme estos disgustos he acabado haciendo una clase muy sencilla que directamente te permite sacar la información de cualquier dominio (o listas de dominios) de forma genérica.

El código mezclando groovy con la api de reflection de java queda como sigue:

package arrizabalaga.mocks
import java.lang.reflect.Field
import java.lang.reflect.Modifier
import arrizabalaga.DogSample
class TestHelper {
/**
* Map with properties that must NOT be printed
*/
static Map _BLACK_PROPERTIES=[
(DogSample.class):["nickName"]]
/**
* Prints filtered properties from a list of objects
* @param obj List with data
* @return String formatted
*/
public static String printList(List obj,int max=null){
StringBuffer strResult= new StringBuffer()
List subList=max!=null?obj.take(max):obj
subList.each { strResult<< printAll(it) }
return strResult.toString()
}
/**
* Prints properties from the given object
* @param obj Object to be printed
* @return
*/
public static String printAll(def obj){
String resul="---[${obj?.class}: ${obj?.hasProperty('id')?obj.id:''}]---\n".toString()
Map props=prepareFields(obj)
props.each{k,v->
resul+= "\t$k:$v\n".toString()
}
resul+="------"
return resul
}
/**
* Gets list of fields that must be printed for an specific class
* @param fields Initial list of fields (is used in recursion)
* @param type The class to filter its fields
* @param blacklistProperties List of strings with the names of properties that must be removed
* @return
*/
private static List<Field> getFilteredFields(List<Field> fields, Class<?> type,List<String> blacklistProperties) {
for (Field field: type.getDeclaredFields()) {
if(!field.synthetic &&
!(field.name in blacklistProperties) &&
!(Modifier.isStatic(((Field)field).modifiers))) {
fields.add(field);
}
}
if (type.getSuperclass() != null) {
fields = getFilteredFields(fields, type.getSuperclass(),blacklistProperties);
}
return fields;
}
/**
* Given an object it returns a map made of fieldName|value pairs
* @param obj Object to be trace
* @return Map with pairs of fieldName|value
*/
private static prepareFields(def obj) {
if(!obj) {
return [:]
}
List blacklistProperties=_BLACK_PROPERTIES.get(obj.class)?:[]
List<Field> fields=getFilteredFields(new LinkedList<Field>(),obj.class,blacklistProperties)
return fields.collectEntries { v ->
[ (v.name):obj[v.name] ]
}
}
}

Si vas por partes verás que es muy sencillo, el único detalle más complicado tiene que ver con los campos heredados ya que hay que escalar en la jerarquía para poder listarlos.

Ale, espero que le sirve a alguien!
Iván.