diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomColumnBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomColumnBO.java index 7094a2b86df5136a5cea6ce3757802e19e7da231..69642835d4e73aaee3674c6612b623c8542329b0 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomColumnBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomColumnBO.java @@ -16,6 +16,8 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; +import java.util.Set; + import org.springframework.dao.DataAccessException; import org.springframework.dao.DataRetrievalFailureException; @@ -26,6 +28,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IFilterOrColumnUpdates; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewColumnOrFilter; import ch.systemsx.cisd.openbis.generic.shared.dto.GridCustomColumnPE; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; +import ch.systemsx.cisd.openbis.generic.shared.util.ExpressionUtil; /** * Operations on grid custom columns. @@ -51,7 +54,7 @@ public class GridCustomColumnBO extends AbstractBusinessObject implements column.setLabel(newColumn.getName()); column.setDescription(newColumn.getDescription()); - column.setExpression(newColumn.getExpression()); + column.setExpression(checkExpressionFreeOfParameters(newColumn.getExpression())); column.setGridId(newColumn.getGridId()); column.setPublic(newColumn.isPublic()); column.setRegistrator(findRegistrator()); @@ -107,11 +110,22 @@ public class GridCustomColumnBO extends AbstractBusinessObject implements column.setLabel(updates.getName()); column.setDescription(updates.getDescription()); - column.setExpression(updates.getExpression()); + column.setExpression(checkExpressionFreeOfParameters(updates.getExpression())); column.setPublic(updates.isPublic()); validateAndSave(); } + + private String checkExpressionFreeOfParameters(String expression) + { + Set<String> parameters = ExpressionUtil.extractParameters(expression); + if (parameters.isEmpty()) + { + return expression; + } + throw new UserFailureException("Unexpected parameters '" + parameters + "' in expression: " + + expression); + } private void validateAndSave() { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomExpressionTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomExpressionTranslator.java index 0e53eb605dfc51094d72b58dcc11fe36f06358b4..edd61653be9c8ee62d500c1f6e39e833bc807317 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomExpressionTranslator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomExpressionTranslator.java @@ -19,11 +19,7 @@ package ch.systemsx.cisd.openbis.generic.shared.translator; import static org.apache.commons.lang.StringEscapeUtils.escapeHtml; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.commons.lang.StringEscapeUtils; @@ -33,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter; import ch.systemsx.cisd.openbis.generic.shared.dto.AbstractGridExpressionPE; import ch.systemsx.cisd.openbis.generic.shared.dto.GridCustomColumnPE; import ch.systemsx.cisd.openbis.generic.shared.dto.GridCustomFilterPE; +import ch.systemsx.cisd.openbis.generic.shared.util.ExpressionUtil; import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils; /** @@ -82,8 +79,6 @@ public final class GridCustomExpressionTranslator */ public static final class GridCustomFilterTranslator { - private static final String PARAMETER_PATTERN = "\\$\\{.*?\\}"; - public final static List<GridCustomFilter> translate(final List<GridCustomFilterPE> filters) { final List<GridCustomFilter> result = new ArrayList<GridCustomFilter>(); @@ -102,25 +97,12 @@ public final class GridCustomExpressionTranslator } final GridCustomFilter result = new GridCustomFilter(); result.setName(escapeHtml(original.getName())); - result.setParameters(extractParameters(original.getExpression())); + result.setParameters(ExpressionUtil.extractParameters(original.getExpression())); translateGridExpression(original, result); return result; } - static Set<String> extractParameters(String expression) - { - Pattern parameterPattern = Pattern.compile(PARAMETER_PATTERN); - Set<String> list = new HashSet<String>(); - Matcher matcher = parameterPattern.matcher(expression); - while (matcher.find()) - { - String group = matcher.group(); - list.add(group.substring(2, group.length() - 1)); - } - return list; - } - } private static void translateGridExpression(final AbstractGridExpressionPE<?> gridExpression, diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/ExpressionUtil.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/ExpressionUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..1e80b7b70c5b2b6e49dce996284a8971587032b4 --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/ExpressionUtil.java @@ -0,0 +1,54 @@ +/* + * Copyright 2009 ETH Zuerich, CISD + * + * Licensed 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 ch.systemsx.cisd.openbis.generic.shared.util; + +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + +/** + * Useful static methods for expressions. + * + * @author Franz-Josef Elmer + */ +public class ExpressionUtil +{ + public static final String PARAMETER_PATTERN = "\\$\\{.*?\\}"; + private static final Pattern PATTERN = Pattern.compile(ExpressionUtil.PARAMETER_PATTERN); + + /** + * Extracts all parameters in the specified expression + */ + public static Set<String> extractParameters(String expression) + { + Set<String> list = new LinkedHashSet<String>(); + Matcher matcher = PATTERN.matcher(expression); + while (matcher.find()) + { + String group = matcher.group(); + list.add(group.substring(2, group.length() - 1)); + } + return list; + } + + private ExpressionUtil() + { + } + +} diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomFilterTranslatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/ExpressionUtilTest.java similarity index 74% rename from openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomFilterTranslatorTest.java rename to openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/ExpressionUtilTest.java index fd2af6e8605763e023d95da2f4e9f22cd4ae8eea..d5d0868931def8529a049a9ad337c31869bf09be 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomFilterTranslatorTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/ExpressionUtilTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ch.systemsx.cisd.openbis.generic.shared.translator; +package ch.systemsx.cisd.openbis.generic.shared.util; import org.testng.AssertJUnit; import org.testng.annotations.Test; @@ -26,34 +26,34 @@ import ch.systemsx.cisd.openbis.generic.shared.translator.GridCustomExpressionTr * * @author Izabela Adamczyk */ -public class GridCustomFilterTranslatorTest extends AssertJUnit +public class ExpressionUtilTest extends AssertJUnit { @Test public void testExtractNoParameters() throws Exception { String expression = ""; - assertEquals(0, GridCustomFilterTranslator.extractParameters(expression).size()); + assertEquals("[]", ExpressionUtil.extractParameters(expression).toString()); } @Test public void testExtractOneParameter() throws Exception { String expression = "${abc}"; - assertEquals(1, GridCustomFilterTranslator.extractParameters(expression).size()); + assertEquals("[abc]", ExpressionUtil.extractParameters(expression).toString()); } @Test public void testExtractOneDuplicatedParameter() throws Exception { String expression = "${abc} ${abc}"; - assertEquals(1, GridCustomFilterTranslator.extractParameters(expression).size()); + assertEquals("[abc]", ExpressionUtil.extractParameters(expression).toString()); } @Test public void testExtractManyParameters() throws Exception { String expression = "${abc} ${abc} ${def} ${ghi}"; - assertEquals(3, GridCustomFilterTranslator.extractParameters(expression).size()); + assertEquals("[abc, def, ghi]", ExpressionUtil.extractParameters(expression).toString()); } }