diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java index 8121bafc4280ca364d07471d739b9dd1a1efa2db..f14a388bcfbd512e7a372b31678a068ea6f0570d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java @@ -180,6 +180,11 @@ public interface ICommonClientService extends IClientService public MetaprojectAssignments getMetaprojectAssignments(Long metaprojectId, MetaprojectAssignmentsFetchOption[] fetchOptions) throws UserFailureException; + /** + * Returns metaproject. + */ + public Metaproject getMetaproject(Long metaprojectId) throws UserFailureException; + /** * Like {@link #prepareExportSamples(TableExportCriteria)}, but for scripts. */ @@ -749,6 +754,10 @@ public interface ICommonClientService extends IClientService /** Deletes the specified projects. */ public void deleteProjects(List<TechId> projectIds, String reason) throws UserFailureException; + /** Deletes the specified metaprojects. */ + public void deleteMetaprojects(List<TechId> metaprojectIds, String reason) + throws UserFailureException; + /** Deletes the specified spaces. */ public void deleteSpaces(List<TechId> spaceIds, String reason) throws UserFailureException; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java index 93ef7d92b0dfaffb988643313ca6129e6a2f6783..d5baf81ca29a864a1685ef579848357ca0fb6c93 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java @@ -162,6 +162,11 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync MetaprojectAssignmentsFetchOption[] fetchOptions, final AsyncCallback<MetaprojectAssignments> asyncCallback); + /** + * @see ICommonClientService#getMetaproject(Long) + */ + public void getMetaproject(Long metaprojectId, final AsyncCallback<Metaproject> asyncCallback); + /** @see ICommonClientService#prepareExportScripts(TableExportCriteria) */ public void prepareExportScripts( TableExportCriteria<TableModelRowWithObject<Script>> exportCriteria, @@ -652,6 +657,10 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync public void deleteProjects(List<TechId> projectIds, String reason, AsyncCallback<Void> asyncCallback); + /** @see ICommonClientService#deleteMetaprojects(List, String) */ + public void deleteMetaprojects(List<TechId> metaprojectIds, String reason, + AsyncCallback<Void> asyncCallback); + /** @see ICommonClientService#deleteSpaces(List, String) */ public void deleteSpaces(List<TechId> spaceIds, String reason, AsyncCallback<Void> asyncCallback); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java index de54cd3260faea9e7b9a5dad531592e798c11665..16d6af194ffef7429b7244856c16c39d960336db 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java @@ -80,6 +80,8 @@ public abstract class Dict public static final String BREADCRUMBS_SEPARATOR = "breadcrumbs_separator"; + public static final String METAPROJECT = "metaproject"; + public static final String METAPROJECTS = "metaprojects"; public static final String METAPROJECTS_HINT = "metaprojects_hint"; @@ -1158,6 +1160,8 @@ public abstract class Dict public static final String BUTTON_DELETE_PROJECT = "button_delete_project"; + public static final String BUTTON_DELETE_METAPROJECT = "button_delete_metaproject"; + public static final String BUTTON_CONFIGURE = "button_configure"; public static final String BUTTON_FILTERS = "button_filters"; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabHelper.java index 2bab93f3c025f93e6ff31876d7826b38f7af038c..0bfeba3355c644e176eceedaf031ce17f0ec180c 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabHelper.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabHelper.java @@ -29,8 +29,10 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpP import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction; import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.metaproject.viewer.MetaprojectViewer; import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException; import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId; +import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityDescription; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; @@ -140,4 +142,47 @@ public class OpenEntityDetailsTabHelper tabFactory.setInBackground(keyPressed); DispatcherHelper.dispatchNaviEvent(tabFactory); } + + public static void openMetaproject(final IViewContext<?> viewContext, + final IIdAndCodeHolder metaproject, boolean keyPressed) + { + AbstractTabItemFactory tabFactory; + tabFactory = new AbstractTabItemFactory() + { + @Override + public ITabItem create() + { + final DatabaseModificationAwareComponent viewer = + MetaprojectViewer.create(viewContext, metaproject.getId()); + return DefaultTabItem.create(getTabTitle(), viewer, viewContext, false); + } + + @Override + public String getId() + { + return MetaprojectViewer.createId(metaproject.getId()); + } + + @Override + public String getTabTitle() + { + return AbstractViewer.getTitle(viewContext, Dict.METAPROJECT, metaproject); + } + + @Override + public HelpPageIdentifier getHelpPageIdentifier() + { + return new HelpPageIdentifier(HelpPageDomain.METAPROJECT, HelpPageAction.VIEW); + } + + @Override + public String tryGetLink() + { + // TODO return a link + return null; + } + }; + tabFactory.setInBackground(keyPressed); + DispatcherHelper.dispatchNaviEvent(tabFactory); + } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/dialog/MetaprojectDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/dialog/MetaprojectDeletionConfirmationDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..ebbbbe959f873a4e8417260f9bc374bd65e97e51 --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/dialog/MetaprojectDeletionConfirmationDialog.java @@ -0,0 +1,53 @@ +/* + * 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.client.web.client.application.ui.metaproject.dialog; + +import java.util.Collections; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataListPermanentDeletionConfirmationDialog; +import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; + +public final class MetaprojectDeletionConfirmationDialog extends + AbstractDataListPermanentDeletionConfirmationDialog<Long> +{ + + public MetaprojectDeletionConfirmationDialog(IViewContext<?> viewContext, Long metaprojectId, + AbstractAsyncCallback<Void> callback) + { + super(viewContext, Collections.singletonList(metaprojectId), callback); + this.setId("metaproject-confirmation-dialog"); + } + + @Override + protected void executeDeletion(AsyncCallback<Void> deletionCallback) + { + viewContext.getCommonService().deleteMetaprojects(TechId.createList(data), + reason.getValue(), deletionCallback); + } + + @Override + protected String getEntityName() + { + return messageProvider.getMessage(Dict.METAPROJECT); + } + +} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/MetaprojectTree.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/MetaprojectTree.java index f665de755dd9d4f9bce34a3bc40654bdbe473036..0307c4ced091b8e083ea874c1259fd8158f7a646 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/MetaprojectTree.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/MetaprojectTree.java @@ -227,6 +227,20 @@ public class MetaprojectTree extends TreeGrid<MetaprojectTreeItemData> implement items.add(new MetaprojectTreeMetaprojectItemData(count.getMetaproject())); } + Collections.sort(items, new Comparator<MetaprojectTreeItemData>() + { + @Override + public int compare(MetaprojectTreeItemData o1, MetaprojectTreeItemData o2) + { + MetaprojectTreeMetaprojectItemData m1 = + (MetaprojectTreeMetaprojectItemData) o1; + MetaprojectTreeMetaprojectItemData m2 = + (MetaprojectTreeMetaprojectItemData) o2; + return m1.getMetaproject().getName() + .compareTo(m2.getMetaproject().getName()); + } + }); + callback.onSuccess(items); } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/widget/MetaprojectTreeMetaprojectItemWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/widget/MetaprojectTreeMetaprojectItemWidget.java index 186545210a5cef1efdf7e08f43c73e0b6783fc36..8b32d3f5a13c19527022566998ff9905d4cd0dcf 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/widget/MetaprojectTreeMetaprojectItemWidget.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/widget/MetaprojectTreeMetaprojectItemWidget.java @@ -16,6 +16,8 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.metaproject.tree.widget; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.event.dom.client.MouseOverEvent; @@ -27,7 +29,10 @@ import com.google.gwt.user.client.ui.Widget; import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabHelper; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.metaproject.tree.model.MetaprojectTreeMetaprojectItemData; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.WidgetUtils; import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils; /** @@ -83,8 +88,24 @@ public class MetaprojectTreeMetaprojectItemWidget extends MetaprojectTreeItemWid { if (link == null) { - // TODO make a real link that opens a metaproject detail view - link = new InlineLabel(getViewContext().getMessage(Dict.METAPROJECT_TREE_INFO_LINK)); + ClickHandler listener = new ClickHandler() + { + @Override + public void onClick(ClickEvent event) + { + OpenEntityDetailsTabHelper.openMetaproject(getViewContext(), + data.getMetaproject(), + WidgetUtils.ifSpecialKeyPressed(event.getNativeEvent())); + } + }; + + // TODO create href + String href = ""; + + link = + LinkRenderer.getLinkWidget( + getViewContext().getMessage(Dict.METAPROJECT_TREE_INFO_LINK), listener, + href); link.setVisible(isSelected()); } return link; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/viewer/MetaprojectViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/viewer/MetaprojectViewer.java new file mode 100644 index 0000000000000000000000000000000000000000..30f102b3d9384fdb3292eb34f179475110dd46cd --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/viewer/MetaprojectViewer.java @@ -0,0 +1,176 @@ +/* + * Copyright 2008 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.client.web.client.application.ui.metaproject.viewer; + +import java.util.HashSet; +import java.util.Set; + +import com.extjs.gxt.ui.client.widget.Label; +import com.extjs.gxt.ui.client.widget.layout.BorderLayout; + +import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.metaproject.dialog.MetaprojectDeletionConfirmationDialog; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction; +import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject; + +/** + * @author pkupczyk + */ +public final class MetaprojectViewer extends AbstractViewer<IEntityInformationHolder> implements + IDatabaseModificationObserver +{ + private static final String PREFIX = "metaproject-viewer_"; + + public static final String ID_PREFIX = GenericConstants.ID_PREFIX + PREFIX; + + private final Long metaprojectId; + + private Metaproject originalMetaproject; + + public static DatabaseModificationAwareComponent create(final IViewContext<?> viewContext, + final Long metaprojectId) + { + MetaprojectViewer viewer = new MetaprojectViewer(viewContext, metaprojectId); + return new DatabaseModificationAwareComponent(viewer, viewer); + } + + private MetaprojectViewer(final IViewContext<?> viewContext, final Long metaprojectId) + { + super(viewContext, createId(metaprojectId)); + this.metaprojectId = metaprojectId; + setLayout(new BorderLayout()); + extendToolBar(); + reloadAllData(); + } + + public static String createId(final Long metaprojectId) + { + return ID_PREFIX + metaprojectId; + } + + private void extendToolBar() + { + if (viewContext.isSimpleOrEmbeddedMode()) + { + return; + } + addToolBarButton(createDeleteButton(new IDelegatedAction() + { + @Override + public void execute() + { + new MetaprojectDeletionConfirmationDialog(viewContext, + originalMetaproject.getId(), createPermanentDeletionCallback()).show(); + } + })); + } + + @Override + protected void reloadAllData() + { + reloadData(new AbstractAsyncCallback<Metaproject>(viewContext) + { + @Override + protected void process(Metaproject result) + { + recreateView(result); + } + + @Override + public void finishOnFailure(Throwable caught) + { + setupRemovedEntityView(); + } + }); + } + + protected void reloadData(AbstractAsyncCallback<Metaproject> callback) + { + viewContext.getCommonService().getMetaproject(metaprojectId, callback); + } + + private void recreateView(final Metaproject metaproject) + { + updateOriginalMetaproject(metaproject); + removeAll(); + + // TODO layout + add(new Label(metaproject.getIdentifier())); + + layout(); + } + + private void updateOriginalMetaproject(Metaproject metaproject) + { + this.originalMetaproject = metaproject; + updateBreadcrumbs(); + setToolBarButtonsEnabled(true); + } + + @Override + public void setupRemovedEntityView() + { + removeAll(); + updateTitle(getOriginalDataDescription() + " does not exist any more."); + setToolBarButtonsEnabled(false); + } + + @Override + protected String getOriginalDataDescription() + { + return viewContext.getMessage(Dict.METAPROJECT) + " " + originalMetaproject.getName(); + } + + @Override + protected void showEntityEditor(boolean inBackground) + { + // TODO + } + + @Override + public void update(Set<DatabaseModificationKind> observedModifications) + { + reloadAllData(); + } + + @Override + public DatabaseModificationKind[] getRelevantModifications() + { + Set<DatabaseModificationKind> result = new HashSet<DatabaseModificationKind>(); + DatabaseModificationKind.addAny(result, ObjectKind.METAPROJECT); + DatabaseModificationKind.addAny(result, ObjectKind.EXPERIMENT); + DatabaseModificationKind.addAny(result, ObjectKind.SAMPLE); + DatabaseModificationKind.addAny(result, ObjectKind.DATA_SET); + DatabaseModificationKind.addAny(result, ObjectKind.MATERIAL); + return result.toArray(DatabaseModificationKind.EMPTY_ARRAY); + } + + @Override + protected String getDeleteButtonLabel() + { + return viewContext.getMessage(Dict.BUTTON_DELETE_METAPROJECT); + } +} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java index 283db3e20e85ff72631c46907a3058197f67168f..94b0b2f33bffb529612806e0f0db2021d6a427ec 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java @@ -112,6 +112,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.translator.UserFailure import ch.systemsx.cisd.openbis.generic.client.web.server.util.TSVRenderer; import ch.systemsx.cisd.openbis.generic.shared.ICommonServer; import ch.systemsx.cisd.openbis.generic.shared.IServer; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.metaproject.IMetaprojectId; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.metaproject.MetaprojectTechIdId; import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder; import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId; @@ -735,6 +736,14 @@ public final class CommonClientService extends AbstractClientService implements metaprojectId), fetchOptionsSet); } + @Override + public Metaproject getMetaproject(Long metaprojectId) + throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException + { + return commonServer.getMetaproject(getSessionToken(), + new MetaprojectTechIdId(metaprojectId)); + } + @Override public List<AuthorizationGroup> listAuthorizationGroups() throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException @@ -1605,6 +1614,21 @@ public final class CommonClientService extends AbstractClientService implements commonServer.deleteProjects(sessionToken, projectIds, reason); } + @Override + public void deleteMetaprojects(List<TechId> metaprojectIds, String reason) + throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException + { + final String sessionToken = getSessionToken(); + + List<IMetaprojectId> ids = new ArrayList<IMetaprojectId>(); + for (TechId metaprojectId : metaprojectIds) + { + ids.add(new MetaprojectTechIdId(metaprojectId)); + } + + commonServer.deleteMetaprojects(sessionToken, ids, reason); + } + @Override public void deleteSpaces(List<TechId> groupIds, String reason) throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java index 312eeb612aae2d83fdec69dbf4a48b9b93e5e887..b9b215a5dd2b0287640c66d8094618bd2216915b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java @@ -677,7 +677,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt { final Session session = getSession(sessionToken); final AuthorizationServiceUtils authorization = getAuthorizationService(session); - final MetaprojectPE metaproject = getMetaproject(sessionToken, metaprojectId); + final Metaproject metaproject = getMetaproject(sessionToken, metaprojectId); final ISampleLister lister = businessObjectFactory.createSampleLister(session); List<Sample> samples = @@ -763,7 +763,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt { final Session session = getSession(sessionToken); final AuthorizationServiceUtils authorization = getAuthorizationService(session); - final MetaprojectPE metaproject = getMetaproject(sessionToken, metaprojectId); + final Metaproject metaproject = getMetaproject(sessionToken, metaprojectId); final IDatasetLister lister = createDatasetLister(session); final List<ExternalData> datasets = lister.listByMetaprojectId(metaproject.getId()); @@ -917,9 +917,9 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt final Session session = getSession(sessionToken); final AuthorizationServiceUtils authorization = getAuthorizationService(session); - MetaprojectPE metaproject = getMetaproject(sessionToken, metaprojectId); + Metaproject metaproject = getMetaproject(sessionToken, metaprojectId); Collection<MetaprojectAssignmentPE> assignments = - getMetaprojectAssignments(metaproject, EntityKind.EXPERIMENT); + getMetaprojectAssignments(metaproject.getId(), EntityKind.EXPERIMENT); List<ExperimentPE> experimentsPE = new ArrayList<ExperimentPE>(); for (MetaprojectAssignmentPE assignment : assignments) @@ -1586,9 +1586,9 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt public List<Material> listMetaprojectMaterials(String sessionToken, IMetaprojectId metaprojectId) { final Session session = getSession(sessionToken); - final MetaprojectPE metaprojectPE = getMetaproject(sessionToken, metaprojectId); + final Metaproject metaproject = getMetaproject(sessionToken, metaprojectId); final IMaterialLister materialLister = businessObjectFactory.createMaterialLister(session); - return materialLister.list(new MetaprojectCriteria(metaprojectPE.getId()), true); + return materialLister.list(new MetaprojectCriteria(metaproject.getId()), true); } @Override @@ -2453,8 +2453,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt { List<EntityTypePE> types = new ArrayList<EntityTypePE>(); if ((entityKind.equals(EntityKind.SAMPLE) || entityKind.equals(EntityKind.DATA_SET) || entityKind - .equals(EntityKind.MATERIAL)) - && EntityType.isDefinedInFileEntityTypeCode(type)) + .equals(EntityKind.MATERIAL)) && EntityType.isDefinedInFileEntityTypeCode(type)) { types.addAll(getDAOFactory().getEntityTypeDAO( DtoConverters.convertEntityKind(entityKind)).listEntityTypes()); @@ -3728,8 +3727,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt public MetaprojectAssignmentsCount getMetaprojectAssignmentsCount(String sessionToken, IMetaprojectId metaprojectId) { - MetaprojectPE metaprojectPE = getMetaproject(sessionToken, metaprojectId); - Metaproject metaproject = MetaprojectTranslator.translate(metaprojectPE); + Metaproject metaproject = getMetaproject(sessionToken, metaprojectId); return getMetaprojectAssignmentsCount(metaproject); } @@ -3760,10 +3758,9 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt String baseIndexURL = getBaseIndexURL(sessionToken); AuthorizationServiceUtils authorizationUtils = getAuthorizationService(session); - MetaprojectPE metaprojectPE = getMetaproject(sessionToken, metaprojectId); - + Metaproject metaproject = getMetaproject(sessionToken, metaprojectId); MetaprojectAssignments metaprojectAssignments = new MetaprojectAssignments(); - metaprojectAssignments.setMetaproject(MetaprojectTranslator.translate(metaprojectPE)); + metaprojectAssignments.setMetaproject(metaproject); List<Experiment> experiments = new ArrayList<Experiment>(); List<Sample> samples = new ArrayList<Sample>(); @@ -3773,7 +3770,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt if (fetchOptions.contains(MetaprojectAssignmentsFetchOption.EXPERIMENTS)) { for (MetaprojectAssignmentPE metaprojectAssignmentPE : getMetaprojectAssignments( - metaprojectPE, EntityKind.EXPERIMENT)) + metaproject.getId(), EntityKind.EXPERIMENT)) { if (authorizationUtils.canAccessExperiment(metaprojectAssignmentPE.getExperiment())) { @@ -3791,7 +3788,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt if (fetchOptions.contains(MetaprojectAssignmentsFetchOption.SAMPLES)) { for (MetaprojectAssignmentPE metaprojectAssignmentPE : getMetaprojectAssignments( - metaprojectPE, EntityKind.SAMPLE)) + metaproject.getId(), EntityKind.SAMPLE)) { if (authorizationUtils.canAccessSample(metaprojectAssignmentPE.getSample())) { @@ -3808,7 +3805,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt if (fetchOptions.contains(MetaprojectAssignmentsFetchOption.DATA_SETS)) { for (MetaprojectAssignmentPE metaprojectAssignmentPE : getMetaprojectAssignments( - metaprojectPE, EntityKind.DATA_SET)) + metaproject.getId(), EntityKind.DATA_SET)) { if (authorizationUtils.canAccessDataSet(metaprojectAssignmentPE.getDataSet())) { @@ -3825,7 +3822,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt if (fetchOptions.contains(MetaprojectAssignmentsFetchOption.MATERIALS)) { for (MetaprojectAssignmentPE metaprojectAssignmentPE : getMetaprojectAssignments( - metaprojectPE, EntityKind.MATERIAL)) + metaproject.getId(), EntityKind.MATERIAL)) { materials.add(MaterialTranslator.translate(metaprojectAssignmentPE.getMaterial(), null)); @@ -3900,7 +3897,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt @Override @RolesAllowed(RoleWithHierarchy.SPACE_USER) - public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId) + public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId, String reason) { if (metaprojectId == null) { @@ -3914,7 +3911,23 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt getAuthorizationService(session).checkAccessMetaproject(metaprojectBO.getMetaproject()); - metaprojectBO.deleteByMetaprojectId(metaprojectId); + metaprojectBO.deleteByMetaprojectId(metaprojectId, reason); + } + + @Override + @RolesAllowed(RoleWithHierarchy.SPACE_USER) + public void deleteMetaprojects(String sessionToken, List<IMetaprojectId> metaprojectIds, + String reason) + { + if (metaprojectIds == null) + { + throw new UserFailureException("Metaproject ids cannot be null"); + } + + for (IMetaprojectId metaprojectId : metaprojectIds) + { + deleteMetaproject(sessionToken, metaprojectId, reason); + } } @Override @@ -3977,7 +3990,9 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt return MetaprojectTranslator.translate(metaprojectPE); } - private MetaprojectPE getMetaproject(String sessionToken, IMetaprojectId metaprojectId) + @Override + @RolesAllowed(RoleWithHierarchy.SPACE_USER) + public Metaproject getMetaproject(String sessionToken, IMetaprojectId metaprojectId) { if (metaprojectId == null) { @@ -3997,14 +4012,13 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt AuthorizationServiceUtils authorizationUtils = getAuthorizationService(session); authorizationUtils.checkAccessMetaproject(metaprojectPE); - - return metaprojectPE; + return MetaprojectTranslator.translate(metaprojectPE); } - private Collection<MetaprojectAssignmentPE> getMetaprojectAssignments( - MetaprojectPE metaproject, EntityKind entityKind) + private Collection<MetaprojectAssignmentPE> getMetaprojectAssignments(Long metaprojectId, + EntityKind entityKind) { - return getDAOFactory().getMetaprojectDAO().listMetaprojectAssignments(metaproject.getId(), + return getDAOFactory().getMetaprojectDAO().listMetaprojectAssignments(metaprojectId, DtoConverters.convertEntityKind(entityKind)); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java index fe5759bdf2981ed2a202fd6222730827cb3b902a..2a32d9ca855035a3e2257cf08fb4a83f7f3fddc5 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java @@ -1570,6 +1570,13 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe return null; } + @Override + public Metaproject getMetaproject(String sessionToken, IMetaprojectId metaprojectId) + { + logAccess(sessionToken, "getMetaproject", "METAPROJECT_ID(%s)", metaprojectId); + return null; + } + @Override public MetaprojectAssignments getMetaprojectAssignments(String sessionToken, IMetaprojectId metaprojectId) @@ -1607,11 +1614,19 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe } @Override - public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId) + public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId, String reason) { logAccess(sessionToken, "deleteMetaproject", "METAPROJECT_ID(%s)", metaprojectId); } + @Override + public void deleteMetaprojects(String sessionToken, List<IMetaprojectId> metaprojectIds, + String reason) + { + logTracking(sessionToken, "deleteMetaprojects", "METAPROJECT_IDS(%s) REASON(%s)", + abbreviate(metaprojectIds), reason); + } + @Override public Metaproject registerMetaproject(String sessionToken, String name, String descriptionOrNull) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java index c0d257869c9e69e63dd2e6e094bb8a3705c5c807..5605bdf6b3c3a82990b7976c255fb62ebaa5af40 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java @@ -167,7 +167,7 @@ public class GeneralInformationChangingService extends @RolesAllowed(RoleWithHierarchy.SPACE_USER) public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId) { - server.deleteMetaproject(sessionToken, metaprojectId); + server.deleteMetaproject(sessionToken, metaprojectId, null); } @Override diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMetaprojectBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMetaprojectBO.java index f75ead62eeb39cb1ca0ca42cc429cd0f97ed004a..cd3949983ef0f644ae29f8ba885fcdc639f98fb9 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMetaprojectBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMetaprojectBO.java @@ -56,7 +56,8 @@ public interface IMetaprojectBO extends IEntityBusinessObject void removeMaterials(List<? extends IMaterialId> materials); - void deleteByMetaprojectId(IMetaprojectId metaprojectId) throws UserFailureException; + void deleteByMetaprojectId(IMetaprojectId metaprojectId, String reason) + throws UserFailureException; MetaprojectPE getMetaproject(); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MetaprojectBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MetaprojectBO.java index 99d4d9d83e25f6e56d02b11f8ecb12d0894db243..8a2c7e941c5fa6624997aa830aeecb0e35175049 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MetaprojectBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MetaprojectBO.java @@ -216,15 +216,17 @@ public class MetaprojectBO extends AbstractBusinessObject implements IMetaprojec } @Override - public void deleteByMetaprojectId(IMetaprojectId metaprojectId) throws UserFailureException + public void deleteByMetaprojectId(IMetaprojectId metaprojectId, String reason) + throws UserFailureException { loadByMetaprojectId(metaprojectId); getMetaprojectDAO().delete(metaproject); - getEventDAO().persist(createDeletionEvent(metaproject, session.tryGetPerson())); + getEventDAO().persist(createDeletionEvent(metaproject, session.tryGetPerson(), reason)); } - private static EventPE createDeletionEvent(MetaprojectPE metaproject, PersonPE registrator) + private static EventPE createDeletionEvent(MetaprojectPE metaproject, PersonPE registrator, + String reason) { EventPE event = new EventPE(); event.setEventType(EventType.DELETION); @@ -232,6 +234,7 @@ public class MetaprojectBO extends AbstractBusinessObject implements IMetaprojec event.setIdentifiers(Collections.singletonList(metaproject.getName())); event.setDescription(metaproject.getName()); event.setRegistrator(registrator); + event.setReason(reason); return event; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java index 18a51b259393de3a0cb0cd0b4b08d7d724d2da24..eb03705d23647ecaa11239ee216d5fc1a9c0a5da 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java @@ -1440,6 +1440,12 @@ public interface ICommonServer extends IServer public MetaprojectAssignments getMetaprojectAssignments(String sessionToken, IMetaprojectId metaprojectId, EnumSet<MetaprojectAssignmentsFetchOption> fetchOptions); + /** + * Returns metaproject. + */ + @Transactional(readOnly = true) + public Metaproject getMetaproject(String sessionToken, IMetaprojectId metaprojectId); + /** * Adds specified entities to given metaproject. */ @@ -1461,7 +1467,15 @@ public interface ICommonServer extends IServer */ @Transactional @DatabaseCreateOrDeleteModification(value = ObjectKind.METAPROJECT) - public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId); + public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId, String reason); + + /** + * Deletes given metaprojects. + */ + @Transactional + @DatabaseCreateOrDeleteModification(value = ObjectKind.METAPROJECT) + public void deleteMetaprojects(String sessionToken, List<IMetaprojectId> metaprojectIds, + String reason); /** * Registers a new metaproject. diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js index 997a90e93cc62718dcfd457a8b02a57c7bc1859d..5fd1bd3f3c9829b88858d52fe895a1aa06f34056 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js +++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js @@ -60,6 +60,7 @@ var common = { add_unofficial_vocabulary_term_dialog_title: "Add Ad Hoc Term", breadcrumbs_separator: "»", storage_confirmation: "Storage Confirmed", + metaproject: "Metaproject", metaprojects: "Metaprojects", metaprojects_hint: "List of metaprojects names separated by commas (\",\") or one metaproject name per line.", add_metaproject: "Add Metaproject...", @@ -179,6 +180,7 @@ var common = { button_delete_material: "Delete Material", button_delete_data_set: "Delete Data Set", button_delete_project: "Delete Project", + button_delete_metaproject: "Delete Metaproject", button_configure: "Settings", button_filters: "Filters", button_upload_data_via_cifex: "Upload Data", diff --git a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Metaproject.java b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Metaproject.java index 67f4ac183dd38af9a4b5468fe2240d04968fb39f..145b93430806713760c8b09e30e808eb93acd41e 100644 --- a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Metaproject.java +++ b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Metaproject.java @@ -20,13 +20,13 @@ import java.io.Serializable; import java.util.Date; import ch.systemsx.cisd.base.annotation.JsonObject; -import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder; +import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder; /** * @author Pawel Glyzewski */ @JsonObject("Metaproject") -public class Metaproject implements Serializable, IIdHolder +public class Metaproject implements Serializable, IIdAndCodeHolder { private static final long serialVersionUID = ServiceVersionHolder.VERSION; @@ -72,6 +72,12 @@ public class Metaproject implements Serializable, IIdHolder } } + @Override + public String getCode() + { + return getName(); + } + public String getName() { return name;