/* * #! * Ontopia Engine * #- * Copyright (C) 2001 - 2013 The Ontopia Project * #- * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * !# */ package net.ontopia.utils; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; /** * INTERNAL: Grabber that makes the second grabber grab what the first * grabber grabs and so on. Any number of grabbers may be chained * together.</p> */ public class GrabberGrabber<O, G> implements GrabberIF<O, G> { protected GrabberIF<O, ?> firstGrabber; protected List<GrabberIF> additionalGrabbers = new ArrayList<GrabberIF>(); public GrabberGrabber(GrabberIF<O, ?> firstGrabber, GrabberIF... additionalGrabbers) { this.firstGrabber = firstGrabber; this.additionalGrabbers = new ArrayList<GrabberIF>(Arrays.asList(additionalGrabbers)); } /** * Gets the chained grabbers. */ public List<GrabberIF> getGrabbers() { List<GrabberIF> grabbers = new ArrayList(Collections.singleton(firstGrabber)); grabbers.addAll(additionalGrabbers); return grabbers; } /** * Sets the grabbers. */ public void setGrabbers(List<GrabberIF> grabbers) { if (grabbers.size() < 1) { throw new OntopiaRuntimeException("Cannot set " + "list of GrabberGrabber grabbers with less than one grabber."); } this.firstGrabber = (GrabberIF<O, ?>) grabbers.get(0); this.additionalGrabbers = grabbers.subList(1, grabbers.size()); } /** * Add grabber to the end of the grabber list. */ public void addGrabber(GrabberIF grabber) { additionalGrabbers.add(grabber); } public G grab(O object) { // run firstGrabber Object grabbed = firstGrabber.grab(object); // Loop over grabbers Iterator<GrabberIF> iter = additionalGrabbers.iterator(); while (iter.hasNext()) { GrabberIF grabber = iter.next(); grabbed = grabber.grab(grabbed); } return (G) grabbed; } }