package org.springframework.roo.addon.solr;
import static org.springframework.roo.model.RooJavaType.ROO_SOLR_WEB_SEARCHABLE;
import org.apache.commons.lang3.Validate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.osgi.service.component.ComponentContext;
import org.springframework.roo.addon.web.mvc.controller.scaffold.WebScaffoldMetadata;
import org.springframework.roo.addon.web.mvc.controller.scaffold.WebScaffoldMetadataProvider;
import org.springframework.roo.classpath.PhysicalTypeIdentifier;
import org.springframework.roo.classpath.PhysicalTypeMetadata;
import org.springframework.roo.classpath.itd.AbstractItdMetadataProvider;
import org.springframework.roo.classpath.itd.ItdTypeDetailsProvidingMetadataItem;
import org.springframework.roo.model.JavaType;
import org.springframework.roo.project.LogicalPath;
/**
* Provides {@link SolrWebSearchMetadata}.
*
* @author Stefan Schmidt
* @since 1.1
*/
@Component(immediate = true)
@Service
public class SolrWebSearchMetadataProvider extends AbstractItdMetadataProvider {
@Reference private WebScaffoldMetadataProvider webScaffoldMetadataProvider;
protected void activate(final ComponentContext context) {
metadataDependencyRegistry.registerDependency(
PhysicalTypeIdentifier.getMetadataIdentiferType(),
getProvidesType());
webScaffoldMetadataProvider.addMetadataTrigger(ROO_SOLR_WEB_SEARCHABLE);
addMetadataTrigger(ROO_SOLR_WEB_SEARCHABLE);
}
@Override
protected String createLocalIdentifier(final JavaType javaType,
final LogicalPath path) {
return SolrWebSearchMetadata.createIdentifier(javaType, path);
}
/**
* OSGi bundle deactivation callback
*
* @param context
* @since 1.2.0
*/
protected void deactivate(final ComponentContext context) {
metadataDependencyRegistry.deregisterDependency(
PhysicalTypeIdentifier.getMetadataIdentiferType(),
getProvidesType());
webScaffoldMetadataProvider
.removeMetadataTrigger(ROO_SOLR_WEB_SEARCHABLE);
removeMetadataTrigger(ROO_SOLR_WEB_SEARCHABLE);
}
@Override
protected String getGovernorPhysicalTypeIdentifier(
final String metadataIdentificationString) {
final JavaType javaType = SolrWebSearchMetadata
.getJavaType(metadataIdentificationString);
final LogicalPath path = SolrWebSearchMetadata
.getPath(metadataIdentificationString);
return PhysicalTypeIdentifier.createIdentifier(javaType, path);
}
public String getItdUniquenessFilenameSuffix() {
return "SolrWebSearch";
}
@Override
protected ItdTypeDetailsProvidingMetadataItem getMetadata(
final String metadataIdentificationString,
final JavaType aspectName,
final PhysicalTypeMetadata governorPhysicalTypeMetadata,
final String itdFilename) {
// We need to parse the annotation, which we expect to be present
final SolrWebSearchAnnotationValues annotationValues = new SolrWebSearchAnnotationValues(
governorPhysicalTypeMetadata);
if (!annotationValues.isAnnotationFound()
|| annotationValues.getSearchMethod() == null) {
return null;
}
// Acquire bean info (we need getters details, specifically)
final JavaType javaType = SolrWebSearchMetadata
.getJavaType(metadataIdentificationString);
final LogicalPath path = SolrWebSearchMetadata
.getPath(metadataIdentificationString);
final String webScaffoldMetadataKey = WebScaffoldMetadata
.createIdentifier(javaType, path);
// We want to be notified if the getter info changes in any way
metadataDependencyRegistry.registerDependency(webScaffoldMetadataKey,
metadataIdentificationString);
final WebScaffoldMetadata webScaffoldMetadata = (WebScaffoldMetadata) metadataService
.get(webScaffoldMetadataKey);
// Abort if we don't have getter information available
if (webScaffoldMetadata == null || !webScaffoldMetadata.isValid()) {
return null;
}
final JavaType targetObject = webScaffoldMetadata.getAnnotationValues()
.getFormBackingObject();
Validate.notNull(
targetObject,
"Could not acquire form backing object for the '"
+ WebScaffoldMetadata.getJavaType(
webScaffoldMetadata.getId())
.getFullyQualifiedTypeName() + "' controller");
final String targetObjectMid = typeLocationService
.getPhysicalTypeIdentifier(targetObject);
final LogicalPath targetObjectPath = PhysicalTypeIdentifier
.getPath(targetObjectMid);
final SolrMetadata solrMetadata = (SolrMetadata) metadataService
.get(SolrMetadata.createIdentifier(targetObject,
targetObjectPath));
Validate.notNull(
solrMetadata,
"Could not determine SolrMetadata for type '"
+ targetObject.getFullyQualifiedTypeName() + "'");
// Otherwise go off and create the to String metadata
return new SolrWebSearchMetadata(metadataIdentificationString,
aspectName, governorPhysicalTypeMetadata, annotationValues,
webScaffoldMetadata.getAnnotationValues(),
solrMetadata.getAnnotationValues());
}
public String getProvidesType() {
return SolrWebSearchMetadata.getMetadataIdentiferType();
}
}