/* * Hibernate OGM, Domain model persistence for NoSQL datastores * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.ogm.dialect.impl; import java.io.Serializable; import java.util.Arrays; import java.util.List; import org.hibernate.ogm.dialect.batch.spi.OperationsQueue; import org.hibernate.ogm.dialect.query.spi.BackendQuery; import org.hibernate.ogm.dialect.query.spi.ClosableIterator; import org.hibernate.ogm.dialect.query.spi.QueryParameters; import org.hibernate.ogm.dialect.spi.AssociationContext; import org.hibernate.ogm.dialect.spi.AssociationTypeContext; import org.hibernate.ogm.dialect.spi.GridDialect; import org.hibernate.ogm.dialect.spi.NextValueRequest; import org.hibernate.ogm.dialect.spi.OperationContext; import org.hibernate.ogm.dialect.spi.TupleContext; import org.hibernate.ogm.entityentry.impl.TuplePointer; import org.hibernate.ogm.model.key.spi.AssociationKey; import org.hibernate.ogm.model.key.spi.AssociationKeyMetadata; import org.hibernate.ogm.model.key.spi.EntityKey; import org.hibernate.ogm.model.spi.Association; import org.hibernate.ogm.model.spi.Tuple; import org.hibernate.ogm.util.impl.CoreLogCategories; import org.hibernate.ogm.util.impl.Log; import org.jboss.logging.Logger; /** * A wrapper dialect that logs any performance-relevant calls performed on the real dialect. * It is only used when this class's logger level is set to Trace * * @author Sebastien Lorber (<i>lorber.sebastien@gmail.com</i>) * @author Emmanuel Bernard <emmanuel@hibernate.org> * * @see GridDialectInitiator */ public class GridDialectLogger extends ForwardingGridDialect<Serializable> { private static final Log log = Logger.getMessageLogger( Log.class, CoreLogCategories.DATASTORE_ACCESS.toString() ); public GridDialectLogger(GridDialect gridDialect) { super( gridDialect ); } /** * Returns true if this grid dialect logger should wrap the real grid dialect * * @return boolean */ public static boolean activationNeeded() { return log.isTraceEnabled(); } @Override public Tuple getTuple(EntityKey key, OperationContext operationContext) { log.tracef( "Reading tuple with key %1$s and context %2$s", key, operationContext ); return super.getTuple( key, operationContext ); } @Override public List<Tuple> getTuples(EntityKey[] keys, TupleContext tupleContext) { if ( log.isTraceEnabled() ) { log.tracef( "Reading tuples with keys %1$s and context %2$s", Arrays.toString( keys ), tupleContext ); } return super.getTuples( keys, tupleContext ); } @Override public Tuple createTuple(EntityKey key, OperationContext operationContext) { log.tracef( "Creating tuple with key %1$s", key ); return super.createTuple( key, operationContext ); } @Override public void insertOrUpdateTuple(EntityKey key, TuplePointer tuplePointer, TupleContext tupleContext) { if ( tuplePointer.getTuple().getSnapshot().isEmpty() ) { log.tracef( "Inserting tuple with key %1$s into datastore", key ); } else { log.tracef( "Updating tuple with key %1$s in datastore", key ); } super.insertOrUpdateTuple( key, tuplePointer, tupleContext ); } @Override public void removeTuple(EntityKey key, TupleContext tupleContext) { log.tracef( "Removing tuple with key %1$s from datastore", key ); super.removeTuple( key, tupleContext ); } @Override public Association getAssociation(AssociationKey key, AssociationContext associationContext) { log.tracef( "Reading association with key %1$s from datastore and context %2$s", key, associationContext ); return super.getAssociation( key, associationContext ); } @Override public Association createAssociation(AssociationKey key, AssociationContext associationContext) { log.tracef( "Creating association with key %1$s", key ); return super.createAssociation( key, associationContext ); } @Override public void insertOrUpdateAssociation(AssociationKey key, Association association, AssociationContext associationContext) { if ( association.getSnapshot().size() == 0 ) { log.tracef( "Creating association with key %1$s in datastore", key ); } else { log.tracef( "Updating association with key %1$s in datastore", key ); } super.insertOrUpdateAssociation( key, association, associationContext ); } @Override public void removeAssociation(AssociationKey key, AssociationContext associationContext) { log.tracef( "Removing association with key %1$s from datastore", key ); super.removeAssociation( key, associationContext ); } @Override public Number nextValue(NextValueRequest request) { log.tracef( "Extracting next value from key %1$s", request.getKey() ); return super.nextValue( request ); } @Override public boolean isStoredInEntityStructure(AssociationKeyMetadata associationKeyMetadata, AssociationTypeContext associationTypeContext) { log.tracef( "Determining whether association %1$s is stored in an entity structure", associationKeyMetadata ); return super.isStoredInEntityStructure( associationKeyMetadata, associationTypeContext ); } @Override public void executeBatch(OperationsQueue queue) { log.tracef( "Executing batch with %1$s items", queue.size() ); super.executeBatch( queue ); } @Override public ClosableIterator<Tuple> executeBackendQuery(BackendQuery<Serializable> query, QueryParameters queryParameters, TupleContext tupleContext) { log.tracef( "Executing backend query: %1$s", query.getQuery() ); return super.executeBackendQuery( query, queryParameters, tupleContext ); } }