/* * Copyright 2013 GiavaCms.org. * * Licensed under the Eclipse Public License version 1.0, available at * http://www.eclipse.org/legal/epl-v10.html */ package org.giavacms.common.util; import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.net.URISyntaxException; import java.net.URL; import java.net.URLDecoder; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; import javax.persistence.Id; import org.jboss.logging.Logger; /** * Metodi di utilità per la reflection */ public class ReflectionUtils { static Logger logger = Logger.getLogger(ReflectionUtils.class); /** * Trova il valore del campo annotato con {@code @Id} * * @param <U> * @param clazz * @param u * @return */ public static <U> Object findIdFieldValue(Class<?> clazz, U u) { Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { Id id_anno = field.getAnnotation(Id.class); if (id_anno != null) { try { field.setAccessible(true); return field.get(u); } catch (Exception e) { return null; } } } // cerco anche nella classe padre se ce n'è una if (clazz.getGenericSuperclass() != null) { return findIdFieldValue(clazz.getSuperclass(), u); } return null; } /** * List directory contents for a resource folder. Not recursive. This is basically a brute-force implementation. * Works for regular files and also JARs. * * @author Greg Briggs * @param clazz Any java class that lives in the same place as the resources you want. * @param path Should end with "/", but not start with one. * @return Just the name of each member item, not the full paths. * @throws URISyntaxException * @throws IOException */ @SuppressWarnings("rawtypes") public static String[] getResourceListing(Class clazz, String path) { try { URL dirURL = clazz.getClassLoader().getResource(path); if (dirURL != null && dirURL.getProtocol().equals("file")) { /* A file path: easy enough */ return new File(dirURL.toURI()).list(); } if (dirURL == null) { /* * In case of a jar file, we can't actually find a directory. Have to assume the same jar as clazz. */ String me = clazz.getName().replace(".", "/") + ".class"; dirURL = clazz.getClassLoader().getResource(me); } if (dirURL.getProtocol().equals("jar")) { /* A JAR path */ String jarPath = dirURL.getPath().substring(5, dirURL.getPath().indexOf("!")); // strip out only the // JAR file JarFile jar = new JarFile(URLDecoder.decode(jarPath, "UTF-8")); Enumeration<JarEntry> entries = jar.entries(); // gives ALL // entries in // jar Set<String> result = new HashSet<String>(); // avoid duplicates // in case it is a // subdirectory while (entries.hasMoreElements()) { String name = entries.nextElement().getName(); if (name.startsWith(path)) { // filter according to the path String entry = name.substring(path.length()); int checkSubdir = entry.indexOf("/"); if (checkSubdir >= 0) { // if it is a subdirectory, we just return the // directory name entry = entry.substring(0, checkSubdir); } result.add(entry); } } return result.toArray(new String[result.size()]); } } catch (Exception e) { logger.error(e.getMessage(), e); } return new String[] {}; } }