/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * 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. */ package com.liferay.portal.dao.orm.hibernate; import com.liferay.portal.kernel.dao.orm.CacheMode; import com.liferay.portal.kernel.dao.orm.LockMode; import com.liferay.portal.kernel.dao.orm.ORMException; import com.liferay.portal.kernel.dao.orm.Query; import com.liferay.portal.kernel.dao.orm.ScrollableResults; import com.liferay.portal.kernel.security.pacl.DoPrivileged; import com.liferay.portal.kernel.security.pacl.NotPrivileged; import com.liferay.portal.kernel.util.ClassLoaderUtil; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.StringBundler; import java.io.Serializable; import java.sql.Timestamp; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.hibernate.LockOptions; /** * @author Brian Wing Shun Chan * @author Shuyang Zhou */ @DoPrivileged public class QueryImpl implements Query { public QueryImpl(org.hibernate.Query query, boolean strictName) { _query = query; _strictName = strictName; String[] names = null; if (!_strictName) { names = query.getNamedParameters(); Arrays.sort(names); } _names = names; } @NotPrivileged @Override public int executeUpdate() throws ORMException { try { return _query.executeUpdate(); } catch (Exception e) { throw ExceptionTranslator.translate(e); } } @NotPrivileged @Override public Iterator<?> iterate() throws ORMException { return iterate(true); } @NotPrivileged @Override public Iterator<?> iterate(boolean unmodifiable) throws ORMException { try { return list(unmodifiable).iterator(); } catch (Exception e) { throw ExceptionTranslator.translate(e); } } @NotPrivileged @Override public Object iterateNext() throws ORMException { Iterator<?> iterator = iterate(false); if (iterator.hasNext()) { return iterator.next(); } return null; } @NotPrivileged @Override public List<?> list() throws ORMException { return list(false, false); } @NotPrivileged @Override public List<?> list(boolean unmodifiable) throws ORMException { return list(true, unmodifiable); } @NotPrivileged @Override public List<?> list(boolean copy, boolean unmodifiable) throws ORMException { // LPS-42478 is a workaround for HHH-8310. Remove this after upgrading // to Hibernate 4.3.6+. ClassLoader contextClassLoader = ClassLoaderUtil.getContextClassLoader(); ClassLoaderUtil.setContextClassLoader(null); try { List<?> list = _query.list(); if (unmodifiable) { list = Collections.unmodifiableList(list); } else if (copy) { list = ListUtil.copy(list); } return list; } catch (Exception e) { throw ExceptionTranslator.translate(e); } finally { ClassLoaderUtil.setContextClassLoader(contextClassLoader); } } @NotPrivileged @Override public ScrollableResults scroll() throws ORMException { // LPS-42478 is a workaround for HHH-8310. Remove this after upgrading // to Hibernate 4.3.6+. ClassLoader contextClassLoader = ClassLoaderUtil.getContextClassLoader(); ClassLoaderUtil.setContextClassLoader(null); try { return new ScrollableResultsImpl(_query.scroll()); } catch (Exception e) { throw ExceptionTranslator.translate(e); } finally { ClassLoaderUtil.setContextClassLoader(contextClassLoader); } } @Override public Query setBoolean(int pos, boolean value) { _query.setBoolean(pos, value); return this; } @Override public Query setBoolean(String name, boolean value) { if (!_strictName && (Arrays.binarySearch(_names, name) < 0)) { return this; } _query.setBoolean(name, value); return this; } @Override public Query setCacheable(boolean cacheable) { _query.setCacheable(cacheable); return this; } @Override public Query setCacheMode(CacheMode cacheMode) { _query.setCacheMode(CacheModeTranslator.translate(cacheMode)); return this; } @Override public Query setCacheRegion(String cacheRegion) { _query.setCacheRegion(cacheRegion); return this; } @Override public Query setDouble(int pos, double value) { _query.setDouble(pos, value); return this; } @Override public Query setDouble(String name, double value) { if (!_strictName && (Arrays.binarySearch(_names, name) < 0)) { return this; } _query.setDouble(name, value); return this; } @Override public Query setFirstResult(int firstResult) { _query.setFirstResult(firstResult); return this; } @Override public Query setFloat(int pos, float value) { _query.setFloat(pos, value); return this; } @Override public Query setFloat(String name, float value) { if (!_strictName && (Arrays.binarySearch(_names, name) < 0)) { return this; } _query.setFloat(name, value); return this; } @Override public Query setInteger(int pos, int value) { _query.setInteger(pos, value); return this; } @Override public Query setInteger(String name, int value) { if (!_strictName && (Arrays.binarySearch(_names, name) < 0)) { return this; } _query.setInteger(name, value); return this; } @Override public Query setLockMode(String alias, LockMode lockMode) { org.hibernate.LockMode hibernateLockMode = LockModeTranslator.translate( lockMode); LockOptions lockOptions = new LockOptions(hibernateLockMode); lockOptions.setAliasSpecificLockMode(alias, hibernateLockMode); _query.setLockOptions(lockOptions); return this; } @Override public Query setLong(int pos, long value) { _query.setLong(pos, value); return this; } @Override public Query setLong(String name, long value) { if (!_strictName && (Arrays.binarySearch(_names, name) < 0)) { return this; } _query.setLong(name, value); return this; } @Override public Query setMaxResults(int maxResults) { _query.setMaxResults(maxResults); return this; } @Override public Query setSerializable(int pos, Serializable value) { _query.setSerializable(pos, value); return this; } @Override public Query setSerializable(String name, Serializable value) { if (!_strictName && (Arrays.binarySearch(_names, name) < 0)) { return this; } _query.setSerializable(name, value); return this; } @Override public Query setShort(int pos, short value) { _query.setShort(pos, value); return this; } @Override public Query setShort(String name, short value) { if (!_strictName && (Arrays.binarySearch(_names, name) < 0)) { return this; } _query.setShort(name, value); return this; } @Override public Query setString(int pos, String value) { _query.setString(pos, value); return this; } @Override public Query setString(String name, String value) { if (!_strictName && (Arrays.binarySearch(_names, name) < 0)) { return this; } _query.setString(name, value); return this; } @Override public Query setTimestamp(int pos, Timestamp value) { _query.setTimestamp(pos, value); return this; } @Override public Query setTimestamp(String name, Timestamp value) { if (!_strictName && (Arrays.binarySearch(_names, name) < 0)) { return this; } _query.setTimestamp(name, value); return this; } @Override public String toString() { StringBundler sb = new StringBundler(7); sb.append("{names="); sb.append(Arrays.toString(_names)); sb.append(", _query="); sb.append(String.valueOf(_query)); sb.append(", _strictName="); sb.append(_strictName); sb.append("}"); return sb.toString(); } @NotPrivileged @Override public Object uniqueResult() throws ORMException { try { return _query.uniqueResult(); } catch (Exception e) { throw ExceptionTranslator.translate(e); } } private final String[] _names; private final org.hibernate.Query _query; private final boolean _strictName; }