diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/AdminServlet.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/AdminServlet.java
index fecfff9b4..e6a46a12a 100644
--- a/ccm-core/src/main/java/com/arsdigita/ui/admin/AdminServlet.java
+++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/AdminServlet.java
@@ -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(
diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypePropertySheetModel.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypePropertySheetModel.java
index 338633ccb..374c44be6 100644
--- a/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypePropertySheetModel.java
+++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypePropertySheetModel.java
@@ -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);
diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypeTreeNode.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypeTreeNode.java
index 6bf781408..90aaa22fd 100644
--- a/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypeTreeNode.java
+++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationTypeTreeNode.java
@@ -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;
}
-
+
}
diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationsTab.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationsTab.java
index 093fbec09..69e1c3073 100644
--- a/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationsTab.java
+++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/applications/ApplicationsTab.java
@@ -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 Jens Pelzetter
@@ -37,6 +49,10 @@ public class ApplicationsTab extends LayoutPanel {
private final ParameterSingleSelectionModel 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;
+ }
+ }
+
}
}
diff --git a/ccm-core/src/main/java/org/libreccm/web/ApplicationManager.java b/ccm-core/src/main/java/org/libreccm/web/ApplicationManager.java
index e2c0d9464..8c025d099 100644
--- a/ccm-core/src/main/java/org/libreccm/web/ApplicationManager.java
+++ b/ccm-core/src/main/java/org/libreccm/web/ApplicationManager.java
@@ -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());
}
}
diff --git a/ccm-core/src/main/java/org/libreccm/web/ApplicationType.java b/ccm-core/src/main/java/org/libreccm/web/ApplicationType.java
index e8a19a4fe..e582b6cf0 100644
--- a/ccm-core/src/main/java/org/libreccm/web/ApplicationType.java
+++ b/ccm-core/src/main/java/org/libreccm/web/ApplicationType.java
@@ -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
diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties
index 0e3a12968..6cb97f0d0 100644
--- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties
+++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties
@@ -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
diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties
index ecb2629bc..cae914f2f 100644
--- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties
+++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties
@@ -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
diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties
index bfe3297c2..a330375c2 100755
--- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties
+++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties
@@ -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
diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties
index 1f9aa601b..f116fc351 100755
--- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties
+++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties
@@ -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