/** * INTERNAL: Lazy initialization of xmlTypeFactory allows to avoid loading xdb-dependent class * XMLTypeFactoryImpl unless xdb is used. * * @return XMLTypeFactory */ protected XMLTypeFactory getXMLTypeFactory() { if (xmlTypeFactory == null) { String className = "oracle.toplink.internal.platform.database.oracle.xdb.XMLTypeFactoryImpl"; try { if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) { Class xmlTypeFactoryClass = (Class) AccessController.doPrivileged( new PrivilegedClassForName( className, true, this.getClass().getClassLoader())); Constructor xmlTypeFactoryConstructor = (Constructor) AccessController.doPrivileged( new PrivilegedGetConstructorFor(xmlTypeFactoryClass, new Class[0], true)); xmlTypeFactory = (XMLTypeFactory) AccessController.doPrivileged( new PrivilegedInvokeConstructor(xmlTypeFactoryConstructor, new Object[0])); } else { Class xmlTypeFactoryClass = PrivilegedAccessHelper.getClassForName( className, true, this.getClass().getClassLoader()); Constructor xmlTypeFactoryConstructor = PrivilegedAccessHelper.getConstructorFor(xmlTypeFactoryClass, new Class[0], true); xmlTypeFactory = (XMLTypeFactory) PrivilegedAccessHelper.invokeConstructor( xmlTypeFactoryConstructor, new Object[0]); } } catch (Exception e) { throw QueryException.reflectiveCallOnTopLinkClassFailed(className, e); } } return xmlTypeFactory; }
/** * INTERNAL: Invalid the cache, that is, those objects in the cache that were affected by the * query. */ protected void invalidateCache() { oracle.toplink.sessions.IdentityMapAccessor identityMapAccessor = getSession().getIdentityMapAccessor(); if (getSelectionCriteria() == null) { // Invalidate the whole class since the user did not specify a where clause if (getDescriptor().isChildDescriptor()) { Vector collectionToInvalidate = identityMapAccessor.getAllFromIdentityMap( null, getReferenceClass(), getTranslationRow(), null); identityMapAccessor.invalidateObjects(collectionToInvalidate); } else { // if it's either a root class or there is no inheritance just clear the identity map identityMapAccessor.invalidateClass(getReferenceClass()); } } else { // Invalidate only those objects in the cache that match the selection criteria // Bug:4293920, expression parameters were not passed in boolean noObjectsModifiedInDb = result != null && result.intValue() == 0; try { int policy = InMemoryQueryIndirectionPolicy.SHOULD_IGNORE_EXCEPTION_RETURN_CONFORMED; if (noObjectsModifiedInDb) { policy = InMemoryQueryIndirectionPolicy.SHOULD_IGNORE_EXCEPTION_RETURN_NOT_CONFORMED; } Vector collectionToInvalidate = identityMapAccessor.getAllFromIdentityMap( getSelectionCriteria(), getReferenceClass(), getTranslationRow(), policy); identityMapAccessor.invalidateObjects(collectionToInvalidate); } catch (QueryException ex) { if (ex.getErrorCode() == QueryException.CANNOT_CONFORM_EXPRESSION) { // If no objects changed in the db - don't invalidate, ignore. if (!noObjectsModifiedInDb) { // Invalidate the whole class since the expression can't be selected in memory identityMapAccessor.invalidateClass(getReferenceClass()); } } else { throw ex; } } } }
/** * INTERNAL: Execute the query. If there are cached results return those. This must override the * super to support result caching. * * @param aSession - the session in which the receiver will be executed. * @return An object or vector, the result of executing the query. * @exception DatabaseException - an error has occurred on the database */ public Object execute(AbstractSession session, AbstractRecord row) throws DatabaseException { if (shouldCacheQueryResults()) { if (getContainerPolicy().overridesRead()) { throw QueryException.cannotCacheCursorResultsOnQuery(this); } if (isPrepared()) { // only prepared queries can have cached results. Object results = getQueryResults(session, row, true); // Bug6138532 - if results are "cached no results", return null immediately if (results == InvalidObject.instance) { return null; } if (results != null) { return results; } } } return super.execute(session, row); }