/* * (C) Copyright 2006-2016 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * Thierry Delprat */ package org.nuxeo.ecm.platform.audit.service; import java.io.Serializable; import java.util.Date; import java.util.List; import java.util.Map; import javax.persistence.EntityManager; import org.nuxeo.ecm.core.persistence.PersistenceProvider; import org.nuxeo.ecm.core.persistence.PersistenceProvider.RunCallback; import org.nuxeo.ecm.core.persistence.PersistenceProvider.RunVoid; import org.nuxeo.ecm.core.persistence.PersistenceProviderFactory; import org.nuxeo.ecm.platform.audit.api.ExtendedInfo; import org.nuxeo.ecm.platform.audit.api.FilterMapEntry; import org.nuxeo.ecm.platform.audit.api.LogEntry; import org.nuxeo.ecm.platform.audit.impl.ExtendedInfoImpl; import org.nuxeo.ecm.platform.audit.service.extension.AuditBackendDescriptor; import org.nuxeo.runtime.api.Framework; import org.nuxeo.runtime.model.DefaultComponent; import org.nuxeo.runtime.transaction.TransactionHelper; /** * Contains the Hibernate based (legacy) implementation * * @author tiry */ public class DefaultAuditBackend extends AbstractAuditBackend { protected PersistenceProvider persistenceProvider; public DefaultAuditBackend(NXAuditEventsService component, AuditBackendDescriptor config) { super(component, config); activatePersistenceProvider(); } @Override public int getApplicationStartedOrder() { return ((DefaultComponent) Framework.getRuntime() .getComponent("org.nuxeo.ecm.core.persistence.PersistenceComponent")) .getApplicationStartedOrder() + 1; } @Override public void onApplicationStarted() { activatePersistenceProvider(); } @Override public void onShutdown() { try { persistenceProvider.closePersistenceUnit(); } finally { persistenceProvider = null; } } // public for testing purpose ! public PersistenceProvider getOrCreatePersistenceProvider() { if (persistenceProvider == null) { activatePersistenceProvider(); } return persistenceProvider; } protected void activatePersistenceProvider() { Thread thread = Thread.currentThread(); ClassLoader last = thread.getContextClassLoader(); try { thread.setContextClassLoader(PersistenceProvider.class.getClassLoader()); PersistenceProviderFactory persistenceProviderFactory = Framework.getLocalService( PersistenceProviderFactory.class); persistenceProvider = persistenceProviderFactory.newProvider("nxaudit-logs"); persistenceProvider.openPersistenceUnit(); } finally { thread.setContextClassLoader(last); } } @Override public void addLogEntries(final List<LogEntry> entries) { if (entries.isEmpty()) { return; } if (!TransactionHelper.isTransactionActiveOrMarkedRollback()) { TransactionHelper.startTransaction(); try { getOrCreatePersistenceProvider().run(true, new RunVoid() { @Override public void runWith(EntityManager em) { addLogEntries(em, entries); } }); } finally { TransactionHelper.commitOrRollbackTransaction(); } return; } getOrCreatePersistenceProvider().run(true, new RunVoid() { @Override public void runWith(EntityManager em) { addLogEntries(em, entries); } }); } protected void addLogEntries(EntityManager em, List<LogEntry> entries) { LogEntryProvider.createProvider(em).addLogEntries(entries); } @Override public List<LogEntry> getLogEntriesFor(final String uuid, final String repositoryId) { return getOrCreatePersistenceProvider().run(false, new RunCallback<List<LogEntry>>() { @Override public List<LogEntry> runWith(EntityManager em) { return getLogEntriesFor(em, uuid, repositoryId); } }); } protected List<LogEntry> getLogEntriesFor(EntityManager em, String uuid, String repositoryId) { return LogEntryProvider.createProvider(em).getLogEntriesFor(uuid, repositoryId); } @Override public List<LogEntry> getLogEntriesFor(final String uuid) { return getOrCreatePersistenceProvider().run(false, new RunCallback<List<LogEntry>>() { @Override public List<LogEntry> runWith(EntityManager em) { return getLogEntriesFor(em, uuid); } }); } protected List<LogEntry> getLogEntriesFor(EntityManager em, String uuid) { return LogEntryProvider.createProvider(em).getLogEntriesFor(uuid); } @Override public List<LogEntry> getLogEntriesFor(final String uuid, final Map<String, FilterMapEntry> filterMap, final boolean doDefaultSort) { return getOrCreatePersistenceProvider().run(false, new RunCallback<List<LogEntry>>() { @Override public List<LogEntry> runWith(EntityManager em) { return getLogEntriesFor(em, uuid, filterMap, doDefaultSort); } }); } protected List<LogEntry> getLogEntriesFor(EntityManager em, String uuid, Map<String, FilterMapEntry> filterMap, boolean doDefaultSort) { return LogEntryProvider.createProvider(em).getLogEntriesFor(uuid, filterMap, doDefaultSort); } @Override public LogEntry getLogEntryByID(final long id) { return getOrCreatePersistenceProvider().run(false, new RunCallback<LogEntry>() { @Override public LogEntry runWith(EntityManager em) { return getLogEntryByID(em, id); } }); } protected LogEntry getLogEntryByID(EntityManager em, long id) { return LogEntryProvider.createProvider(em).getLogEntryByID(id); } @Override public List<LogEntry> nativeQueryLogs(final String whereClause, final int pageNb, final int pageSize) { return getOrCreatePersistenceProvider().run(false, new RunCallback<List<LogEntry>>() { @Override public List<LogEntry> runWith(EntityManager em) { return nativeQueryLogs(em, whereClause, pageNb, pageSize); } }); } protected List<LogEntry> nativeQueryLogs(EntityManager em, String whereClause, int pageNb, int pageSize) { return LogEntryProvider.createProvider(em).nativeQueryLogs(whereClause, pageNb, pageSize); } @Override public List<?> nativeQuery(final String query, final int pageNb, final int pageSize) { return getOrCreatePersistenceProvider().run(false, new RunCallback<List<?>>() { @Override public List<?> runWith(EntityManager em) { return nativeQuery(em, query, pageNb, pageSize); } }); } protected List<?> nativeQuery(EntityManager em, String query, int pageNb, int pageSize) { return LogEntryProvider.createProvider(em).nativeQuery(query, pageNb, pageSize); } @Override public List<?> nativeQuery(final String query, final Map<String, Object> params, final int pageNb, final int pageSize) { return getOrCreatePersistenceProvider().run(false, new RunCallback<List<?>>() { @Override public List<?> runWith(EntityManager em) { return nativeQuery(em, query, params, pageNb, pageSize); } }); } protected List<?> nativeQuery(EntityManager em, String query, Map<String, Object> params, int pageNb, int pageSize) { return LogEntryProvider.createProvider(em).nativeQuery(query, params, pageNb, pageSize); } @Override public List<LogEntry> queryLogs(final String[] eventIds, final String dateRange) { return getOrCreatePersistenceProvider().run(false, new RunCallback<List<LogEntry>>() { @Override public List<LogEntry> runWith(EntityManager em) { return queryLogs(em, eventIds, dateRange); } }); } protected List<LogEntry> queryLogs(EntityManager em, String[] eventIds, String dateRange) { return LogEntryProvider.createProvider(em).queryLogs(eventIds, dateRange); } @Override public List<LogEntry> queryLogsByPage(final String[] eventIds, final String dateRange, final String[] category, final String path, final int pageNb, final int pageSize) { return getOrCreatePersistenceProvider().run(false, new RunCallback<List<LogEntry>>() { @Override public List<LogEntry> runWith(EntityManager em) { return queryLogsByPage(em, eventIds, dateRange, category, path, pageNb, pageSize); } }); } protected List<LogEntry> queryLogsByPage(EntityManager em, String[] eventIds, String dateRange, String[] category, String path, int pageNb, int pageSize) { return LogEntryProvider.createProvider(em).queryLogsByPage(eventIds, dateRange, category, path, pageNb, pageSize); } @Override public List<LogEntry> queryLogsByPage(final String[] eventIds, final Date limit, final String[] category, final String path, final int pageNb, final int pageSize) { return getOrCreatePersistenceProvider().run(false, new RunCallback<List<LogEntry>>() { @Override public List<LogEntry> runWith(EntityManager em) { return queryLogsByPage(em, eventIds, limit, category, path, pageNb, pageSize); } }); } protected List<LogEntry> queryLogsByPage(EntityManager em, String[] eventIds, Date limit, String[] category, String path, int pageNb, int pageSize) { return LogEntryProvider.createProvider(em).queryLogsByPage(eventIds, limit, category, path, pageNb, pageSize); } @Override public long syncLogCreationEntries(final String repoId, final String path, final Boolean recurs) { return getOrCreatePersistenceProvider().run(true, new RunCallback<Long>() { @Override public Long runWith(EntityManager em) { return syncLogCreationEntries(em, repoId, path, recurs); } }); } protected long syncLogCreationEntries(EntityManager em, String repoId, String path, Boolean recurs) { LogEntryProvider provider = LogEntryProvider.createProvider(em); return syncLogCreationEntries(provider, repoId, path, recurs); } @Override public Long getEventsCount(final String eventId) { return getOrCreatePersistenceProvider().run(false, new RunCallback<Long>() { @Override public Long runWith(EntityManager em) { return getEventsCount(em, eventId); } }); } public Long getEventsCount(EntityManager em, String eventId) { return LogEntryProvider.createProvider(em).countEventsById(eventId); } public List<String> getLoggedEventIds() { return getOrCreatePersistenceProvider().run(false, new RunCallback<List<String>>() { @Override public List<String> runWith(EntityManager em) { return getLoggedEventIds(em); } }); } protected List<String> getLoggedEventIds(EntityManager em) { return LogEntryProvider.createProvider(em).findEventIds(); } // Compat APIs protected List<LogEntry> queryLogsByPage(EntityManager em, String[] eventIds, String dateRange, String category, String path, int pageNb, int pageSize) { String[] categories = { category }; return queryLogsByPage(em, eventIds, dateRange, categories, path, pageNb, pageSize); } protected List<LogEntry> queryLogsByPage(EntityManager em, String[] eventIds, Date limit, String category, String path, int pageNb, int pageSize) { String[] categories = { category }; return queryLogsByPage(em, eventIds, limit, categories, path, pageNb, pageSize); } @Override public ExtendedInfo newExtendedInfo(Serializable value) { return ExtendedInfoImpl.createExtendedInfo(value); } }