diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/ViewLocator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/ViewLocator.java index 40611627d3d32e32e6ed94fe9d4ab7fa6220d2aa..d29e397e1fa74569628e15081efca224b94fc7fe 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/ViewLocator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/ViewLocator.java @@ -137,30 +137,36 @@ public class ViewLocator for (int i = 0; i < params.length; i++) { final String[] paramPair = params[i].split(KEY_VALUE_SEPARATOR); - assert paramPair.length == 2 : "Incorrectly formatted URL parameters"; + String paramName = paramPair.length > 0 ? paramPair[0] : null; + String paramValue = paramPair.length > 1 ? paramPair[1] : null; + // TODO 2010-09-20, Piotr Buczek: use com.google.gwt.http.client.URL.decode, exchange // BasicURLEncoder with URL.encode - paramPair[1] = StringEscapeUtils.unescapeHtml(paramPair[1].replaceAll("%2F", "/")); - if (GWT_PARAMETER.equals(paramPair[0])) + if (paramValue != null) + { + paramValue = StringEscapeUtils.unescapeHtml(paramValue.replaceAll("%2F", "/")); + } + + if (GWT_PARAMETER.equals(paramName)) { // skip GWT parameters -- only relevant during testing - } else if (ACTION_PARAMETER.equalsIgnoreCase(paramPair[0])) + } else if (ACTION_PARAMETER.equalsIgnoreCase(paramName)) { - actionOrNull = paramPair[1]; - } else if (ENTITY_PARAMETER.equalsIgnoreCase(paramPair[0])) + actionOrNull = paramValue; + } else if (ENTITY_PARAMETER.equalsIgnoreCase(paramName)) { - entityOrNull = paramPair[1]; - } else if (PERM_ID_PARAMETER.equalsIgnoreCase(paramPair[0])) + entityOrNull = paramValue; + } else if (PERM_ID_PARAMETER.equalsIgnoreCase(paramName)) { // Permlink URLs have an implied action if (actionOrNull == null) { actionOrNull = PERMLINK_ACTION; } - parameters.put(paramPair[0], paramPair[1]); + parameters.put(paramName, paramValue); } else { - parameters.put(paramPair[0], paramPair[1]); + parameters.put(paramName, paramValue); } } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/ImagingMaterialLocatorResolver.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/ImagingMaterialLocatorResolver.java index 54e20f29cae102e0c7a6de54030fe85da21a2f65..9a33b7016682447642dc94a01042a3543393bc4b 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/ImagingMaterialLocatorResolver.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/ImagingMaterialLocatorResolver.java @@ -17,6 +17,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.u import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.dto.ExperimentIdentifierSearchCriteria; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria; /** * Material detail view for screening materials. Overrides {@link MaterialLocatorResolver}. @@ -27,6 +28,8 @@ public class ImagingMaterialLocatorResolver extends MaterialLocatorResolver { private final IViewContext<IScreeningClientServiceAsync> viewContext; + private static final String EMPTY_EXPERIMENT_IDENTIFIER = ""; + public ImagingMaterialLocatorResolver(IViewContext<IScreeningClientServiceAsync> viewContext) { super(viewContext.getCommonViewContext()); @@ -44,8 +47,7 @@ public class ImagingMaterialLocatorResolver extends MaterialLocatorResolver tryGetExperimentIdentifierSearchCriteria(locator); AnalysisProcedureCriteria analysisProcedureCriteria = - ScreeningResolverUtils. - extractAnalysisProcedureCriteria(locator); + ScreeningResolverUtils.extractAnalysisProcedureCriteria(locator); openInitialMaterialViewer(extractMaterialIdentifier(locator), experimentCriteriaOrNull, analysisProcedureCriteria); @@ -58,14 +60,24 @@ public class ImagingMaterialLocatorResolver extends MaterialLocatorResolver String experimentIdentifierOrNull = getOptionalParameter(locator, ScreeningLinkExtractor.MATERIAL_DETAIL_EXPERIMENT_IDENT_PARAMETER_KEY); - if (experimentIdentifierOrNull != null) + boolean experimentIdentifierSpecified = + locator.getParameters().containsKey( + ScreeningLinkExtractor.MATERIAL_DETAIL_EXPERIMENT_IDENT_PARAMETER_KEY); + + if (experimentIdentifierSpecified) { + if (experimentIdentifierOrNull == null + || experimentIdentifierOrNull.trim().length() == 0) + { + experimentIdentifierOrNull = EMPTY_EXPERIMENT_IDENTIFIER; + } boolean restrictGlobalSearchToProject = getOptionalBooleanParameter(locator, ScreeningLinkExtractor.RESTRICT_GLOBAL_SEARCH_TO_PROJECT, false); return ExperimentIdentifierSearchCriteria.createExperimentScope( experimentIdentifierOrNull, restrictGlobalSearchToProject); } + // project String space = getOptionalParameter(locator, ScreeningLinkExtractor.SPACE_CODE_KEY); String project = getOptionalParameter(locator, ScreeningLinkExtractor.PROJECT_CODE_KEY); @@ -95,10 +107,10 @@ public class ImagingMaterialLocatorResolver extends MaterialLocatorResolver */ protected void openInitialMaterialViewer(MaterialIdentifier identifier, ExperimentIdentifierSearchCriteria experimentCriteriaOrNull, - AnalysisProcedureCriteria analysisProcedureCriteria) - throws UserFailureException + AnalysisProcedureCriteria analysisProcedureCriteria) throws UserFailureException { - viewContext.getCommonService().getMaterialInformationHolder(identifier, + viewContext.getCommonService().getMaterialInformationHolder( + identifier, new OpenEntityDetailsTabCallback(viewContext, experimentCriteriaOrNull, analysisProcedureCriteria)); } @@ -139,12 +151,21 @@ public class ImagingMaterialLocatorResolver extends MaterialLocatorResolver BasicProjectIdentifier project = scopeOrNull.tryGetProject(); if (experimentIdentifier != null) { - fetchExperimentAndShowLocations(material, experimentIdentifier); + if (EMPTY_EXPERIMENT_IDENTIFIER.equals(experimentIdentifier)) + { + openImagingMaterialViewer(material, + ExperimentSearchCriteria.createExperiment( + SingleExperimentSearchCriteria.EMPTY_CRITERIA, + scopeOrNull.getRestrictGlobalSearchLinkToProject())); + } else + { + fetchExperimentAndShowLocations(material, experimentIdentifier); + } + } else if (project != null) { openImagingMaterialViewer(material, - ExperimentSearchCriteria - .createAllExperimentsForProject(project)); + ExperimentSearchCriteria.createAllExperimentsForProject(project)); } else { openImagingMaterialViewer(material, @@ -164,8 +185,7 @@ public class ImagingMaterialLocatorResolver extends MaterialLocatorResolver protected void process(Experiment experiment) { ExperimentSearchCriteria experimentCriteria = - ExperimentSearchCriteria.createExperiment( - experiment, + ExperimentSearchCriteria.createExperiment(experiment, scopeOrNull.getRestrictGlobalSearchLinkToProject()); openImagingMaterialViewer(material, experimentCriteria); } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java index 30e246e000f6d88514920f6ca30d4dfb136e8101..78d3d09305e86da66927a3e6b56355b7056798ef 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java @@ -42,6 +42,9 @@ public class WellSearchCriteria implements Serializable { private static final long serialVersionUID = ServiceVersionHolder.VERSION; + public static final SingleExperimentSearchCriteria EMPTY_CRITERIA = + new SingleExperimentSearchCriteria(); + private TechId experimentId; private String experimentPermId;