package org.springframework.roo.addon.layers.repository.jpa.addon;
import static org.springframework.roo.model.RooJavaType.ROO_JPA_REPOSITORY_CONFIGURATION;
import java.util.Set;
import java.util.logging.Logger;
import org.apache.commons.lang3.Validate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.osgi.service.component.ComponentContext;
import org.springframework.roo.classpath.PhysicalTypeIdentifier;
import org.springframework.roo.classpath.PhysicalTypeMetadata;
import org.springframework.roo.classpath.details.ItdTypeDetails;
import org.springframework.roo.classpath.itd.AbstractMemberDiscoveringItdMetadataProvider;
import org.springframework.roo.classpath.itd.ItdTypeDetailsProvidingMetadataItem;
import org.springframework.roo.metadata.MetadataDependencyRegistry;
import org.springframework.roo.metadata.internal.MetadataDependencyRegistryTracker;
import org.springframework.roo.model.JavaType;
import org.springframework.roo.model.RooJavaType;
import org.springframework.roo.model.SpringJavaType;
import org.springframework.roo.project.LogicalPath;
import org.springframework.roo.project.ProjectOperations;
import org.springframework.roo.support.logging.HandlerUtils;
import org.springframework.roo.support.osgi.ServiceInstaceManager;
/**
* = RepositoryJpaConfigurationMetadataProviderImpl
*
* Implementation of {@link RepositoryJpaConfigurationMetadataProvider}.
*
* @author Sergio Clares
* @since 2.0
*/
@Component
@Service
public class RepositoryJpaConfigurationMetadataProviderImpl extends
AbstractMemberDiscoveringItdMetadataProvider implements
RepositoryJpaConfigurationMetadataProvider {
protected final static Logger LOGGER = HandlerUtils
.getLogger(RepositoryJpaConfigurationMetadataProviderImpl.class);
protected MetadataDependencyRegistryTracker registryTracker = null;
private ServiceInstaceManager serviceInstaceManager = new ServiceInstaceManager();
/**
* This service is being activated so setup it:
* <ul>
* <li>Create and open the {@link MetadataDependencyRegistryTracker}.</li>
* <li>Registers {@link RooJavaType#ROO_JPA_REPOSITORY_CONFIGURATION} as additional
* JavaType that will trigger metadata registration.</li>
* <li>Set ensure the governor type details represent a class.</li>
* </ul>
*/
@Override
protected void activate(final ComponentContext cContext) {
super.activate(cContext);
super.setDependsOnGovernorBeingAClass(true);
serviceInstaceManager.activate(cContext.getBundleContext());
this.registryTracker =
new MetadataDependencyRegistryTracker(cContext.getBundleContext(), this,
PhysicalTypeIdentifier.getMetadataIdentiferType(), getProvidesType());
this.registryTracker.open();
addMetadataTrigger(ROO_JPA_REPOSITORY_CONFIGURATION);
}
/**
* This service is being deactivated so unregister upstream-downstream
* dependencies, triggers, matchers and listeners.
*
* @param context
*/
protected void deactivate(final ComponentContext context) {
MetadataDependencyRegistry registry = this.registryTracker.getService();
registry.removeNotificationListener(this);
registry.deregisterDependency(PhysicalTypeIdentifier.getMetadataIdentiferType(),
getProvidesType());
this.registryTracker.close();
removeMetadataTrigger(ROO_JPA_REPOSITORY_CONFIGURATION);
}
@Override
protected String createLocalIdentifier(final JavaType javaType, final LogicalPath path) {
return RepositoryJpaConfigurationMetadata.createIdentifier(javaType, path);
}
@Override
protected String getGovernorPhysicalTypeIdentifier(final String metadataIdentificationString) {
final JavaType javaType =
RepositoryJpaConfigurationMetadata.getJavaType(metadataIdentificationString);
final LogicalPath path =
RepositoryJpaConfigurationMetadata.getPath(metadataIdentificationString);
return PhysicalTypeIdentifier.createIdentifier(javaType, path);
}
public String getItdUniquenessFilenameSuffix() {
return "Jpa_Repository_Configuration";
}
@Override
protected String getLocalMidToRequest(final ItdTypeDetails itdTypeDetails) {
return getLocalMid(itdTypeDetails);
}
@Override
protected ItdTypeDetailsProvidingMetadataItem getMetadata(
final String metadataIdentificationString, final JavaType aspectName,
final PhysicalTypeMetadata governorPhysicalTypeMetadata, final String itdFilename) {
// Get application main class
Set<JavaType> applicationTypes =
getTypeLocationService().findTypesWithAnnotation(SpringJavaType.SPRING_BOOT_APPLICATION);
String repositoryConfigurationModuleName = governorPhysicalTypeMetadata.getType().getModule();
JavaType applicationMainType = null;
for (JavaType applicationType : applicationTypes) {
if (applicationType.getModule().equals(repositoryConfigurationModuleName)) {
applicationMainType = applicationType;
}
}
Validate.notNull(applicationMainType, "Unable to find a main application class on module %s",
repositoryConfigurationModuleName);
// Check if security is installed in module
boolean isSpringletsSecurityEnabled =
getProjectOperations()
.isFeatureInstalled(applicationMainType.getModule(), "SPRINGLETS_JPA");
return new RepositoryJpaConfigurationMetadata(metadataIdentificationString, aspectName,
governorPhysicalTypeMetadata, applicationMainType, isSpringletsSecurityEnabled);
}
@Override
public String getProvidesType() {
return RepositoryJpaConfigurationMetadata.getMetadataIdentiferType();
}
protected ProjectOperations getProjectOperations() {
return serviceInstaceManager.getServiceInstance(this, ProjectOperations.class);
}
}