Repository: isis Updated Branches: refs/heads/master 2f24674c4 -> 07b423587
ISIS-956: updates to CssClassFaFacetOnMemberFactory and to example apps (plus other minor tidy up in ServicesInstallerFromConfiguration which was used as basis/reference of implementation of parsing strings from config file.) Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/4bd90975 Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/4bd90975 Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/4bd90975 Branch: refs/heads/master Commit: 4bd90975ffa9286a8af879cb213f1157c65d591a Parents: 2f24674 Author: Dan Haywood <[email protected]> Authored: Thu Nov 20 12:13:06 2014 +0100 Committer: Dan Haywood <[email protected]> Committed: Thu Nov 20 12:13:06 2014 +0100 ---------------------------------------------------------------------- .../CssClassFaFacetOnMemberFactory.java | 94 +++++++++++++++++++- ...ClassFaFacetOnMemberFromConfiguredRegex.java | 30 +++++++ .../ServicesInstallerFromConfiguration.java | 38 +++++--- .../services/ServicesInstallerUtils.java | 22 ++--- .../src/main/webapp/WEB-INF/isis.properties | 16 ++++ .../src/main/webapp/WEB-INF/isis.properties | 16 ++++ 6 files changed, 185 insertions(+), 31 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/4bd90975/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java index 5a835a7..6e8dd1d 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java @@ -19,8 +19,18 @@ package org.apache.isis.core.metamodel.facets.members.cssclassfa.annotprop; +import java.lang.reflect.Method; +import java.util.Map; import java.util.Properties; +import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import com.google.common.base.Strings; +import com.google.common.collect.Maps; import org.apache.isis.applib.annotation.CssClassFa; +import org.apache.isis.core.commons.config.ConfigurationConstants; +import org.apache.isis.core.commons.config.IsisConfiguration; +import org.apache.isis.core.commons.config.IsisConfigurationAware; import org.apache.isis.core.metamodel.facetapi.FacetHolder; import org.apache.isis.core.metamodel.facetapi.FacetUtil; import org.apache.isis.core.metamodel.facetapi.FeatureType; @@ -29,7 +39,9 @@ import org.apache.isis.core.metamodel.facets.ContributeeMemberFacetFactory; import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet; -public class CssClassFaFacetOnMemberFactory extends FacetFactoryAbstract implements ContributeeMemberFacetFactory { +public class CssClassFaFacetOnMemberFactory extends FacetFactoryAbstract implements ContributeeMemberFacetFactory, IsisConfigurationAware{ + + private IsisConfiguration configuration; public CssClassFaFacetOnMemberFactory() { super(FeatureType.ACTIONS_ONLY); @@ -41,7 +53,10 @@ public class CssClassFaFacetOnMemberFactory extends FacetFactoryAbstract impleme if(cssClassFaFacet == null) { cssClassFaFacet = createFromAnnotationIfPossible(processMethodContext); } - + if(cssClassFaFacet == null) { + cssClassFaFacet = createFromConfiguredRegexIfPossible(processMethodContext); + } + // no-op if null FacetUtil.addFacet(cssClassFaFacet); } @@ -68,5 +83,80 @@ public class CssClassFaFacetOnMemberFactory extends FacetFactoryAbstract impleme return annotation != null ? new CssClassFaFacetOnMemberAnnotation(annotation.value(), processMethodContext.getFacetHolder()) : null; } + //region > faIconFromPattern + + + private final static Pattern FA_ICON_REGEX_PATTERN = Pattern.compile("([^:]+):(.+)"); + + private CssClassFaFacet createFromConfiguredRegexIfPossible(final ProcessMethodContext processMethodContext) { + final Method method = processMethodContext.getMethod(); + + String value = faIconIfAnyFor(method); + + return value != null + ? new CssClassFaFacetOnMemberFromConfiguredRegex(value, processMethodContext.getFacetHolder()) + : null; + } + + private String faIconIfAnyFor(Method method) { + final String name = method.getName(); + return faIconIfAnyFor(name); + } + + private String faIconIfAnyFor(String name) { + final Map<Pattern, String> faIconByPattern = getFaIconByPattern(); + + for (Map.Entry<Pattern, String> entry : faIconByPattern.entrySet()) { + final Pattern pattern = entry.getKey(); + final String faIcon = entry.getValue(); + if(pattern.matcher(name).matches()) { + return faIcon; + } + } + return null; + } + + private Map<Pattern,String> faIconByPattern; + + private Map<Pattern, String> getFaIconByPattern() { + if (faIconByPattern == null) { + // build lazily + final String cssClassFaPatterns = configuration.getString("isis.reflector.facet.cssClassFa.patterns"); + this.faIconByPattern = buildFaIconByPattern(cssClassFaPatterns); + } + return faIconByPattern; + } + + private static Map<Pattern, String> buildFaIconByPattern(String cssClassFaPatterns) { + final Map<Pattern,String> faIconByPattern = Maps.newLinkedHashMap(); + if(cssClassFaPatterns != null) { + final StringTokenizer regexToFaIcons = new StringTokenizer(cssClassFaPatterns, ConfigurationConstants.LIST_SEPARATOR); + final Map<String,String> faIconByRegex = Maps.newLinkedHashMap(); + while (regexToFaIcons.hasMoreTokens()) { + String regexToFaIcon = regexToFaIcons.nextToken().trim(); + if (Strings.isNullOrEmpty(regexToFaIcon)) { + continue; + } + final Matcher matcher = FA_ICON_REGEX_PATTERN.matcher(regexToFaIcon); + if(matcher.matches()) { + faIconByRegex.put(matcher.group(1), matcher.group(2)); + } + } + for (Map.Entry<String, String> entry : faIconByRegex.entrySet()) { + final String regex = entry.getKey(); + final String faIcon = entry.getValue(); + faIconByPattern.put(Pattern.compile(regex), faIcon); + } + } + return faIconByPattern; + } + //endregion + + //region > injected + @Override + public void setConfiguration(final IsisConfiguration configuration) { + this.configuration = configuration; + } + //endregion } http://git-wip-us.apache.org/repos/asf/isis/blob/4bd90975/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java new file mode 100644 index 0000000..9be8ed8 --- /dev/null +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java @@ -0,0 +1,30 @@ +/* + * 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.isis.core.metamodel.facets.members.cssclassfa.annotprop; + +import org.apache.isis.core.metamodel.facetapi.FacetHolder; +import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacetAbstract; + +public class CssClassFaFacetOnMemberFromConfiguredRegex extends CssClassFaFacetAbstract { + + public CssClassFaFacetOnMemberFromConfiguredRegex(final String value, final FacetHolder holder) { + super(value, holder); + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/4bd90975/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromConfiguration.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromConfiguration.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromConfiguration.java index a5189b3..8d3b602 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromConfiguration.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromConfiguration.java @@ -19,9 +19,14 @@ package org.apache.isis.core.runtime.services; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.google.common.base.Strings; import com.google.common.collect.Maps; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,7 +49,7 @@ public class ServicesInstallerFromConfiguration extends InstallerAbstract implem @Deprecated private static final String SERVICES_PREFIX = "services.prefix"; - private final static Pattern regex = Pattern.compile("((\\d+):)(.*)"); + private final static Pattern POSITIONED_SERVICE_REGEX = Pattern.compile("((\\d+):)(.*)"); private final ServiceInstantiator serviceInstantiator; @@ -61,6 +66,7 @@ public class ServicesInstallerFromConfiguration extends InstallerAbstract implem private Map<DeploymentType, List<Object>> servicesByDeploymentType = Maps.newHashMap(); + public void init() { initIfRequired(); } @@ -137,18 +143,33 @@ public class ServicesInstallerFromConfiguration extends InstallerAbstract implem if (serviceName.equals("")) { continue; } - final Matcher matcher = regex.matcher(serviceName); + final Matcher matcher = POSITIONED_SERVICE_REGEX.matcher(serviceName); Integer order = Integer.MAX_VALUE; if(matcher.matches()) { order = Integer.parseInt(matcher.group(2)); serviceName = matcher.group(3); } - final String service = ServicesInstallerUtils.fullyQualifiedServiceName(servicePrefix, serviceName); + final String service = fullyQualifiedServiceName(servicePrefix, serviceName); ServicesInstallerUtils.appendInPosition(positionedServices, "" + order, service); } } + static String fullyQualifiedServiceName(String servicePrefix, String serviceName) { + final StringBuilder buf = new StringBuilder(); + + if(!Strings.isNullOrEmpty(servicePrefix)) { + buf.append(servicePrefix); + if(!servicePrefix.endsWith(".")) { + buf.append("."); + } + } + + buf.append(serviceName); + return buf.toString(); + } + + private void appendObjectFixtureService(DeploymentType deploymentType, final SortedMap<String, SortedSet<String>> positionedServices) { final String group = deploymentType != null? deploymentType.name(): null; @@ -162,15 +183,6 @@ public class ServicesInstallerFromConfiguration extends InstallerAbstract implem } } - // unused, I think....? - private static String servicePrefix(final String servicePrefix) { - String prefix = servicePrefix == null ? "" : servicePrefix.trim(); - if (prefix.length() > 0 && !prefix.endsWith(ConfigurationConstants.DELIMITER)) { - prefix = prefix + ConfigurationConstants.DELIMITER; - } - return prefix; - } - @Override public List<Class<?>> getTypes() { return listOf(List.class); // ie List<Object.class>, of services http://git-wip-us.apache.org/repos/asf/isis/blob/4bd90975/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerUtils.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerUtils.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerUtils.java index 88d4919..34f72c0 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerUtils.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerUtils.java @@ -19,10 +19,14 @@ package org.apache.isis.core.runtime.services; -import java.util.*; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.SortedMap; +import java.util.SortedSet; import com.google.common.base.Function; import com.google.common.base.Predicates; -import com.google.common.base.Strings; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -103,18 +107,4 @@ final class ServicesInstallerUtils { }; } - static String fullyQualifiedServiceName(String servicePrefix, String serviceName) { - final StringBuilder buf = new StringBuilder(); - - if(!Strings.isNullOrEmpty(servicePrefix)) { - buf.append(servicePrefix); - if(!servicePrefix.endsWith(".")) { - buf.append("."); - } - } - - buf.append(serviceName); - - return buf.toString(); - } } http://git-wip-us.apache.org/repos/asf/isis/blob/4bd90975/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties ---------------------------------------------------------------------- diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties index 54bf51c..339bae3 100644 --- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties +++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties @@ -95,6 +95,22 @@ isis.authorization=shiro +# +# patterns for applying CssClassFa facet (font-awesome icons) to member names +# +isis.reflector.facet.cssClassFa.patterns=\ + create.*:fa-plus,\ + update.*:fa-edit,\ + add.*:fa-plus-square,\ + remove.*:fa-minus-square,\ + move.*:fa-exchange,\ + first.*:fa-star,\ + find.*:fa-search,\ + clear.*:fa-remove,\ + previous.*:fa-step-backward,\ + next.*:fa-step-forward,\ + list.*:fa-list + ################################################################################# # # Value facet defaults http://git-wip-us.apache.org/repos/asf/isis/blob/4bd90975/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties ---------------------------------------------------------------------- diff --git a/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties index 66fbabd..494a818 100644 --- a/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties +++ b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties @@ -95,6 +95,22 @@ isis.authorization=shiro +# +# patterns for applying CssClassFa facet (font-awesome icons) to member names +# +isis.reflector.facet.cssClassFa.patterns=\ + create.*:fa-plus,\ + update.*:fa-edit,\ + add.*:fa-plus-square,\ + remove.*:fa-minus-square,\ + move.*:fa-exchange,\ + first.*:fa-star,\ + find.*:fa-search,\ + clear.*:fa-remove,\ + previous.*:fa-step-backward,\ + next.*:fa-step-forward,\ + list.*:fa-list + ################################################################################# # # Value facet defaults
