diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties index 70676c0e4d..1082427533 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties @@ -7,7 +7,7 @@ rm.notification.role=RecordsManager # # Turn off imap server attachments if we are using RM. -# TODO : Longer term needs to have a query based, dynamic +# TODO : Longer term needs to have a query based, dynamic # exclusion for RM sites. # imap.server.attachments.extraction.enabled=false @@ -25,13 +25,25 @@ cache.writersSharedCache.maxItems=10000 # # Global RM admin default bootstrap details -# +# # Note: rmadmin is created with a randomly generated password. This can be changed by 'admin' if # required. # bootstrap.rmadmin.name=rmadmin -# +# # Indicates whether RM rules will be run as RM Admin or not by default # -rm.rule.runasrmadmin=true \ No newline at end of file +rm.rule.runasrmadmin=true + +# +# Auto-complete suggestion parameters +# +# The minimum size of fragment supplied that will trigger a search for suggestions for auto completion +rm.autocompletesuggestion.minfragmentsize=2 +# The maximum number of path suggestions to supply +rm.autocompletesuggestion.maxsuggestions.path=5 +# The maximum number of node suggestions to supply +rm.autocompletesuggestion.maxsuggestions.node=5 +# The maximum number of date suggestions to supply +rm.autocompletesuggestion.maxsuggestions.date=5 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml index 3e8250673a..b320013cc8 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml @@ -24,7 +24,7 @@ - + --> @@ -43,7 +43,7 @@ - + @@ -69,11 +69,11 @@ - + - + @@ -138,36 +138,36 @@ - + - + - + - + - + - + - + - + - + - + @@ -177,33 +177,52 @@ - + - + - + - + - - - - + + + + + + + ${rm.autocompletesuggestion.maxsuggestions.node} + - + + + + + + + + rma:record + cm:content + + + + - + + + ${rm.autocompletesuggestion.maxsuggestions.date} + - + - + - + - + @@ -218,16 +237,16 @@ false - + ${rm.rule.runasrmadmin} - - + + - + @@ -240,14 +259,14 @@ - + search - + @@ -258,11 +277,11 @@ ${spaces.store} - + true - - \ No newline at end of file + + \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml index a69a696a16..725ae4ea8f 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml @@ -576,6 +576,12 @@ + + ${rm.autocompletesuggestion.minfragmentsize} + + + ${rm.autocompletesuggestion.maxsuggestions.path} + \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/repo/action/parameter/DateParameterProcessor.java b/rm-server/source/java/org/alfresco/repo/action/parameter/DateParameterProcessor.java index 7ee434b9e5..1d8dc3c458 100644 --- a/rm-server/source/java/org/alfresco/repo/action/parameter/DateParameterProcessor.java +++ b/rm-server/source/java/org/alfresco/repo/action/parameter/DateParameterProcessor.java @@ -61,6 +61,8 @@ public class DateParameterProcessor extends ParameterProcessor implements Parame YEAR + SEP + WEEK }; + private int maximumNumberSuggestions = DEFAULT_MAXIMUM_NUMBER_SUGGESTIONS; + /** * @see org.alfresco.repo.action.parameter.ParameterProcessor#process(java.lang.String, org.alfresco.service.cmr.repository.NodeRef) */ @@ -194,6 +196,19 @@ public class DateParameterProcessor extends ParameterProcessor implements Parame return style; } + /** + * Set the maxmimum number of suggestions returned from the global property + * + * @param maximumNumberSuggestions + */ + public void setMaximumNumberSuggestions(int maximumNumberSuggestions) + { + this.maximumNumberSuggestions = (maximumNumberSuggestions <= 0 ? DEFAULT_MAXIMUM_NUMBER_SUGGESTIONS: maximumNumberSuggestions); + } + + /* (non-Javadoc) + * @see org.alfresco.repo.action.parameter.ParameterSubstitutionSuggester#getSubstitutionSuggestions(java.lang.String) + */ @Override public List getSubstitutionSuggestions(String substitutionFragment) { @@ -203,6 +218,10 @@ public class DateParameterProcessor extends ParameterProcessor implements Parame { for(String field: ALL_FIELDS_FOR_SUBSTITUTION_QUERY) { suggestions.add(namePrefix + field); + if(suggestions.size() >= maximumNumberSuggestions) + { + break; + } } } else @@ -212,6 +231,10 @@ public class DateParameterProcessor extends ParameterProcessor implements Parame if(prefixFieldName.toLowerCase().contains(substitutionFragment.toLowerCase())) { suggestions.add(namePrefix + field); + if(suggestions.size() >= maximumNumberSuggestions) + { + break; + } } } } diff --git a/rm-server/source/java/org/alfresco/repo/action/parameter/NodeParameterProcessor.java b/rm-server/source/java/org/alfresco/repo/action/parameter/NodeParameterProcessor.java index 97838be63b..1257edf257 100644 --- a/rm-server/source/java/org/alfresco/repo/action/parameter/NodeParameterProcessor.java +++ b/rm-server/source/java/org/alfresco/repo/action/parameter/NodeParameterProcessor.java @@ -20,12 +20,15 @@ package org.alfresco.repo.action.parameter; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; -import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; -import org.alfresco.service.cmr.dictionary.AspectDefinition; +import org.alfresco.module.org_alfresco_module_rm.admin.RecordsManagementAdminService; +import org.alfresco.service.cmr.dictionary.ClassDefinition; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.dictionary.PropertyDefinition; @@ -56,6 +59,8 @@ public class NodeParameterProcessor extends ParameterProcessor implements Parame DataTypeDefinition.MLTEXT }; + private int maximumNumberSuggestions = DEFAULT_MAXIMUM_NUMBER_SUGGESTIONS; + /** Node service */ private NodeService nodeService; @@ -65,6 +70,12 @@ public class NodeParameterProcessor extends ParameterProcessor implements Parame /** Dictionary service */ private DictionaryService dictionaryService; + /** Records management admin service */ + private RecordsManagementAdminService recordsManagementAdminService; + + /** List of definitions (aspects and types) to use for substitution suggestions */ + private List suggestionDefinitions = null; + /** * @param nodeService node service */ @@ -89,6 +100,14 @@ public class NodeParameterProcessor extends ParameterProcessor implements Parame this.dictionaryService = dictionaryService; } + /** + * @param recordsManagementAdminService Records management admin service + */ + public void setRecordsManagementAdminService(RecordsManagementAdminService recordsManagementAdminService) + { + this.recordsManagementAdminService = recordsManagementAdminService; + } + /** * @see org.alfresco.repo.action.parameter.ParameterProcessor#process(java.lang.String, org.alfresco.service.cmr.repository.NodeRef) */ @@ -133,6 +152,30 @@ public class NodeParameterProcessor extends ParameterProcessor implements Parame return result; } + /** + * Set the maxmimum number of suggestions returned from the global property + * + * @param maximumNumberSuggestions + */ + public void setMaximumNumberSuggestions(int maximumNumberSuggestions) + { + this.maximumNumberSuggestions = (maximumNumberSuggestions <= 0 ? DEFAULT_MAXIMUM_NUMBER_SUGGESTIONS: maximumNumberSuggestions); + } + + /** + * Add suggestion definition to the list used to get properties suggestions from. + * + * @param definition Type or aspect + */ + public void addSuggestionDefinition(QName definition) + { + if(this.suggestionDefinitions == null) + { + this.suggestionDefinitions = Collections.synchronizedList(new ArrayList()); + } + this.suggestionDefinitions.add(definition); + } + /** * Get a list of node substitution suggestions for the specified fragment. * @@ -144,39 +187,108 @@ public class NodeParameterProcessor extends ParameterProcessor implements Parame @Override public List getSubstitutionSuggestions(String substitutionFragment) { + Set suggestionSet = Collections.synchronizedSet(new HashSet()); + if(this.suggestionDefinitions != null) + { + for(QName definition : this.suggestionDefinitions) + { + if(getSubstitutionSuggestions(definition, substitutionFragment.toLowerCase(), suggestionSet)) + { + break; + } + } + } List suggestions = new ArrayList(); - getSubstitutionSuggestions(RecordsManagementModel.ASPECT_RECORD, substitutionFragment.toLowerCase(), suggestions); + suggestions.addAll(suggestionSet); + Collections.sort(suggestions); return suggestions; } /** - * Get a list of node substitution suggestions for the given aspect specified fragment. Calls itself recursively for - * associated aspects. + * Get a list of node substitution suggestions for the given definition and specified fragment. * - * @param aspect Aspect to get properties of and the call this method for associated aspects + * @param definitionName Definition (aspect or type) to get properties of and the call this method for associated aspects * @param substitutionFragment Substitution fragment to search for * @param suggestions The current list of suggestions to which we will add newly found suggestions */ - private void getSubstitutionSuggestions(QName aspect, String substitutionFragment, List suggestions) + private boolean getSubstitutionSuggestions(QName definitionName, String substitutionFragment, Set suggestions) { - AspectDefinition recordAspect = this.dictionaryService.getAspect(aspect); - Map properties = recordAspect.getProperties(); - for(QName key : properties.keySet()) + boolean gotMaximumSuggestions = false; + ClassDefinition definition = this.dictionaryService.getAspect(definitionName); + if(definition == null) { - PropertyDefinition propertyDefinition = properties.get(key); - QName type = propertyDefinition.getDataType().getName(); - if(ArrayUtils.contains(supportedDataTypes, type)) + definition = this.dictionaryService.getType(definitionName); + } + if(definition != null) + { + gotMaximumSuggestions = getSubstitutionSuggestionsForDefinition(definition, substitutionFragment, suggestions); + } + if(recordsManagementAdminService.isCustomisable(definitionName) && !gotMaximumSuggestions) + { + gotMaximumSuggestions = processPropertyDefinitions(recordsManagementAdminService.getCustomPropertyDefinitions(definitionName), substitutionFragment, suggestions); + } + return gotMaximumSuggestions; + } + + /** + * Get a list of node substitution suggestions for the given definition and specified fragment. Calls itself recursively for + * associated aspects. + * + * @param definition Definition (aspect or type) to get properties of and the call this method for associated aspects + * @param substitutionFragment Substitution fragment to search for + * @param suggestions The current list of suggestions to which we will add newly found suggestions + */ + private boolean getSubstitutionSuggestionsForDefinition(ClassDefinition definition, String substitutionFragment, Set suggestions) + { + boolean gotMaximumSuggestions = processPropertyDefinitions(definition.getProperties(), substitutionFragment, suggestions); + if(!gotMaximumSuggestions) + { + for(QName defaultAspect : definition.getDefaultAspectNames()) { - String suggestion = "node." + key.getPrefixString(); - if(suggestion.toLowerCase().contains(substitutionFragment)) + gotMaximumSuggestions = getSubstitutionSuggestions(defaultAspect, substitutionFragment, suggestions); + if(gotMaximumSuggestions) { - suggestions.add(suggestion); + break; } } } - for(QName defaultAspect : recordAspect.getDefaultAspectNames()) + return gotMaximumSuggestions; + } + + /** + * Process the supplied map of property definitions and add the ones that match the supplied fragment to the list of suggestions. + * + * @param definition Definition (aspect or type) to get properties of and the call this method for associated aspects + * @param substitutionFragment Substitution fragment to search for + * @param suggestions The current list of suggestions to which we will add newly found suggestions + */ + private boolean processPropertyDefinitions(Map properties, String substitutionFragment, Set suggestions) + { + boolean gotMaximumSuggestions = false; + if(properties != null) { - getSubstitutionSuggestions(defaultAspect, substitutionFragment, suggestions); + for(QName key : properties.keySet()) + { + PropertyDefinition propertyDefinition = properties.get(key); + QName type = propertyDefinition.getDataType().getName(); + if(ArrayUtils.contains(supportedDataTypes, type)) + { + String suggestion = getName() + "." + key.getPrefixString(); + if(suggestion.toLowerCase().contains(substitutionFragment)) + { + if(suggestions.size() < this.maximumNumberSuggestions) + { + suggestions.add(suggestion); + } + else + { + gotMaximumSuggestions = true; + break; + } + } + } + } } + return gotMaximumSuggestions; } } diff --git a/rm-server/source/java/org/alfresco/repo/action/parameter/NodeParameterSuggesterBootstrap.java b/rm-server/source/java/org/alfresco/repo/action/parameter/NodeParameterSuggesterBootstrap.java new file mode 100755 index 0000000000..a04106f041 --- /dev/null +++ b/rm-server/source/java/org/alfresco/repo/action/parameter/NodeParameterSuggesterBootstrap.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.action.parameter; + +import java.util.List; + +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.alfresco.util.ParameterCheck; + +/** + * Record metadata bootstrap bean. + *

