com.gisgraphy.hibernate.projection.ProjectionBean.java Source code

Java tutorial

Introduction

Here is the source code for com.gisgraphy.hibernate.projection.ProjectionBean.java

Source

/*******************************************************************************
 *   Gisgraphy Project 
 * 
 *   This library is free software; you can redistribute it and/or
 *   modify it under the terms of the GNU Lesser General Public
 *   License as published by the Free Software Foundation; either
 *   version 2.1 of the License, or (at your option) any later version.
 * 
 *   This library is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 *   Lesser General Public License for more details.
 * 
 *   You should have received a copy of the GNU Lesser General Public
 *   License along with this library; if not, write to the Free Software
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
 * 
 *  Copyright 2008  Gisgraphy project 
 *  David Masclet <davidmasclet@gisgraphy.com>
 *  
 *  
 *******************************************************************************/
/**
 * This work was partially supported by the European Commission, under the 6th
 * Framework Programme, contract IST-2-004688-STP. This library is free
 * software; you can redistribute it and/or modify it under the terms of the GNU
 * Lesser General Public License as published by the Free Software Foundation;
 * either version 2.1 of the License, or (at your option) any later version.
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details. You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package com.gisgraphy.hibernate.projection;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * @author <a href="mailto:david.masclet@gisgraphy.com">David Masclet</a>
 */
public class ProjectionBean extends ProjectionList {

    private static Logger logger = LoggerFactory.getLogger(ProjectionBean.class);

    /**
     * @param fieldList
     *                a list of fields to retrieve <b>Important Note</b> : the
     *                projection are automatically aliased with the same name,
     *                you could have some problems when using restriction
     *                (column yX_ doesn't exists) see
     *                http://opensource.atlassian.com/projects/hibernate/browse/HHH-817.
     *                To avoid this problem you could disable aliasing .<br/>
     *                activate auto-aliasing if you want to use aliasToBean
     *                Transformers. disable auto-aliasing if you want to add a
     *                restriction on a field that is in the fields list
     * @return a new ProjectionList
     */
    public static ProjectionList fieldList(List<String> fieldList, boolean autoaliasing) {
        return new ProjectionBean(fieldList, autoaliasing).projectionList;
    }

    /**
     * @param clazz
     *                the class to inspect to retrieve the fields
     * @param ignoreFields
     *                an array of fields that should be ignore
     * @param autoaliasing
     *                if the fields should be auto-aliased <b>See important note
     *                above</b>
     * @return a new ProjectionList
     */
    public static ProjectionList beanFieldList(Class<?> clazz, String[] ignoreFields, boolean autoaliasing) {
        return new ProjectionBean(inspectBean(clazz, ignoreFields), autoaliasing).projectionList;
    }

    private static List<String> inspectBean(Class<?> clazz, String[] ignoreFields) {
        if (clazz == null) {
            throw new IllegalArgumentException("Can not inspect a null bean");
        }
        List<String> fieldNames = new ArrayList<String>();
        PropertyDescriptor[] att = null;
        try {
            att = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
            List<String> ignoreFieldsList = Arrays.asList(ignoreFields);
            for (int i = 0; i < att.length; i++) {
                String fieldName = att[i].getDisplayName();
                if (!"class".equals(fieldName) && !isIgnoreFields(ignoreFieldsList, fieldName)) {
                    fieldNames.add(fieldName);
                }
            }
        } catch (Exception e) {
            logger.error("can not inspect bean " + clazz.getSimpleName() + " : " + e.getMessage(), e);
        }

        return fieldNames;
    }

    private static boolean isIgnoreFields(List<String> ignoreFieldsList, String fieldName) {
        return ignoreFieldsList.contains(fieldName);
    }

    /**
     * Default SerialId
     */
    private static final long serialVersionUID = -5528427011925538257L;

    private ProjectionList projectionList = Projections.projectionList();

    /**
     * 
     */
    /**
     * @param fields
     *                the list of the field names
     * @param autoAliasing
     *                if the fields should be autoaliased. <b>See important note
     *                above</b>
     */
    public ProjectionBean(List<String> fields, boolean autoAliasing) {
        super();
        for (String field : fields) {
            if (autoAliasing) {
                projectionList.add(Projections.property(field).as(field));
            } else {
                projectionList.add(Projections.property(field));
            }
        }
    }

}