blob: 605326b8680260dec490bdfe8e161c4ff43702ea [file] [log] [blame]
/**
* Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Florian Pirchner - Initial implementation
*/
package org.eclipse.osbp.dsl.dto.lib.services.impl;
import javax.persistence.EntityManagerFactory;
import org.osgi.framework.Filter;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.component.ComponentContext;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings("all")
public abstract class AbstractDTOServiceWithMutablePersistence<DTO, ENTITY>
extends AbstractDTOService<DTO, ENTITY>
implements
org.eclipse.osbp.runtime.common.filter.IDTOServiceWithMutablePersistence<DTO>,
ServiceTrackerCustomizer<EntityManagerFactory, EntityManagerFactory> {
private static final String FILTER__EMF = "(objectClass=javax.persistence.EntityManagerFactory)";
private static final String FILTER__EMF_WITH_PERSISTENCE = "(&(objectClass=javax.persistence.EntityManagerFactory)(osgi.unit.name=%s))";
private static final Logger LOGGER = LoggerFactory
.getLogger(AbstractDTOServiceWithMutablePersistence.class);
private ServiceTracker<EntityManagerFactory, EntityManagerFactory> emfTracker;
private ComponentContext context;
private String persistenceId;
public String getPersistenceId() {
return persistenceId;
}
public void setPersistenceId(String persistenceId) {
this.persistenceId = persistenceId;
if (context != null) {
internalReset();
}
}
//
// OSGI Infrastructure
//
/**
* Called by OSGi-DS to activate the service.
*
* @param context
*/
protected void activate(ComponentContext context) throws Exception {
this.context = context;
internalActivate();
}
protected void internalActivate() throws InvalidSyntaxException {
if (emfTracker == null) {
emfTracker = new ServiceTracker<EntityManagerFactory, EntityManagerFactory>(
context.getBundleContext(), createEMFFilter(), this);
emfTracker.open();
}
}
/**
* Create the filter to find the proper service.
*
* @return
* @throws InvalidSyntaxException
*/
protected Filter createEMFFilter() throws InvalidSyntaxException {
if (getPersistenceId() == null || getPersistenceId().equals("")) {
return context.getBundleContext().createFilter(FILTER__EMF);
} else {
return context.getBundleContext().createFilter(
String.format(FILTER__EMF_WITH_PERSISTENCE,
getPersistenceId()));
}
}
/**
* Called by OSGi-DS to deactivate the service.
*
* @param context
*/
protected void deactivate(ComponentContext context) {
internalDeactivate();
this.context = null;
}
/**
* Resets the internal state.
*/
protected void internalReset() {
internalDeactivate();
if (context != null) {
try {
internalActivate();
} catch (InvalidSyntaxException e) {
LOGGER.error("{}", e);
}
}
}
protected void internalDeactivate() {
if (emfTracker != null) {
emfTracker.close();
emfTracker = null;
}
}
@Override
public EntityManagerFactory addingService(
ServiceReference<EntityManagerFactory> reference) {
EntityManagerFactory emf = context.getBundleContext().getService(
reference);
if (getEmf() == null) {
bindEmf(emf);
}
return emf;
}
@Override
public void modifiedService(
ServiceReference<EntityManagerFactory> reference,
EntityManagerFactory service) {
// nothing to do
}
@Override
public void removedService(
ServiceReference<EntityManagerFactory> reference,
EntityManagerFactory service) {
if (getEmf() == service) {
unbindEmf(getEmf());
}
}
}