package org.brixcms.plugin.jpa;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.lang.Args;
import org.brixcms.Brix;
import org.brixcms.Plugin;
import org.brixcms.auth.Action;
import org.brixcms.auth.Action.Context;
import org.brixcms.jcr.api.JcrSession;
import org.brixcms.plugin.jpa.auth.AccessJpaPluginAction;
import org.brixcms.plugin.jpa.web.admin.EntityManagerPanel;
import org.brixcms.plugin.jpa.web.admin.EntityModel;
import org.brixcms.plugin.jpa.web.admin.GridDataSource;
import org.brixcms.plugin.jpa.web.admin.EntityPlugin;
import org.brixcms.plugin.jpa.web.admin.ManageEntityTabFactory;
import org.brixcms.plugin.jpa.web.admin.filter.FilterPlugin;
import org.brixcms.registry.ExtensionPoint;
import org.brixcms.web.tab.CachingAbstractTab;
import org.brixcms.web.tab.IBrixTab;
import org.brixcms.workspace.Workspace;
import com.inmethod.grid.IGridColumn;
/**
* The JpaPlugin was created as an abstract parent plugin to make it easy to
* create new plugins that focus on editing jpa entities.
*
* The counterpart for hierarchical nodes is HierarchicalNodePlugin
*
* @author dan.simko@gmail.com
*/
public abstract class JpaPlugin<T extends Persistable<ID>, ID extends Serializable, F extends Serializable> implements Plugin {
private final Brix brix;
public JpaPlugin(Brix brix) {
this.brix = brix;
}
protected abstract IModel<String> getTabName();
protected abstract JpaPluginLocator<T, ID, F> getPluginLocator();
public abstract Class<T> getEntityClass();
public abstract void delete(List<T> entities);
public abstract void clone(List<T> entities);
public void addGridColumns(List<IGridColumn<GridDataSource<T, ID, F>, T, Object>> columns) {
}
public void registerFilterPlugin(FilterPlugin<T, ID, F> plugin) {
Args.notNull(plugin, "plugin");
brix.getConfig().getRegistry().register(getFilterPluginExtensionPoint(), plugin);
}
public void registerEntityPlugin(EntityPlugin<T, ID> plugin) {
Args.notNull(plugin, "plugin");
brix.getConfig().getRegistry().register(EntityPlugin.POINT, plugin);
}
public void registerManageEntityTabFactory(ManageEntityTabFactory<T> factory) {
Args.notNull(factory, "factory");
brix.getConfig().getRegistry().register(getManageEntityTabFactoryExtensionPoint(), factory);
}
public Collection<ManageEntityTabFactory<T>> getManageEntityTabFactories() {
return brix.getConfig().getRegistry().lookupCollection(getManageEntityTabFactoryExtensionPoint());
}
public Collection<FilterPlugin<T, ID, F>> getFilterPlugins() {
return brix.getConfig().getRegistry().lookupCollection(getFilterPluginExtensionPoint());
}
public FilterPlugin<T, ID, F> getFilterPluginById(String pluginId) {
for (FilterPlugin<T, ID, F> plugin : getFilterPlugins()) {
if (plugin.getPluginId().equals(pluginId)) {
return plugin;
}
}
return null;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public Collection<EntityPlugin<T, ID>> getEntityPlugins() {
return (Collection) brix.getConfig().getRegistry().lookupCollection(EntityPlugin.POINT);
}
public EntityPlugin<T, ID> getEntityPluginById(String pluginId) {
for (EntityPlugin<T, ID> plugin : getEntityPlugins()) {
if (plugin.getPluginId().equals(pluginId)) {
return plugin;
}
}
return null;
}
protected int getTabPriority() {
return 0;
}
@Override
public String getUserVisibleName(Workspace workspace, boolean isFrontend) {
return null;
}
@Override
public List<Workspace> getWorkspaces(Workspace currentWorkspace, boolean isFrontend) {
return null;
}
@Override
public void initWorkspace(Workspace workspace, JcrSession workspaceSession) {
}
@Override
public boolean isPluginWorkspace(Workspace workspace) {
return false;
}
@Override
public List<IBrixTab> newTabs(IModel<Workspace> workspaceModel) {
IBrixTab tab = new JpaEditorTab<T, ID, F>(getTabName(), getPluginLocator(), getTabPriority());
return Collections.singletonList(tab);
}
public Brix getBrix() {
return brix;
}
@SuppressWarnings("serial")
static class JpaEditorTab<T extends Persistable<ID>, ID extends Serializable, F extends Serializable> extends CachingAbstractTab {
private final JpaPluginLocator<T, ID, F> pluginLocator;
public JpaEditorTab(IModel<String> title, JpaPluginLocator<T, ID, F> pluginLocator, int priority) {
super(title, priority);
this.pluginLocator = pluginLocator;
}
@Override
public Panel newPanel(String panelId) {
return new EntityManagerPanel<T, ID, F>(panelId, new EntityModel<T, ID>(null), pluginLocator);
}
@Override
public boolean isVisible() {
final Action action = new AccessJpaPluginAction<T, ID, F>(pluginLocator);
return Brix.get().getAuthorizationStrategy().isActionAuthorized(action);
}
}
public boolean canCreateEntity(Context context) {
return true;
}
public boolean canCloneEntity(T entity, Context context) {
return true;
}
public boolean canViewEntity(T entity, Context context) {
return true;
}
public boolean canEditEntity(T entity, Context context) {
return true;
}
public boolean canDeleteEntity(T entity, Context context) {
return true;
}
protected ExtensionPoint<ManageEntityTabFactory<T>> getManageEntityTabFactoryExtensionPoint() {
return manageEntityTabFactoryPoint;
}
protected ExtensionPoint<FilterPlugin<T, ID, F>> getFilterPluginExtensionPoint() {
return filterPluginPoint;
}
private ExtensionPoint<FilterPlugin<T, ID, F>> filterPluginPoint = new ExtensionPoint<FilterPlugin<T, ID, F>>() {
@Override
public org.brixcms.registry.ExtensionPoint.Multiplicity getMultiplicity() {
return Multiplicity.COLLECTION;
}
@Override
public String getUuid() {
return FilterPlugin.class.getName();
}
};
private final ExtensionPoint<ManageEntityTabFactory<T>> manageEntityTabFactoryPoint = new ExtensionPoint<ManageEntityTabFactory<T>>() {
@Override
public org.brixcms.registry.ExtensionPoint.Multiplicity getMultiplicity() {
return Multiplicity.COLLECTION;
}
@Override
public String getUuid() {
return ManageEntityTabFactory.class.getName();
}
};
}