CCM NG: Basic structure for new application management

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4130 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2016-06-01 16:42:28 +00:00
parent 7bc7551413
commit 60002bd481
10 changed files with 303 additions and 13 deletions

View File

@ -29,6 +29,7 @@ import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.templating.Templating;
import com.arsdigita.ui.SiteBanner;
import com.arsdigita.ui.UserBanner;
import com.arsdigita.ui.admin.applications.ApplicationsTab;
import com.arsdigita.ui.admin.categories.CategoriesTab;
import com.arsdigita.ui.admin.configuration.ConfigurationTab;
import com.arsdigita.web.BaseApplicationServlet;
@ -114,7 +115,7 @@ public class AdminServlet extends BaseApplicationServlet {
tabbedPane.addTab(
new Label(new GlobalizedMessage("ui.admin.tab.applications",
ADMIN_BUNDLE)),
new ApplicationsAdminTab());
new ApplicationsTab());
tabbedPane.addTab(
new Label(new GlobalizedMessage(

View File

@ -38,6 +38,7 @@ public class ApplicationTypePropertySheetModel implements PropertySheetModel {
private static enum AppTypeProperty {
NAME,
TITLE,
DESC,
APP_CLASS,
CREATOR,
@ -97,6 +98,8 @@ public class ApplicationTypePropertySheetModel implements PropertySheetModel {
switch(currentProperty) {
case NAME:
return applicationType.name();
case TITLE:
return getAppTypeTitle();
case DESC:
return getAppTypeDesc();
case APP_CLASS:
@ -114,6 +117,13 @@ public class ApplicationTypePropertySheetModel implements PropertySheetModel {
}
}
private String getAppTypeTitle() {
final org.libreccm.web.ApplicationManager appManager = CdiUtil.createCdiUtil().findBean(
org.libreccm.web.ApplicationManager.class);
return appManager.getApplicationTypeTitle(applicationType);
}
private String getAppTypeDesc() {
final org.libreccm.web.ApplicationManager appManager = CdiUtil.createCdiUtil().findBean(
org.libreccm.web.ApplicationManager.class);

View File

@ -20,6 +20,7 @@ package com.arsdigita.ui.admin.applications;
import com.arsdigita.bebop.tree.TreeNode;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.web.ApplicationType;
/**
@ -36,16 +37,19 @@ public class ApplicationTypeTreeNode implements TreeNode {
@Override
public Object getKey() {
return applicationType.applicationClass().getName();
return applicationType.name();
}
@Override
public Object getElement() {
return applicationType.name();
final org.libreccm.web.ApplicationManager appManager = CdiUtil
.createCdiUtil().findBean(org.libreccm.web.ApplicationManager.class);
return appManager.getApplicationTypeTitle(applicationType);
}
public ApplicationType getApplicationType() {
return applicationType;
}
}

View File

@ -18,12 +18,24 @@
*/
package com.arsdigita.ui.admin.applications;
import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.PropertySheet;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.Tree;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.toolbox.ui.LayoutPanel;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.web.ApplicationType;
import static com.arsdigita.ui.admin.AdminUiConstants.*;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
@ -37,6 +49,10 @@ public class ApplicationsTab extends LayoutPanel {
private final ParameterSingleSelectionModel<String> selectedAppInstance;
private final Tree applicationTree;
private final BoxPanel managementLinks;
private final Text placeholderInstances;
private final Text placeholderSingletonSettings;
private final BoxPanel appInfo;
public ApplicationsTab() {
super();
@ -45,28 +61,212 @@ public class ApplicationsTab extends LayoutPanel {
selectedAppTypeParam = new StringParameter("selectedAppType");
selectedAppType = new ParameterSingleSelectionModel<>(
selectedAppTypeParam);
selectedAppTypeParam);
selectedAppInstanceParam = new StringParameter("selectedAppInstance");
selectedAppInstance = new ParameterSingleSelectionModel<>(
selectedAppInstanceParam);
selectedAppInstanceParam);
applicationTree = new Tree(new ApplicationTreeModelBuilder());
applicationTree.addChangeListener(e -> {
final PageState state = e.getPageState();
final Object key = applicationTree.getSelectedKey(state);
if (key instanceof Long) {
} else if (key instanceof String) {
//ApplicationType node is selected
showManagementLinks(state);
final String appTypeKey = (String) key;
selectedAppType.setSelectedKey(state, appTypeKey);
final org.libreccm.web.ApplicationManager appManager = CdiUtil
.createCdiUtil().findBean(
org.libreccm.web.ApplicationManager.class);
final ApplicationType appType = appManager.getApplicationTypes()
.get(appTypeKey);
if (appType.singleton()) {
showSingletonAppSettings(state);
} else {
showInstances(state);
}
} else {
throw new IllegalArgumentException(
"The key of the selected must be Long or a String");
}
});
setLeft(applicationTree);
final BoxPanel managementPanel = new BoxPanel(BoxPanel.VERTICAL);
managementLinks = new BoxPanel(BoxPanel.HORIZONTAL);
final ActionLink singletonAppSettingsLink
= new SingletonAppSettingsLink(
new GlobalizedMessage("ui.admin.applications.singleton.link",
ADMIN_BUNDLE));
singletonAppSettingsLink.addActionListener(e -> {
final PageState state = e.getPageState();
showSingletonAppSettings(state);
});
managementLinks.add(singletonAppSettingsLink);
final ActionLink instancesLink = new InstancesLink(
new GlobalizedMessage("ui.admin.applications.instances.link",
ADMIN_BUNDLE));
instancesLink.addActionListener(e -> {
final PageState state = e.getPageState();
showInstances(state);
});
managementLinks.add(instancesLink);
final ActionLink infoLink = new ActionLink(new GlobalizedMessage(
"ui.admin.applications.info.link", ADMIN_BUNDLE));
infoLink.addActionListener(e -> {
final PageState state = e.getPageState();
showAppInfo(state);
});
managementLinks.add(infoLink);
managementPanel.add(managementLinks);
placeholderInstances = new Text("placeholder instances");
managementPanel.add(placeholderInstances);
placeholderSingletonSettings
= new Text("placeholder singleton settings");
managementPanel.add(placeholderSingletonSettings);
appInfo = new BoxPanel(BoxPanel.VERTICAL);
final Label appInfoHeading = new Label(new GlobalizedMessage(
"ui.admin.applications.info.heading", ADMIN_BUNDLE));
appInfoHeading.setClassAttr("heading");
appInfo.add(appInfoHeading);
final PropertySheet appInfoSheet = new PropertySheet(
new ApplicationTypePropertySheetModelBuilder(selectedAppType));
appInfo.add(appInfoSheet);
managementPanel.add(appInfo);
setBody(managementPanel);
}
@Override
public void register(final Page page) {
super.register(page);
page.addGlobalStateParam(selectedAppTypeParam);
page.addGlobalStateParam(selectedAppInstanceParam);
page.setVisibleDefault(managementLinks, false);
page.setVisibleDefault(placeholderInstances, false);
page.setVisibleDefault(placeholderSingletonSettings, false);
page.setVisibleDefault(appInfo, false);
}
protected void showManagementLinks(final PageState state) {
managementLinks.setVisible(state, true);
}
protected void hideManagementLinks(final PageState state) {
managementLinks.setVisible(state, false);
}
protected void showInstances(final PageState state) {
placeholderInstances.setVisible(state, true);
placeholderSingletonSettings.setVisible(state, false);
appInfo.setVisible(state, false);
}
protected void hideInstances(final PageState state) {
placeholderInstances.setVisible(state, false);
}
protected void showSingletonAppSettings(final PageState state) {
placeholderInstances.setVisible(state, false);
placeholderSingletonSettings.setVisible(state, true);
appInfo.setVisible(state, false);
}
protected void hideSingletonAppSettings(final PageState state) {
placeholderSingletonSettings.setVisible(state, false);
}
protected void showAppInfo(final PageState state) {
placeholderInstances.setVisible(state, false);
placeholderSingletonSettings.setVisible(state, false);
appInfo.setVisible(state, true);
}
protected void hideAppInfo(final PageState state) {
appInfo.setVisible(state, false);
}
private class SingletonAppSettingsLink extends ActionLink {
public SingletonAppSettingsLink(final GlobalizedMessage label) {
super(label);
}
@Override
public boolean isVisible(final PageState state) {
if (super.isVisible(state)) {
if (selectedAppType.getSelectedKey(state) == null) {
return false;
} else {
final org.libreccm.web.ApplicationManager appManager
= CdiUtil
.createCdiUtil().findBean(
org.libreccm.web.ApplicationManager.class);
final ApplicationType appType = appManager
.getApplicationTypes().get(selectedAppType
.getSelectedKey(state));
return appType.singleton();
}
} else {
return false;
}
}
}
private class InstancesLink extends ActionLink {
public InstancesLink(final GlobalizedMessage label) {
super(label);
}
@Override
public boolean isVisible(final PageState state) {
if (super.isVisible(state)) {
if (selectedAppType.getSelectedKey(state) == null) {
return false;
} else {
final org.libreccm.web.ApplicationManager appManager
= CdiUtil
.createCdiUtil().findBean(
org.libreccm.web.ApplicationManager.class);
final ApplicationType appType = appManager
.getApplicationTypes().get(selectedAppType
.getSelectedKey(state));
return !appType.singleton();
}
} else {
return false;
}
}
}
}

View File

@ -150,6 +150,28 @@ public class ApplicationManager {
}
}
public String getApplicationTypeTitle(
final ApplicationType applicationType) {
final String descBundle;
if (Strings.isBlank(applicationType.descBundle())) {
descBundle = String.join("", applicationType.name(), "Description");
} else {
descBundle = applicationType.descBundle();
}
final ResourceBundle bundle;
try {
bundle = ResourceBundle.getBundle(
descBundle, globalizationHelper.getNegotiatedLocale());
return bundle.getString(applicationType.titleKey());
} catch (MissingResourceException ex) {
LOGGER.warn("Failed to find resource bundle '{}'.", ex);
return applicationType.name();
}
}
public String getApplicationTypeDescription(
final ApplicationType applicationType) {
@ -164,13 +186,12 @@ public class ApplicationManager {
try {
bundle = ResourceBundle.getBundle(
descBundle, globalizationHelper.getNegotiatedLocale());
return bundle.getString(applicationType.descKey());
} catch (MissingResourceException ex) {
LOGGER.warn("Failed to find resource bundle '{}'.", ex);
return "";
}
return bundle.getString(applicationType.descKey());
}
}

View File

@ -54,13 +54,23 @@ public @interface ApplicationType {
String descBundle() default "";
/**
* The (optional) key for the description of the application in its resource
* The (optional) key for the title of the application in its resource
* bundle. Defaults to {@code application_title}
*
* @return
*
* @return
*/
String descKey() default "application_title";
String titleKey() default "application_title";
/**
* The (optional) key for the description of the application in its resource
* bundle. Defaults to {@code application_desc}
*
* @return
*/
String descKey() default "application_desc";
/**
* The application type class. Default is {@link CcmApplication}. Most
* application types will no need to extend these class and can leave the

View File

@ -527,3 +527,14 @@ ui.admin.categories.category.name.visible=Visible?
ui.admin.categories.category.name.abstract=Abstract?
ui.admin.appliations.type_pane.info_sheet=About
application_title=Administration
ui.admin.applications.singleton.link=Settings
ui.admin.applications.info.link=About
ui.admin.applications.type.property_sheet.name=Name
ui.admin.applications.type.property_sheet.title=Title
ui.admin.applications.type.property_sheet.desc=Description
ui.admin.applications.type.property_sheet.app_class=Application Class
ui.admin.applications.type.property_sheet.creator=Creator class
ui.admin.applications.type.property_sheet.singleton=Singleton?
ui.admin.applications.type.property_sheet.servlet_class=Servlet
ui.admin.applications.type.property_sheet.servlet_path=Servlet path
ui.admin.applications.info.heading=About the application type

View File

@ -530,3 +530,14 @@ ui.admin.categories.category.name.visible=Sichtbar?
ui.admin.categories.category.name.abstract=Abstrakt?
ui.admin.appliations.type_pane.info_sheet=\u00dcber
application_title=Administration
ui.admin.applications.singleton.link=Einstellungen
ui.admin.applications.info.link=Info
ui.admin.applications.type.property_sheet.name=Name
ui.admin.applications.type.property_sheet.title=Titel
ui.admin.applications.type.property_sheet.desc=Beschreibung
ui.admin.applications.type.property_sheet.app_class=Applikationsklasse
ui.admin.applications.type.property_sheet.creator=Creator class
ui.admin.applications.type.property_sheet.singleton=Singleton?
ui.admin.applications.type.property_sheet.servlet_class=Servlet
ui.admin.applications.type.property_sheet.servlet_path=Servlet-Pfad
ui.admin.applications.info.heading=\u00dcber den Applikationstyp

View File

@ -523,3 +523,14 @@ ui.admin.categories.category.name.visible=Visible?
ui.admin.categories.category.name.abstract=Abstract?
ui.admin.appliations.type_pane.info_sheet=About
application_title=Administration
ui.admin.applications.singleton.link=Settings
ui.admin.applications.info.link=About
ui.admin.applications.type.property_sheet.name=Name
ui.admin.applications.type.property_sheet.title=Title
ui.admin.applications.type.property_sheet.desc=Description
ui.admin.applications.type.property_sheet.app_class=Application Class
ui.admin.applications.type.property_sheet.creator=Creator class
ui.admin.applications.type.property_sheet.singleton=Singleton?
ui.admin.applications.type.property_sheet.servlet_class=Servlet
ui.admin.applications.type.property_sheet.servlet_path=Servlet path
ui.admin.applications.info.heading=About the application type

View File

@ -514,3 +514,14 @@ ui.admin.categories.category.name.visible=Visible?
ui.admin.categories.category.name.abstract=Abstract?
ui.admin.appliations.type_pane.info_sheet=About
application_title=Administration
ui.admin.applications.singleton.link=Settings
ui.admin.applications.info.link=About
ui.admin.applications.type.property_sheet.name=Name
ui.admin.applications.type.property_sheet.title=Title
ui.admin.applications.type.property_sheet.desc=Description
ui.admin.applications.type.property_sheet.app_class=Application Class
ui.admin.applications.type.property_sheet.creator=Creator class
ui.admin.applications.type.property_sheet.singleton=Singleton?
ui.admin.applications.type.property_sheet.servlet_class=Servlet
ui.admin.applications.type.property_sheet.servlet_path=Servlet path
ui.admin.applications.info.heading=About the application type