CCM NG: Basic structure for new application management
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4130 8810af33-2d31-482b-a856-94f89814c4dfpull/2/head
parent
7bc7551413
commit
60002bd481
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,12 +37,15 @@ 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() {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
@ -53,11 +69,94 @@ public class ApplicationsTab extends LayoutPanel {
|
|||
|
||||
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
|
||||
|
|
@ -67,6 +166,107 @@ public class ApplicationsTab extends LayoutPanel {
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,12 +54,22 @@ 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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue