Package de.innovationgate.webgate.api.templates

Source Code of de.innovationgate.webgate.api.templates.LazyBeanList

/*******************************************************************************
* Copyright 2009, 2010 Innovation Gate GmbH. All Rights Reserved.
*
* This file is part of the OpenWGA server platform.
*
* OpenWGA is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* In addition, a special exception is granted by the copyright holders
* of OpenWGA called "OpenWGA plugin exception". You should have received
* a copy of this exception along with OpenWGA in file COPYING.
* If not, see <http://www.openwga.com/gpl-plugin-exception>.
*
* OpenWGA 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenWGA in file COPYING.
* If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package de.innovationgate.webgate.api.templates;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;

import org.apache.commons.collections.map.LinkedMap;

import de.innovationgate.webgate.api.WGAPIException;
import de.innovationgate.webgate.api.WGResultSetCore;

/**
* Implements a "lazy" list of retrieved beans.
* This list can first be filled with the keys of beans. When beans are used, they are retrieved by their keys automatically.
* However beans that never get used will not be retrieved, saving performance and resources.
*/
public class LazyBeanList implements List, WGResultSetCore {
 
  private String _folder;
  private SimpleContentSource _db;
  private Map _contents;
  private List _keys;
 
  public LazyBeanList(SimpleContentSource db, String folder, Map contents) {
   
    _db = db;
    _folder = folder;
    _keys = new ArrayList(contents.keySet());
    _contents = contents;
    
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#size()
   */
  public int size() {
    return _keys.size();
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#isEmpty()
   */
  public boolean isEmpty() {
    return _contents.isEmpty();
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#contains(java.lang.Object)
   */
  public boolean contains(Object arg0) {
    try {
            fetchAll();
        }
        catch (WGAPIException e) {
            throw new IllegalStateException("Unable to execute internal fetchAll() bc. of exception: " + e.getClass().getName() + " message: " + e.getMessage());
        }
    return _contents.containsValue(arg0);
  }

  /**
   * @throws WGAPIException
   *
   */
  private void fetchAll() throws WGAPIException {
    Iterator keys = _keys.iterator();
    while (keys.hasNext()) {
      fetch(keys.next());
    }
   
  }

  /**
   * @param object
   * @throws WGAPIException
   */
  private Object fetch(Object key) throws WGAPIException {
 
    Object bean = _contents.get(key);
    if (bean == null) {
      bean = _db.getContent(_folder, key);
      _contents.put(key, bean);
    }
    return _db.createWrapper(new BeanKey(_folder, key), bean, true);
   
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#iterator()
   */
  public Iterator iterator() {
    return new LazyIterator(this);
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#toArray()
   */
  public Object[] toArray() {
    try {
            fetchAll();
        }
        catch (WGAPIException e) {
            throw new IllegalStateException("Unable to execute internal fetchAll() bc. of exception: " + e.getClass().getName() + " message: " + e.getMessage());
        }
    return _contents.values().toArray();
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#toArray(java.lang.Object[])
   */
  public Object[] toArray(Object[] arg0) {
    try {
            fetchAll();
        }
        catch (WGAPIException e) {
            throw new IllegalStateException("Unable to execute internal fetchAll() bc. of exception: " + e.getClass().getName() + " message: " + e.getMessage());
        }
    return _contents.values().toArray(arg0);
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#add(java.lang.Object)
   */
  public boolean add(Object arg0) {
    return false;
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#remove(java.lang.Object)
   */
  public boolean remove(Object arg0) {
    return false;
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#containsAll(java.util.Collection)
   */
  public boolean containsAll(Collection arg0) {
    try {
            fetchAll();
        }
        catch (WGAPIException e) {
            throw new IllegalStateException("Unable to execute internal fetchAll() bc. of exception: " + e.getClass().getName() + " message: " + e.getMessage());
        }
    return _contents.values().containsAll(arg0);
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#addAll(java.util.Collection)
   */
  public boolean addAll(Collection arg0) {
    return false;
  }

  /* (Kein Javadoc)
   * @see java.util.List#addAll(int, java.util.Collection)
   */
  public boolean addAll(int arg0, Collection arg1) {
    return false;
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#removeAll(java.util.Collection)
   */
  public boolean removeAll(Collection arg0) {
    return false;
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#retainAll(java.util.Collection)
   */
  public boolean retainAll(Collection arg0) {
    return false;
  }

  /* (Kein Javadoc)
   * @see java.util.Collection#clear()
   */
  public void clear() {
  }

  /* (Kein Javadoc)
   * @see java.util.List#get(int)
   */
  public Object get(int arg0) {
    try {
            return fetch(_keys.get(arg0));
        }
        catch (WGAPIException e) {
            throw new IllegalStateException("Unable to execute internal fetch() bc. of exception: " + e.getClass().getName() + " message: " + e.getMessage());
        }
  }

  /* (Kein Javadoc)
   * @see java.util.List#set(int, java.lang.Object)
   */
  public Object set(int arg0, Object arg1) {
    return null;
  }

  /* (Kein Javadoc)
   * @see java.util.List#add(int, java.lang.Object)
   */
  public void add(int arg0, Object arg1) {
  }

  /* (Kein Javadoc)
   * @see java.util.List#remove(int)
   */
  public Object remove(int arg0) {
    return null;
  }

  /* (Kein Javadoc)
   * @see java.util.List#indexOf(java.lang.Object)
   */
  public int indexOf(Object arg0) {
    Iterator keys = _keys.iterator();
    Object key;
    Object bean;
    while (keys.hasNext()) {
      key = keys.next();
      try {
                bean = fetch(key);
            }
            catch (WGAPIException e) {
                throw new IllegalStateException("Unable to execute internal fetch() bc. of exception: " + e.getClass().getName() + " message: " + e.getMessage());
            }
      if (bean.equals(arg0)) {
        return _keys.indexOf(key);
      }
    }
    return -1;
  }

  /* (Kein Javadoc)
   * @see java.util.List#lastIndexOf(java.lang.Object)
   */
  public int lastIndexOf(Object arg0) {
    ListIterator keys = _keys.listIterator();
    Object key;
    Object bean;
    while (keys.hasPrevious()) {
      key = keys.previous();
      try {
                bean = fetch(key);
            }
            catch (WGAPIException e) {
                throw new IllegalStateException("Unable to execute internal fetch() bc. of exception: " + e.getClass().getName() + " message: " + e.getMessage());
            }
      if (bean.equals(arg0)) {
        return _keys.indexOf(key);
      }
    }
    return -1;
  }

  /* (Kein Javadoc)
   * @see java.util.List#listIterator()
   */
  public ListIterator listIterator() {
    return new LazyIterator(this);
  }

  /* (Kein Javadoc)
   * @see java.util.List#listIterator(int)
   */
  public ListIterator listIterator(int arg0) {
    return new LazyIterator(this, arg0);
  }

  /* (Kein Javadoc)
   * @see java.util.List#subList(int, int)
   */
  public List subList(int arg0, int arg1) {
   
    Iterator keys = _keys.subList(arg0, arg1).iterator();
    Map subMap = new LinkedMap();
    Object key;
    while (keys.hasNext()) {
      key = keys.next();
      subMap.put(key, _contents.get(key));
    }
   
    return new LazyBeanList(_db, _folder, subMap);
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGResultSetCore#results()
   */
  public int results() {
    return size();
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGResultSetCore#getContentList(int, int)
   */
  public List getContentList(int start, int length) {
    int toIdx = start - 1 + length;
    if (toIdx > size()) {
        toIdx = size();
    }
        return subList(start - 1, toIdx);
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGResultSetCore#getContentList()
   */
  public List getContentList() {
    return this;
  }

    public boolean isReturnsKeys() {
        return false;
    }

    public List getColumnNames() {
        return null;
    }

}
TOP

Related Classes of de.innovationgate.webgate.api.templates.LazyBeanList

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.