diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/common/AbstractAuthorizationValidator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/common/AbstractAuthorizationValidator.java new file mode 100644 index 0000000000000000000000000000000000000000..69c1d4955401e168fdfc4751d7ebd1141f57db97 --- /dev/null +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/common/AbstractAuthorizationValidator.java @@ -0,0 +1,85 @@ +/* + * Copyright 2017 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.ethz.sis.openbis.generic.server.asapi.v3.translator.common; + +import org.springframework.beans.factory.annotation.Autowired; + +import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationDataProvider; +import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ProjectByIdentiferValidator; +import ch.systemsx.cisd.openbis.generic.server.authorization.validator.SimpleSpaceValidator; +import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; +import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeHolder; +import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder; +import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; + +/** + * @author pkupczyk + */ +public class AbstractAuthorizationValidator +{ + + @Autowired + protected IDAOFactory daoFactory; + + protected boolean isValid(PersonPE person, SpaceIdentifier spaceIdentifier, ProjectIdentifier projectIdentifier) + { + AuthorizationDataProvider provider = new AuthorizationDataProvider(daoFactory); + + SimpleSpaceValidator spaceValidator = new SimpleSpaceValidator(); + spaceValidator.init(provider); + + ProjectByIdentiferValidator projectValidator = new ProjectByIdentiferValidator(); + projectValidator.init(provider); + + if (spaceIdentifier != null) + { + if (spaceValidator.isValid(person, new ICodeHolder() + { + @Override + public String getCode() + { + return spaceIdentifier.getSpaceCode(); + } + })) + { + return true; + } else + { + if (projectIdentifier != null) + { + return projectValidator.isValid(person, new IIdentifierHolder() + { + @Override + public String getIdentifier() + { + return projectIdentifier.toString(); + } + }); + } else + { + return false; + } + } + } else + { + return true; + } + } + +} diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationRecord.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationRecord.java deleted file mode 100644 index 83d3b2a6d94903d3d72cf64e2e346720e1e361cf..0000000000000000000000000000000000000000 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationRecord.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2015 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.ethz.sis.openbis.generic.server.asapi.v3.translator.dataset; - -/** - * @author pkupczyk - */ -public class DataSetAuthorizationRecord -{ - - public Long id; - - public Boolean isStorageConfirmed; - - public String sampleCode; - - public String sampleSpaceCode; - - public String sampleContainerCode; - - public String experimentCode; - - public String experimentProjectCode; - - public String experimentSpaceCode; - -} diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationValidator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationValidator.java index 0cf33f9b7868e4c2e52921f191b2cdd4e634a9a3..f575f645396ca421c92c04b96d5a32dbcf2e73b5 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationValidator.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationValidator.java @@ -16,92 +16,39 @@ package ch.ethz.sis.openbis.generic.server.asapi.v3.translator.dataset; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; -import java.util.List; import java.util.Set; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentIdentifier; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier; +import ch.ethz.sis.openbis.generic.server.asapi.v3.translator.common.AbstractAuthorizationValidator; import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationDataProvider; -import ch.systemsx.cisd.openbis.generic.server.authorization.validator.AbstractDataSetByExperimentOrSampleIdentifierValidator; -import ch.systemsx.cisd.openbis.generic.server.authorization.validator.AbstractValidator; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; +import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; +import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetAccessPE; import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; -import it.unimi.dsi.fastutil.longs.LongOpenHashSet; -import net.lemnik.eodsql.QueryTool; - /** * @author pkupczyk */ @Component -public class DataSetAuthorizationValidator implements IDataSetAuthorizationValidator +public class DataSetAuthorizationValidator extends AbstractAuthorizationValidator implements IDataSetAuthorizationValidator { - @Autowired - private IDAOFactory daoFactory; - @Override public Set<Long> validate(PersonPE person, Collection<Long> dataSetIds) { - DataSetQuery query = QueryTool.getManagedQuery(DataSetQuery.class); - List<DataSetAuthorizationRecord> records = query.getAuthorizations(new LongOpenHashSet(dataSetIds)); - AbstractValidator<DataSetAuthorizationRecord> validator = - new AbstractDataSetByExperimentOrSampleIdentifierValidator<DataSetAuthorizationRecord>() - { - - @Override - protected boolean isStorageConfirmed(DataSetAuthorizationRecord record) - { - if (record.isStorageConfirmed != null) - { - return record.isStorageConfirmed; - } else - { - return true; - } - } - - @Override - protected String getExperimentIdentifier(DataSetAuthorizationRecord record) - { - if (record.experimentCode != null) - { - return new ExperimentIdentifier(record.experimentSpaceCode, record.experimentProjectCode, record.experimentCode) - .getIdentifier(); - } else - { - return null; - } - } - - @Override - protected String getSampleIdentifier(DataSetAuthorizationRecord record) - { - if (record.sampleCode != null) - { - return new SampleIdentifier(record.sampleSpaceCode, record.sampleContainerCode, record.sampleCode).getIdentifier(); - } else - { - return null; - } - } - - }; - - validator.init(new AuthorizationDataProvider(daoFactory)); - + AuthorizationDataProvider provider = new AuthorizationDataProvider(daoFactory); + Set<DataSetAccessPE> accessDatas = + provider.getDatasetCollectionAccessDataByTechIds(TechId.createList(new ArrayList<Long>(dataSetIds)), false); Set<Long> result = new HashSet<Long>(); - for (DataSetAuthorizationRecord record : records) + for (DataSetAccessPE accessData : accessDatas) { - if (validator.doValidation(person, record)) + if (isValid(person, accessData.getSpaceIdentifier(), accessData.getProjectIdentifier())) { - result.add(record.id); + result.add(accessData.getDataSetId()); } } diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java index 540d443dc6a229b57a6ed1c7a840dbff1465cf74..8a975f0ffff5d69e0119994375434e3b6462d2c8 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java @@ -35,18 +35,6 @@ import net.lemnik.eodsql.Select; public interface DataSetQuery extends ObjectQuery { - @Select(sql = "select d.id, ed.storage_confirmation as isStorageConfirmed, s.code as sampleCode, sc.code as sampleContainerCode, ss.code as sampleSpaceCode, " - + "e.code as experimentCode, ep.code as experimentProjectCode, es.code as experimentSpaceCode from data d " - + "left join external_data ed on d.id = ed.data_id " - + "left join samples s on d.samp_id = s.id " - + "left join samples sc on s.samp_id_part_of = sc.id " - + "left join spaces ss on s.space_id = ss.id " - + "left join experiments e on d.expe_id = e.id " - + "left join projects ep on e.proj_id = ep.id " - + "left join spaces es on ep.space_id = es.id " - + "where d.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE) - public List<DataSetAuthorizationRecord> getAuthorizations(LongSet dataSetIds); - @Select(sql = "select d.id, d.code, d.is_derived as isDerived, d.data_producer_code as dataProducer, d.production_timestamp as dataProductionDate, d.access_timestamp as accessDate, d.modification_timestamp as modificationDate, d.registration_timestamp as registrationDate, d.data_set_kind as dataSetKind " + "from data d where d.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE) public List<DataSetBaseRecord> getDataSets(LongSet dataSetIds); diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationRecord.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationRecord.java deleted file mode 100644 index 0040118d1d2ba501e5119d8d6fdb068a5b891c0e..0000000000000000000000000000000000000000 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationRecord.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2015 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.ethz.sis.openbis.generic.server.asapi.v3.translator.sample; - -/** - * @author pkupczyk - */ -public class SampleAuthorizationRecord -{ - - public Long id; - - public String code; - - public String spaceCode; - - public String containerCode; - -} diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationValidator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationValidator.java index 7c96d939c576edf9935bb24d5307adcc8a0307d0..040c10b3f4aa639ed83fcf986e8928e27165014a 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationValidator.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationValidator.java @@ -16,57 +16,38 @@ package ch.ethz.sis.openbis.generic.server.asapi.v3.translator.sample; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; -import java.util.List; import java.util.Set; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier; +import ch.ethz.sis.openbis.generic.server.asapi.v3.translator.common.AbstractAuthorizationValidator; import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationDataProvider; -import ch.systemsx.cisd.openbis.generic.server.authorization.validator.SampleByIdentiferValidator; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; -import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder; +import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE; - -import it.unimi.dsi.fastutil.longs.LongOpenHashSet; -import net.lemnik.eodsql.QueryTool; +import ch.systemsx.cisd.openbis.generic.shared.dto.SampleAccessPE; /** * @author pkupczyk */ @Component -public class SampleAuthorizationValidator implements ISampleAuthorizationValidator +public class SampleAuthorizationValidator extends AbstractAuthorizationValidator implements ISampleAuthorizationValidator { - @Autowired - private IDAOFactory daoFactory; - @Override public Set<Long> validate(PersonPE person, Collection<Long> sampleIds) { - SampleQuery query = QueryTool.getManagedQuery(SampleQuery.class); - List<SampleAuthorizationRecord> records = query.getAuthorizations(new LongOpenHashSet(sampleIds)); - SampleByIdentiferValidator validator = new SampleByIdentiferValidator(); - validator.init(new AuthorizationDataProvider(daoFactory)); + AuthorizationDataProvider provider = new AuthorizationDataProvider(daoFactory); + Set<SampleAccessPE> accessDatas = provider.getSampleCollectionAccessDataByTechIds(TechId.createList(new ArrayList<Long>(sampleIds)), false); Set<Long> result = new HashSet<Long>(); - for (SampleAuthorizationRecord record : records) + for (SampleAccessPE accessData : accessDatas) { - final SampleAuthorizationRecord theRecord = record; - - if (validator.doValidation(person, new IIdentifierHolder() - { - @Override - public String getIdentifier() - { - return new SampleIdentifier(theRecord.spaceCode, theRecord.containerCode, theRecord.code).getIdentifier(); - } - })) + if (isValid(person, accessData.getSpaceIdentifier(), accessData.getProjectIdentifier())) { - result.add(record.id); + result.add(accessData.getSampleId()); } } diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleQuery.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleQuery.java index 80929755ac05e29cc4c019935a34aef9a5c949ac..bf8d4ededb8a9d728ce553f355adf982461bf1dc 100644 --- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleQuery.java +++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleQuery.java @@ -35,12 +35,6 @@ import net.lemnik.eodsql.Select; public interface SampleQuery extends ObjectQuery { - @Select(sql = "select s.id, s.code, sp.code as spaceCode, sc.code as containerCode " - + "from samples s left join spaces sp on s.space_id = sp.id " - + "left join samples sc on s.samp_id_part_of = sc.id " - + "where s.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE) - public List<SampleAuthorizationRecord> getAuthorizations(LongSet sampleIds); - @Select(sql = "select s.id, s.code, s.perm_id as permId, sp.code as spaceCode, p.code as projectCode, " + "sc.code as containerCode, s.registration_timestamp as registrationDate, " + "s.modification_timestamp as modificationDate " diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleAccessPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleAccessPE.java index 9c442a2203a23140ca0e1ba4fdb5979efa9661f3..a10c358de7de539cb103ec285bf8b6ea127b4634 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleAccessPE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleAccessPE.java @@ -29,6 +29,7 @@ import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; /** * A PE for retrieving only the information necessary to determine if a user/person can access a sample. @@ -106,6 +107,18 @@ public class SampleAccessPE this.spaceCode = spaceCode; } + @Transient + public SpaceIdentifier getSpaceIdentifier() + { + if (getSpaceCode() != null) + { + return new SpaceIdentifier(getSpaceCode()); + } else + { + return null; + } + } + @Transient public ProjectIdentifier getProjectIdentifier() {