/*
* Copyright (c) 2007, 2010, James Leigh All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the openrdf.org nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
package net.enilink.komma.em.internal.query;
import java.util.Iterator;
import java.util.List;
import net.enilink.commons.iterator.ConvertingIterator;
import net.enilink.komma.em.internal.IEntityManagerInternal;
import net.enilink.komma.core.IBindings;
import net.enilink.komma.core.IReference;
import net.enilink.komma.core.ITupleResult;
import net.enilink.komma.core.IValue;
import net.enilink.komma.core.URI;
/**
* Converts the repository result into a single Bean.
*
* @author James Leigh
* @author Ken Wenzel
*/
public class ProjectedTupleIterator extends
ConvertingIterator<IBindings<IValue>, Object> implements
ITupleResult<Object> {
private IEntityManagerInternal manager;
private int maxResults;
private int position;
private ITupleResult<IBindings<IValue>> result;
private ResultInfo resultInfo;
public ProjectedTupleIterator(IEntityManagerInternal manager,
ITupleResult<IBindings<IValue>> result, int maxResults,
ResultInfo resultInfo) {
super(result);
this.result = result;
this.manager = manager;
this.maxResults = maxResults;
this.resultInfo = resultInfo;
}
@Override
protected Object convert(IBindings<IValue> solution) {
Iterator<IValue> it = solution.iterator();
IValue value = it.hasNext() ? it.next() : null;
if (value == null) {
return null;
}
if (resultInfo != null) {
if (value instanceof IReference) {
if (!resultInfo.types.isEmpty()
&& resultInfo.types.get(0) == URI.class) {
return ((IReference) value).getURI();
} else if (resultInfo.typeRestricted) {
return manager.findRestricted((IReference) value,
resultInfo.types);
} else {
return manager.find((IReference) value, resultInfo.types);
}
} else {
return manager.toInstance(value, resultInfo.types.get(0), null);
}
}
return manager.toInstance(value, null, null);
}
@Override
public List<String> getBindingNames() {
return result.getBindingNames();
}
// private Map<Class<?>, List<Method>> useBindingsMap;
//
// private void bindValues(Object object, BindingSet solution) {
// List<Method> bindMethods = useBindingsMap != null ? useBindingsMap
// .get(object.getClass()) : null;
// if (bindMethods == null) {
// for (Method method : object.getClass().getMethods()) {
// UseBinding useBinding = method.getAnnotation(UseBinding.class);
// if (useBinding != null
// && solution.hasBinding(useBinding.value())
// && method.getParameterTypes().length == 1) {
// if (bindMethods == null) {
// bindMethods = new ArrayList<Method>();
// }
// bindMethods.add(method);
// }
// }
// if (useBindingsMap == null) {
// useBindingsMap = new HashMap<Class<?>, List<Method>>();
// }
// useBindingsMap.put(object.getClass(),
// bindMethods != null ? bindMethods : Collections
// .<Method> emptyList());
// }
//
// for (Method method : bindMethods) {
// UseBinding useBinding = method.getAnnotation(UseBinding.class);
// try {
// Object bindingValue = solution.getValue(useBinding.value());
// Class<?> type = method.getParameterTypes()[0];
// if (Boolean.class.equals(type) || Boolean.TYPE.equals(type)) {
// // convert to boolean value
// bindingValue = bindingValue != null;
// } else {
// bindingValue = manager.getInstance((Value) bindingValue);
// }
// method.invoke(object, bindingValue);
// } catch (Exception e) {
// throw new KommaException(e);
// }
// }
// }
@Override
public boolean hasNext() {
if (maxResults > 0 && position >= maxResults) {
close();
return false;
}
return super.hasNext();
}
@Override
public Object next() {
try {
position++;
return super.next();
} finally {
if (maxResults > 0 && position >= maxResults) {
close();
}
}
}
}