package org.phms.sling.mvp.impl.presenter;
import aQute.bnd.annotation.component.Deactivate;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.Resource;
import org.osgi.service.component.ComponentContext;
import org.phms.sling.mvp.common.utils.ScriptContextAdapter;
import org.phms.sling.mvp.impl.presenter.serializer.BeanToMapSerializer;
import javax.script.ScriptContext;
import java.util.HashMap;
import java.util.Map;
@Component
@Service
@Properties(value = {
@Property(name = "service.description", value = "Handlebars: Presenter Model Generator")}
)
public class PresenterModelGeneratorImpl implements PresenterModelGenerator {
private PresenterBundleListener presenterBundleListener;
@Reference
private BeanToMapSerializer beanToMapSerializer;
@Override
public Map<String, Object> createModel(ScriptContext scriptContext) {
Map<String, Object> model;
Resource resource = new ScriptContextAdapter(scriptContext).getResource();
Class<?> presenterType = getPresenterType(resource);
if (presenterType != null) {
Object presenter = resource.adaptTo(presenterType);
model = beanToMapSerializer.convertToMap(presenter);
} else {
model = new HashMap<>();
}
return model;
}
private Class<?> getPresenterType(Resource resource) {
String resourceType = resource.getResourceType();
return presenterBundleListener.getPresenters().get(resourceType);
}
@Activate
private void activate(ComponentContext componentContext) {
presenterBundleListener = new PresenterBundleListener(componentContext.getBundleContext());
}
@Deactivate
private void deactivate() {
presenterBundleListener.unregisterAll();
}
}