+ * This method of bootstrapping record metadata aspects into the RecordService deprecates the + * previous practice of extending rma:recordMetaData. + * + * @author Mark Hibbins + * @since 2.2 + */ +public class NodeParameterSuggesterBootstrap +{ + /** namespace service */ + private NamespaceService namespaceService; + + /** map of record metadata aspects against file plan type */ + private List nodeParameterProcessorAspectsNames; + + /** node parameter processor */ + private NodeParameterProcessor nodeParameterProcessor; + + /** + * @param recordMetadataAspects map of record metadata aspects against file plan types + */ + public void setNodeParameterProcessorAspects(List nodeParameterProcessorAspectsNames) + { + this.nodeParameterProcessorAspectsNames = nodeParameterProcessorAspectsNames; + } + + /** + * @param namespaceService namespace service + */ + public void setNamespaceService(NamespaceService namespaceService) + { + this.namespaceService = namespaceService; + } + + /** + * @param nodeParameterProcessor Node parameter processor + */ + public void setNodeParameterProcessor(NodeParameterProcessor nodeParameterProcessor) + { + this.nodeParameterProcessor = nodeParameterProcessor; + } + + /** + * Init method + */ + public void init() + { + ParameterCheck.mandatory("namespaceService", namespaceService); + + if (nodeParameterProcessorAspectsNames != null) + { + for (String name : nodeParameterProcessorAspectsNames) + { + // convert to qname and save it + QName aspect = QName.createQName(name, namespaceService); + + // register with node parameter processor + this.nodeParameterProcessor.addSuggestionDefinition(aspect); + } + } + } +} diff --git a/rm-server/source/java/org/alfresco/repo/action/parameter/ParameterSubstitutionSuggester.java b/rm-server/source/java/org/alfresco/repo/action/parameter/ParameterSubstitutionSuggester.java index 2445273c20..3d3fb0fbd3 100644 --- a/rm-server/source/java/org/alfresco/repo/action/parameter/ParameterSubstitutionSuggester.java +++ b/rm-server/source/java/org/alfresco/repo/action/parameter/ParameterSubstitutionSuggester.java @@ -22,5 +22,7 @@ import java.util.List; public interface ParameterSubstitutionSuggester { + final static int DEFAULT_MAXIMUM_NUMBER_SUGGESTIONS = 10; + public List getSubstitutionSuggestions(final String substitutionFragment); } diff --git a/rm-server/source/java/org/alfresco/repo/web/scripts/substitutionsuggestions/RmSubstitutionSuggestionsGet.java b/rm-server/source/java/org/alfresco/repo/web/scripts/substitutionsuggestions/RmSubstitutionSuggestionsGet.java index 6eaac4db2a..0c41818a2f 100644 --- a/rm-server/source/java/org/alfresco/repo/web/scripts/substitutionsuggestions/RmSubstitutionSuggestionsGet.java +++ b/rm-server/source/java/org/alfresco/repo/web/scripts/substitutionsuggestions/RmSubstitutionSuggestionsGet.java @@ -60,8 +60,11 @@ public class RmSubstitutionSuggestionsGet extends DeclarativeWebScript private final static String CREATE_CAPABILITY = "Create"; private final static String VIEW_CAPABILITY = "ViewRecords"; - private final static int PATH_SUBSTITUTION_MINIMUM_FRAGMENT_LENGTH = 0; - private final static int PATH_SUBSTITUTION_MAXIMUM_NUMBER_RESULTS = 10; + private final static int DEFAULT_SUBSTITUTION_MINIMUM_FRAGMENT_LENGTH = 0; + private final static int DEFAULT_MAXIMUM_NUMBER_PATH_SUGGESTIONS = 10; + + private int pathSubstitutionMaximumNumberSuggestions = DEFAULT_MAXIMUM_NUMBER_PATH_SUGGESTIONS; + private int substitutionMinimumFragmentSize = DEFAULT_SUBSTITUTION_MINIMUM_FRAGMENT_LENGTH; private ParameterProcessorComponent parameterProcessorComponent; private NodeService nodeService; @@ -104,6 +107,26 @@ public class RmSubstitutionSuggestionsGet extends DeclarativeWebScript this.capabilityService = capabilityService; } + /** + * Set the minimum fragment size to process for suggestion processing + * + * @param maximumNumberSuggestions + */ + public void setSubstitutionMinimumFragmentSize(int substitutionMinimumFragmentSize) + { + this.substitutionMinimumFragmentSize = Math.max(substitutionMinimumFragmentSize, DEFAULT_SUBSTITUTION_MINIMUM_FRAGMENT_LENGTH); + } + + /** + * Set the maxmimum number of suggestions returned from the global property + * + * @param maximumNumberSuggestions + */ + public void setPathSubstitutionMaximumNumberSuggestions(int pathSubstitutionMaximumNumberSuggestions) + { + this.pathSubstitutionMaximumNumberSuggestions = (pathSubstitutionMaximumNumberSuggestions <= 0 ? DEFAULT_MAXIMUM_NUMBER_PATH_SUGGESTIONS: pathSubstitutionMaximumNumberSuggestions); + } + /** * Return a list of substitutions for the given fragment. * @@ -119,8 +142,11 @@ public class RmSubstitutionSuggestionsGet extends DeclarativeWebScript List substitutionSuggestions = new ArrayList(); - substitutionSuggestions.addAll(getSubPathSuggestions(req, path, fragment)); - substitutionSuggestions.addAll(this.parameterProcessorComponent.getSubstitutionSuggestions(fragment)); + if((fragment != null) && (fragment.length() >= this.substitutionMinimumFragmentSize)) + { + substitutionSuggestions.addAll(getSubPathSuggestions(req, path, fragment)); + substitutionSuggestions.addAll(this.parameterProcessorComponent.getSubstitutionSuggestions(fragment)); + } Map model = new HashMap(); model.put(SUBSTITUTIONS_MODEL_KEY, substitutionSuggestions); @@ -137,7 +163,7 @@ public class RmSubstitutionSuggestionsGet extends DeclarativeWebScript */ private List getSubPathSuggestions(WebScriptRequest req, final String path, final String fragment) { List pathSuggestions = new ArrayList(); - if((path != null) && path.startsWith("/") && (fragment != null) && (fragment.length() >= PATH_SUBSTITUTION_MINIMUM_FRAGMENT_LENGTH)) + if((path != null) && path.startsWith("/") && (fragment != null)) { String[] pathFragments = path.split("/"); @@ -177,7 +203,7 @@ public class RmSubstitutionSuggestionsGet extends DeclarativeWebScript if((fragment.isEmpty() || fileName.toLowerCase().startsWith(lowerCaseFragment)) && isNodeRefAppropriateForPathSuggestion(childNodeRef)) { pathSuggestions.add("/" + fileName); - if(pathSuggestions.size() >= PATH_SUBSTITUTION_MAXIMUM_NUMBER_RESULTS) + if(pathSuggestions.size() >= pathSubstitutionMaximumNumberSuggestions) { break; } diff --git a/rm-server/test/java/org/alfresco/repo/action/parameter/DateParameterProcessorTest.java b/rm-server/test/java/org/alfresco/repo/action/parameter/DateParameterProcessorTest.java index af9626bc65..4b43513d67 100644 --- a/rm-server/test/java/org/alfresco/repo/action/parameter/DateParameterProcessorTest.java +++ b/rm-server/test/java/org/alfresco/repo/action/parameter/DateParameterProcessorTest.java @@ -43,7 +43,7 @@ public class DateParameterProcessorTest } @Test - public void testGetSubstitutionSuggestions_All_01() + public void testGetSubstitutionSuggestions_01() { List suggestions = this.dateParameterProcessor.getSubstitutionSuggestions("date"); assertTrue(suggestions.contains("date.day.short")); @@ -56,14 +56,11 @@ public class DateParameterProcessorTest assertTrue(suggestions.contains("date.month.long")); assertTrue(suggestions.contains("date.month.number")); assertTrue(suggestions.contains("date.year.short")); - assertTrue(suggestions.contains("date.year")); - assertTrue(suggestions.contains("date.year.long")); - assertTrue(suggestions.contains("date.year.week")); - assertEquals(13, suggestions.size()); + assertEquals(10, suggestions.size()); } @Test - public void testGetSubstitutionSuggestions_All_02() + public void testGetSubstitutionSuggestions_02() { List suggestions = this.dateParameterProcessor.getSubstitutionSuggestions("dat"); assertTrue(suggestions.contains("date.day.short")); @@ -76,14 +73,11 @@ public class DateParameterProcessorTest assertTrue(suggestions.contains("date.month.long")); assertTrue(suggestions.contains("date.month.number")); assertTrue(suggestions.contains("date.year.short")); - assertTrue(suggestions.contains("date.year")); - assertTrue(suggestions.contains("date.year.long")); - assertTrue(suggestions.contains("date.year.week")); - assertEquals(13, suggestions.size()); + assertEquals(10, suggestions.size()); } @Test - public void testGetSubstitutionSuggestions_All_03() + public void testGetSubstitutionSuggestions_03() { List suggestions = this.dateParameterProcessor.getSubstitutionSuggestions("at"); assertTrue(suggestions.contains("date.day.short")); @@ -96,14 +90,11 @@ public class DateParameterProcessorTest assertTrue(suggestions.contains("date.month.long")); assertTrue(suggestions.contains("date.month.number")); assertTrue(suggestions.contains("date.year.short")); - assertTrue(suggestions.contains("date.year")); - assertTrue(suggestions.contains("date.year.long")); - assertTrue(suggestions.contains("date.year.week")); - assertEquals(13, suggestions.size()); + assertEquals(10, suggestions.size()); } @Test - public void testGetSubstitutionSuggestions_Partial_01() + public void testGetSubstitutionSuggestions_05() { List suggestions = this.dateParameterProcessor.getSubstitutionSuggestions("ay"); assertTrue(suggestions.contains("date.day.short")); @@ -115,7 +106,7 @@ public class DateParameterProcessorTest } @Test - public void testGetSubstitutionSuggestions_Partial_02() + public void testGetSubstitutionSuggestions_06() { List suggestions = this.dateParameterProcessor.getSubstitutionSuggestions("on"); assertTrue(suggestions.contains("date.day.long")); @@ -126,5 +117,4 @@ public class DateParameterProcessorTest assertTrue(suggestions.contains("date.year.long")); assertEquals(6, suggestions.size()); } - }