Package com.buschmais.xo.test.trace.impl

Source Code of com.buschmais.xo.test.trace.impl.TraceDatastore

package com.buschmais.xo.test.trace.impl;

import com.buschmais.xo.api.XOException;
import com.buschmais.xo.spi.datastore.Datastore;
import com.buschmais.xo.spi.datastore.DatastoreEntityMetadata;
import com.buschmais.xo.spi.datastore.DatastoreMetadataFactory;
import com.buschmais.xo.spi.datastore.DatastoreRelationMetadata;
import com.buschmais.xo.spi.interceptor.InterceptorFactory;

import javax.management.*;
import java.lang.management.ManagementFactory;
import java.util.Collection;

/**
* {@link Datastore} implementation allowing tracing on delegates.
*/
public class TraceDatastore<DatastoreSession extends com.buschmais.xo.spi.datastore.DatastoreSession, EntityMetadata extends DatastoreEntityMetadata<EntityDiscriminator>, EntityDiscriminator, RelationMetadata extends DatastoreRelationMetadata<RelationDiscriminator>, RelationDiscriminator> implements Datastore<TraceDatastoreSession, EntityMetadata, EntityDiscriminator, RelationMetadata, RelationDiscriminator> {

    private Datastore<DatastoreSession, EntityMetadata, EntityDiscriminator, RelationMetadata, RelationDiscriminator> delegate;

    private InterceptorFactory interceptorFactory;

    private TraceMonitor traceMonitor;

    public TraceDatastore(Datastore<DatastoreSession, EntityMetadata, EntityDiscriminator, RelationMetadata, RelationDiscriminator> delegate, InterceptorFactory interceptorFactory, TraceMonitor traceMonitor) {
        this.delegate = delegate;
        this.interceptorFactory = interceptorFactory;
        this.traceMonitor = traceMonitor;
    }

    @Override
    public void init(Collection registeredMetadata) {
        ObjectName objectName = getObjectName();
        try {
            getMBeanServer().registerMBean(traceMonitor, objectName);
        } catch (JMException e) {
            throw new XOException("Cannot register trace monitor MBean for object name " + objectName, e);
        }
        delegate.init(registeredMetadata);
    }

    @Override
    public DatastoreMetadataFactory<EntityMetadata, EntityDiscriminator, RelationMetadata, RelationDiscriminator> getMetadataFactory() {
        return delegate.getMetadataFactory();
    }

    @Override
    public TraceDatastoreSession createSession() {
        DatastoreSession delegateSession = delegate.createSession();
        return new TraceDatastoreSession(interceptorFactory.addInterceptor(delegateSession, com.buschmais.xo.spi.datastore.DatastoreSession.class), interceptorFactory);
    }

    @Override
    public void close() {
        delegate.close();
        ObjectName objectName = getObjectName();
        try {
            getMBeanServer().unregisterMBean(objectName);
        } catch (JMException e) {
            throw new XOException("Cannot unregister trace monitor MBean for object name " + objectName, e);
        }
    }

    private MBeanServer getMBeanServer() {
        return ManagementFactory.getPlatformMBeanServer();
    }

    private ObjectName getObjectName() {
        String name = traceMonitor.getXOUnit().getName();
        try {
            return new ObjectName("com.buschmais.xo.trace","xo-unit", name);
        } catch (MalformedObjectNameException e) {
            throw new XOException("Cannot create object name for XO unit " + name, e);
        }

    }
}
TOP

Related Classes of com.buschmais.xo.test.trace.impl.TraceDatastore

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.