MARMOTTA-233: extends module configuration
Project: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/commit/80345190 Tree: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/tree/80345190 Diff: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/diff/80345190 Branch: refs/heads/MARMOTTA-228 Commit: 8034519030d8568bec53e31ff7caf888affb6748 Parents: 924630e Author: tkurz <[email protected]> Authored: Mon May 6 12:34:03 2013 +0200 Committer: tkurz <[email protected]> Committed: Mon May 6 12:34:03 2013 +0200 ---------------------------------------------------------------------- .../platform/core/api/modules/ModuleService.java | 24 ++++ .../platform/core/services/modules/AdminPage.java | 101 ++++++++++++++ .../core/services/modules/AdminPageContainer.java | 56 ++++++++ .../core/services/modules/ModuleServiceImpl.java | 106 ++++++++++++++- .../src/main/resources/config-defaults.properties | 6 + .../main/resources/config-descriptions.properties | 6 + .../src/main/resources/kiwi-module.properties | 44 +++++-- .../src/main/resources/templates/admin.ftl | 2 +- 8 files changed, 327 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/80345190/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/api/modules/ModuleService.java ---------------------------------------------------------------------- diff --git a/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/api/modules/ModuleService.java b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/api/modules/ModuleService.java index 0739abe..b099921 100644 --- a/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/api/modules/ModuleService.java +++ b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/api/modules/ModuleService.java @@ -17,7 +17,10 @@ */ package org.apache.marmotta.platform.core.api.modules; +import org.apache.commons.configuration.Configuration; import org.apache.marmotta.platform.core.model.module.ModuleConfiguration; +import org.apache.marmotta.platform.core.services.modules.AdminPage; +import org.apache.marmotta.platform.core.services.modules.AdminPageContainer; import javax.enterprise.inject.spi.InjectionPoint; import java.net.URL; @@ -111,6 +114,7 @@ public interface ModuleService { * @param moduleName * @return */ + @Deprecated public List<String> getAdminPages(String moduleName); /** @@ -129,4 +133,24 @@ public interface ModuleService { */ public int getWeight(String moduleName); + /** + * returns the icon (if set), null otherwise + * @param moduleName + * @return + */ + public String getIcon(String moduleName); + + /** + * Returns a list of AdminPage Objects + * @param moduleName + * @return + */ + public List<AdminPage> getAdminPageList(String moduleName); + + /** + * Lists containers and underlying modules + * @return + */ + public List<AdminPageContainer> listContainers(); + } http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/80345190/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/AdminPage.java ---------------------------------------------------------------------- diff --git a/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/AdminPage.java b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/AdminPage.java new file mode 100644 index 0000000..4ab3295 --- /dev/null +++ b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/AdminPage.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.marmotta.platform.core.services.modules; + +import org.apache.marmotta.platform.core.exception.MarmottaException; +import org.apache.marmotta.platform.core.exception.TemplatingException; + +import java.util.List; + +/** + * This class is used for more complex AdminPage information (e.g. for Templating). + * <p/> + * Author: Thomas Kurz ([email protected]) + */ +public class AdminPage implements Comparable<AdminPage> { + + private String name; + private String path; + private boolean important = false; + private int number = 0; + + /** + * create AdminPage object + * @param number for sorting + * @param path path to page + * @param name name (e.g. in the menu display) + * @param important if true, the page can appear in a 'special link' section + * @throws MarmottaException + */ + AdminPage(int number, String path, String name, boolean important) throws MarmottaException { + if(path==null) throw new MarmottaException("path for admin page must be defined"); + this.path = path; + + if(name != null) this.name = name; + else this.name = getNameFromPath(path); + + this.important = important; + } + + /** + * Creates and AdminPage just from path + * @param path + */ + AdminPage(String path) { + this.path= path; + this.name = getNameFromPath(path); + } + + /** + * returns a 'useful' name from path + * @param path + * @return + */ + private String getNameFromPath(String path) { + return path.substring(path.lastIndexOf("/")).replaceAll("/"," ").replaceAll("_"," ").replaceAll(".html","").replaceAll(".jsp",""); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + /** + * if numbers are used, the sorting is based on numbers, otherwise on alphabetical order of names + * @param adminPage + * @return + */ + @Override + public int compareTo(AdminPage adminPage) { + if(number != adminPage.number) { + return name.compareTo(adminPage.name); + } else return ((Integer)number).compareTo(adminPage.number); + } +} http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/80345190/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/AdminPageContainer.java ---------------------------------------------------------------------- diff --git a/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/AdminPageContainer.java b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/AdminPageContainer.java new file mode 100644 index 0000000..438707b --- /dev/null +++ b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/AdminPageContainer.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.marmotta.platform.core.services.modules; + +import java.util.List; + +/** + * ... + * <p/> + * Author: Thomas Kurz ([email protected]) + */ +public class AdminPageContainer implements Comparable<AdminPageContainer> { + + private int number = 0; + private String name; + private List<String> modules; + + public AdminPageContainer(String name) { + this.name = name; + } + + @Override + public int compareTo(AdminPageContainer adminPageContainer) { + if(number != adminPageContainer.number) return ((Integer)number).compareTo(adminPageContainer.number); + return name.compareTo(adminPageContainer.name); + } + + public boolean equals(String s) { + return name.equals(s); + } + + public void addModule(String module) { + modules.add(module); + } + + public void setNumber(int number) { + this.number = number; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/80345190/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/ModuleServiceImpl.java ---------------------------------------------------------------------- diff --git a/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/ModuleServiceImpl.java b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/ModuleServiceImpl.java index b7e4d63..9dbfca9 100644 --- a/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/ModuleServiceImpl.java +++ b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/modules/ModuleServiceImpl.java @@ -18,7 +18,9 @@ package org.apache.marmotta.platform.core.services.modules; import com.google.common.collect.ImmutableList; +import org.apache.marmotta.platform.core.api.config.ConfigurationService; import org.apache.marmotta.platform.core.api.modules.ModuleService; +import org.apache.marmotta.platform.core.exception.MarmottaException; import org.apache.marmotta.platform.core.model.module.ModuleConfiguration; import org.apache.commons.configuration.CompositeConfiguration; import org.apache.commons.configuration.Configuration; @@ -32,18 +34,13 @@ import javax.annotation.PostConstruct; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; import javax.enterprise.inject.spi.InjectionPoint; +import javax.inject.Inject; import java.io.IOException; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; -import java.util.Collection; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * Add file description here! @@ -53,16 +50,29 @@ import java.util.Set; @ApplicationScoped public class ModuleServiceImpl implements ModuleService { + private String default_container_name = "Others"; + private int default_container_number = 100; + private Logger log = LoggerFactory.getLogger(ModuleServiceImpl.class); private Set<String> modules; + private List<AdminPageContainer> containers; + private Map<String,Configuration> configurationMap; private Map<String, Configuration> jarURLs; + @Inject + ConfigurationService configurationService; + @PostConstruct public void initialize() { + + default_container_name = configurationService.getStringConfiguration("kiwi.pages.default_container.name",default_container_name); + default_container_number = configurationService.getIntConfiguration("kiwi.pages.default_container.number",default_container_number); + modules = new HashSet<String>(); + containers = new ArrayList<AdminPageContainer>(); configurationMap = new HashMap<String, Configuration>(); jarURLs = new HashMap<String, Configuration>(); @@ -84,6 +94,14 @@ public class ModuleServiceImpl implements ModuleService { modules.add(moduleName); + + if(moduleProperties.getString("container") != null) { + addContainerModule(moduleProperties.getString("container"),moduleName,moduleProperties.getInt("container.weight",-1)); + } else { + addContainerModule(default_container_name,moduleName,default_container_number); + } + + URLConnection urlConnection = moduleUrl.openConnection(); URL jarUrl; if(urlConnection instanceof JarURLConnection) { @@ -135,6 +153,21 @@ public class ModuleServiceImpl implements ModuleService { } } + private void addContainerModule(String container, String module, int number) { + AdminPageContainer c; + int i = containers.indexOf(container); + if(i>=0) { + c = containers.get(i); + c.addModule(module); + } + else { + c = new AdminPageContainer(container); + containers.add(c); + c.addModule(module); + } + if(number>0) c.setNumber(number); + } + /** * Provide the current module configuration to the service injecting it * @@ -173,6 +206,7 @@ public class ModuleServiceImpl implements ModuleService { * @param moduleName * @return */ + @Deprecated @Override public Collection<String> getEntities(String moduleName) { Configuration config = getModuleConfiguration(moduleName).getConfiguration(); @@ -192,6 +226,14 @@ public class ModuleServiceImpl implements ModuleService { } /** + * Lists containers and underlying modules + * @return + */ + public List<AdminPageContainer> listContainers() { + return containers; + } + + /** * Return the configuration for the module identified by the name given as argument. Returns an * immutable Apache Commons Configuration object, or null if the module is not found. * @@ -269,11 +311,25 @@ public class ModuleServiceImpl implements ModuleService { } /** + * returns the icon (if set), null otherwise + * @param moduleName + * @return + */ + @Override + public String getIcon(String moduleName) { + Configuration config = getModuleConfiguration(moduleName).getConfiguration(); + if(config != null) return config.getString("icon"); + else + return null; + } + + /** * Return a list of admin pages (paths) * @param moduleName * @return */ @Override + @Deprecated public List<String> getAdminPages(String moduleName) { Configuration config = getModuleConfiguration(moduleName).getConfiguration(); if(config != null) return ImmutableList.copyOf(config.getStringArray("adminpages")); @@ -281,6 +337,42 @@ public class ModuleServiceImpl implements ModuleService { return null; } + /** + * Returns a list of AdminPage Objects + * @param moduleName + * @return + */ + @Override + public List<AdminPage> getAdminPageList(String moduleName) { + ArrayList<AdminPage> l = new ArrayList<AdminPage>(); + Configuration config = getModuleConfiguration(moduleName).getConfiguration(); + + if(config==null) return null; + + //test if there are names and order for admin pages + if(config.getString("adminpages.0") != null) { + int i=0; + while(config.getString("adminpages."+i) != null) { + try { + l.add(new AdminPage( + i, + config.getString("adminpages." + i + ".path", null), + config.getString("adminpages."+i+".title",null), + config.getBoolean("adminpages."+i+".important",false) + )); + } catch (MarmottaException e) { + log.error("admin page cannot be added for module "+moduleName); + } + } + } else { + for(String path : getAdminPages(moduleName)) { + l.add(new AdminPage(path)); + } + } + Collections.sort(l); + return l; + } + @Override public int getWeight(String moduleName) { Configuration config = getModuleConfiguration(moduleName).getConfiguration(); http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/80345190/platform/marmotta-core/src/main/resources/config-defaults.properties ---------------------------------------------------------------------- diff --git a/platform/marmotta-core/src/main/resources/config-defaults.properties b/platform/marmotta-core/src/main/resources/config-defaults.properties index 6a5dcc8..32911a2 100644 --- a/platform/marmotta-core/src/main/resources/config-defaults.properties +++ b/platform/marmotta-core/src/main/resources/config-defaults.properties @@ -62,6 +62,12 @@ kiwi.pages.project.custom.footer = Your Footer powered by <a href="http://marmot # supported styles kiwi.pages.style_path = core/public/style/blue/ +# name for default container +kiwi.pages.default_container.name = Others + +# ordering number for default container +kiwi.pages.default_container.number = 100 + # enable or disable the logging of debugging messages for the whole system debug.enabled = false http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/80345190/platform/marmotta-core/src/main/resources/config-descriptions.properties ---------------------------------------------------------------------- diff --git a/platform/marmotta-core/src/main/resources/config-descriptions.properties b/platform/marmotta-core/src/main/resources/config-descriptions.properties index 913ba5b..607e1d6 100644 --- a/platform/marmotta-core/src/main/resources/config-descriptions.properties +++ b/platform/marmotta-core/src/main/resources/config-descriptions.properties @@ -50,6 +50,12 @@ kiwi.pages.project.type = java.lang.Enum("marmotta"|"custom") kiwi.pages.style_path.description = path to stylesheets for LMF Admin page kiwi.pages.style.type = java.lang.String +kiwi.pages.default_container.name.description = name for default container +kiwi.pages.default_container.name.type = java.lang.String + +kiwi.pages.default_container.number.description = ordering number for default container +kiwi.pages.default_container.number.type = java.lang.String + debug.enabled.description = enable or disable the logging of debugging messages for the whole system debug.enabled.type = java.lang.Boolean http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/80345190/platform/marmotta-core/src/main/resources/kiwi-module.properties ---------------------------------------------------------------------- diff --git a/platform/marmotta-core/src/main/resources/kiwi-module.properties b/platform/marmotta-core/src/main/resources/kiwi-module.properties index 30703e7..adce8f8 100644 --- a/platform/marmotta-core/src/main/resources/kiwi-module.properties +++ b/platform/marmotta-core/src/main/resources/kiwi-module.properties @@ -18,6 +18,11 @@ name=Core Services +icon=icon-beaker + +container=My Core Container +container.weight = 10 + subtitle = Configure LMF Core weight = 10 @@ -26,16 +31,35 @@ icon_small = /admin/img/config_small.png #do not change!!! baseurl=/core -adminpages=/admin/about.html,\ - /admin/configuration.html,\ - /admin/tasks.html,\ - /admin/import.html,\ - /admin/export.html,\ - /admin/dataview.html,\ - /admin/contexts.html,\ - /admin/prefixes.html,\ - /admin/system.html,\ - /admin/database.html, +adminpages.0.title=About +adminpages.0.link=/admin/about.html + +adminpages.1.title=Core Configuration +adminpages.1.link=/admin/configuration.html + +adminpages.2.title=Tasks +adminpages.2.link=/admin/tasks.html + +adminpages.3.title=Import +adminpages.3.link=/admin/import.html + +adminpages.4.title=Export +adminpages.4.link=/admin/export.html + +adminpages.5.title=Data Views +adminpages.5.link=/admin/dataview.html + +adminpages.6.title=Context Manager +adminpages.6.link=/admin/contexts.html + +adminpages.7.title=Prefix Manager +adminpages.7.link=/admin/prefixes.html + +adminpages.8.title=System +adminpages.8.link=/admin/system.html + +adminpages.9.title=Database +adminpages.9.link=/admin/database.html webservices=org.apache.marmotta.platform.core.webservices.config.ConfigurationWebService,\ org.apache.marmotta.platform.core.webservices.config.DependenciesWebService,\ http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/80345190/platform/marmotta-core/src/main/resources/templates/admin.ftl ---------------------------------------------------------------------- diff --git a/platform/marmotta-core/src/main/resources/templates/admin.ftl b/platform/marmotta-core/src/main/resources/templates/admin.ftl index 14b83a5..370c415 100644 --- a/platform/marmotta-core/src/main/resources/templates/admin.ftl +++ b/platform/marmotta-core/src/main/resources/templates/admin.ftl @@ -138,7 +138,7 @@ <div class="span4"> <div class="hero-unit"> <form> - <fieldset> + <fieldset> <legend>Legend</legend> <div class="field-box"> <label>Format</label>
