package com.k_int.svc.s2js;

import java.util.*;
import org.hibernate.*;
import org.hibernate.criterion.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Defines a dataset from a hibernate class that is to be exposed as a JSON source
 */
public class S2JSDataSet {

  public static Log log = LogFactory.getLog(S2JSDataSet.class);

  private String base_class_name;
  private String default_filter_property;
  private List<String> default_result_properties;

  // Known properties define what can be asked for in the response 
  private Map<String,String> known_properties;
  private Map<String,String> scopes;

  public S2JSDataSet() {
  }

  public void setBaseClassName(String base_class_name) {
    this.base_class_name = base_class_name;
  }
  
  public String getBaseClassName() {
    return base_class_name;
  }

  public void setKnownProperties(Map<String,String> known_properties) {
    this.known_properties = known_properties;
  }
  
  public Map<String,String> getKnownProperties() {
    return known_properties;
  }

  public void setScopes(Map<String,String> scopes) {
    this.scopes = scopes;
  }

  public Map<String,String> getScopes() {
    return scopes;
  }

  public void setDefaultResultProperties(List<String> default_result_properties) {
    log.debug("setting default result properties "+default_result_properties);
    this.default_result_properties = default_result_properties;
  }

  public List<String> getDefaultResultProperties() {
    return default_result_properties;
  }

  // Evaluate this dataset
  public List evaluate(Session session) {

    log.debug("evaluate");

    // 1. Construct the OQL
    Criteria crit = session.createCriteria(base_class_name);

    // See if there are any filter values to add
    // crit.add( Restrictions.eq( "color", eg.Color.BLACK ) );
    
    log.debug("default result properties = "+default_result_properties);

    // Set the results we need
    if ( ( default_result_properties != null ) && ( default_result_properties.size() > 0 ) ) {
      ProjectionList p = Projections.projectionList();
      for ( java.util.Iterator pi = default_result_properties.iterator(); pi.hasNext(); ) {
        String property_name = (String) pi.next();
        p.add( Projections.property(property_name) );
      }
      crit.setProjection( p );
    }

    log.debug("complete "+crit);

    // crit.setMaxResults(10);
    return crit.list();
  }

}
