Changeset 5475


Ignore:
Timestamp:
07/11/14 14:05:50 (10 years ago)
Author:
Twan Goosen
Message:

Added PageParameters? constructor to VC details page to make URL bookmarkable.
Fixes #591

Location:
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/gui
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/gui/Application.java

    r5436 r5475  
    99import eu.clarin.cmdi.virtualcollectionregistry.gui.pages.EditVirtualCollectionPage;
    1010import eu.clarin.cmdi.virtualcollectionregistry.gui.pages.LoginPage;
     11import eu.clarin.cmdi.virtualcollectionregistry.gui.pages.VirtualCollectionDetailsPage;
    1112import java.io.BufferedReader;
    1213import java.io.FileInputStream;
     
    7475        mountBookmarkablePage("/admin", AdminPage.class);
    7576
     77        // details of an existing collection by ID, e.g. /details/123
     78        mount(new MixedParamHybridUrlCodingStrategy("/details",
     79                VirtualCollectionDetailsPage.class, new String[]{VirtualCollectionDetailsPage.PARAM_VC_ID}));
    7680        // editing an existing collection by ID, e.g. /edit/123
    7781        mount(new MixedParamHybridUrlCodingStrategy("/edit",
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/gui/ApplicationSession.java

    r5472 r5475  
    33import de.mpg.aai.shhaa.model.AuthAttribute;
    44import de.mpg.aai.shhaa.model.AuthPrincipal;
     5import eu.clarin.cmdi.virtualcollectionregistry.model.User;
    56import java.security.Principal;
    67import java.util.regex.Pattern;
     
    6970    }
    7071
     72    /**
     73     *
     74     * @param user user to check for
     75     * @return whether the specified user is the user currently signed in (false
     76     * if {@link #isSignedIn() } returns false)
     77     */
     78    public boolean isCurrentUser(User user) {
     79        return isSignedIn() && getUser().equals(user.getName());
     80    }
     81
    7182    public String getUser() {
    7283        return user;
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/gui/pages/BasePage.java

    r5417 r5475  
    8383    }
    8484
     85    @Override
     86    public ApplicationSession getSession() {
     87        return (ApplicationSession) super.getSession();
     88    }
     89   
     90   
     91
    8592} // class BasePage
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/gui/pages/BrowsePrivateCollectionsPage.java

    r5440 r5475  
    11package eu.clarin.cmdi.virtualcollectionregistry.gui.pages;
    2 
    32
    43import org.apache.wicket.Component;
     
    255254    }
    256255
    257     private void doDetails(AjaxRequestTarget target,
    258             IModel<VirtualCollection> vc) {
    259         setResponsePage(new VirtualCollectionDetailsPage(vc, getPage()));
    260     }
    261 
     256    private void doDetails(AjaxRequestTarget target, IModel<VirtualCollection> vc) {
     257        setResponsePage(VirtualCollectionDetailsPage.class, VirtualCollectionDetailsPage.createPageParameters(vc.getObject(), getPageReference()));
     258    }
    262259
    263260} // class BrowsePrivateCollectionsPage
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/gui/pages/BrowsePublicCollectionsPage.java

    r1011 r5475  
    1111@SuppressWarnings("serial")
    1212public class BrowsePublicCollectionsPage extends BasePage {
     13
    1314    private class ActionsPanel extends Panel {
     15
    1416        public ActionsPanel(String id, IModel<VirtualCollection> model) {
    1517            super(id, model);
    1618            setRenderBodyOnly(true);
    1719
    18             final AjaxLink<VirtualCollection> detailsLink =
    19                 new AjaxLink<VirtualCollection>("details", model) {
    20                 @Override
    21                 public void onClick(AjaxRequestTarget target) {
    22                     doDetails(target, getModel());
    23                 }
    24             };
     20            final AjaxLink<VirtualCollection> detailsLink
     21                    = new AjaxLink<VirtualCollection>("details", model) {
     22                        @Override
     23                        public void onClick(AjaxRequestTarget target) {
     24                            doDetails(target, getModel());
     25                        }
     26                    };
    2527            add(detailsLink);
    2628        }
     
    2931    public BrowsePublicCollectionsPage() {
    3032        super();
    31         final VirtualCollectionTable table =
    32             new VirtualCollectionTable("collectionsTable", false) {
    33                 @Override
    34                 protected Panel createActionColumn(String componentId,
    35                         IModel<VirtualCollection> model) {
    36                     return new ActionsPanel(componentId, model);
    37                 }
     33        final VirtualCollectionTable table
     34                = new VirtualCollectionTable("collectionsTable", false) {
     35                    @Override
     36                    protected Panel createActionColumn(String componentId,
     37                            IModel<VirtualCollection> model) {
     38                        return new ActionsPanel(componentId, model);
     39                    }
    3840
    39                 @Override
    40                 protected Panel createActionPanel(String componentId,
    41                         IModel<VirtualCollection> model) {
    42                     return new ActionsPanel(componentId, model);
    43                 }
    44         };
     41                    @Override
     42                    protected Panel createActionPanel(String componentId,
     43                            IModel<VirtualCollection> model) {
     44                        return new ActionsPanel(componentId, model);
     45                    }
     46                };
    4547        add(table);
    4648    }
    4749
    48     private void doDetails(AjaxRequestTarget target,
    49             IModel<VirtualCollection> vc) {
    50         setResponsePage(new VirtualCollectionDetailsPage(vc, getPage()));
     50    private void doDetails(AjaxRequestTarget target, IModel<VirtualCollection> vc) {
     51        setResponsePage(VirtualCollectionDetailsPage.class, VirtualCollectionDetailsPage.createPageParameters(vc.getObject(), getPageReference()));
    5152    }
    5253
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/gui/pages/VirtualCollectionDetailsPage.java

    r5440 r5475  
    11package eu.clarin.cmdi.virtualcollectionregistry.gui.pages;
    22
     3import eu.clarin.cmdi.virtualcollectionregistry.gui.Application;
    34import eu.clarin.cmdi.virtualcollectionregistry.gui.DateConverter;
     5import eu.clarin.cmdi.virtualcollectionregistry.gui.DetachableVirtualCollectionModel;
    46import eu.clarin.cmdi.virtualcollectionregistry.gui.VolatileEntityModel;
     7import eu.clarin.cmdi.virtualcollectionregistry.gui.border.AjaxToggleBorder;
     8import eu.clarin.cmdi.virtualcollectionregistry.model.Creator;
     9import eu.clarin.cmdi.virtualcollectionregistry.model.Resource;
     10import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection;
     11import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection.Type;
    512import java.sql.Date;
    613import java.util.Collection;
     
    916import java.util.List;
    1017import java.util.Locale;
    11 
    12 import org.apache.wicket.Application;
    1318import org.apache.wicket.Component;
     19import org.apache.wicket.IPageMap;
    1420import org.apache.wicket.Page;
     21import org.apache.wicket.PageParameters;
     22import org.apache.wicket.PageReference;
     23import org.apache.wicket.Session;
     24import org.apache.wicket.authorization.Action;
     25import org.apache.wicket.authorization.AuthorizationException;
     26import org.apache.wicket.authorization.UnauthorizedActionException;
    1527import org.apache.wicket.behavior.AbstractBehavior;
    1628import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
     
    3850import org.apache.wicket.util.string.Strings;
    3951
    40 import eu.clarin.cmdi.virtualcollectionregistry.gui.border.AjaxToggleBorder;
    41 import eu.clarin.cmdi.virtualcollectionregistry.model.Creator;
    42 import eu.clarin.cmdi.virtualcollectionregistry.model.Resource;
    43 import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection;
    44 import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection.Type;
    45 
    46 
    4752@SuppressWarnings("serial")
    4853public class VirtualCollectionDetailsPage extends BasePage {
     54
     55    public static final String PARAM_VC_ID = "id";
     56    public static final String PARAM_BACK_PAGE_ID = "backPage";
     57    public static final String PARAM_BACK_PAGE_VERSION = "backPageVersion";
     58    public static final String PARAM_BACK_PAGE_PAGEMAP_NAME = "backPageMapName";
     59
    4960    private static final IConverter convEnum = new IConverter() {
    5061        @Override
    5162        public String convertToString(Object o, Locale locale) {
    5263            final Enum<?> enumObj = (Enum<?>) o;
    53             final String key =
    54                 enumObj.getDeclaringClass().getSimpleName() + "." +
    55                 enumObj.name();
     64            final String key
     65                    = enumObj.getDeclaringClass().getSimpleName() + "."
     66                    + enumObj.name();
    5667            final String value = Application.get().getResourceSettings()
    5768                    .getLocalizer().getString(key, null);
     
    7586     */
    7687    private static final class HideIfEmptyBehavior extends AbstractBehavior {
     88
    7789        private final List<Component> components = new LinkedList<Component>();
    7890
     
    8597        public void hideEmptyComponents() {
    8698            for (Component component : components) {
    87               Object obj = component.getDefaultModelObject();
    88               if (obj == null) {
    89                   component.setVisible(false);
    90               } else {
    91                   if (obj instanceof Collection<?>) {
    92                       if (((Collection<?>) obj).isEmpty()) {
    93                           component.setVisible(false);
    94                       }
    95                   }
    96               }
     99                Object obj = component.getDefaultModelObject();
     100                if (obj == null) {
     101                    component.setVisible(false);
     102                } else {
     103                    if (obj instanceof Collection<?>) {
     104                        if (((Collection<?>) obj).isEmpty()) {
     105                            component.setVisible(false);
     106                        }
     107                    }
     108                }
    97109            }
    98110        }
     
    113125        @Override
    114126        public IConverter getConverter(Class<?> type) {
    115             if (VirtualCollection.Type.class.isAssignableFrom(type) ||
    116                 VirtualCollection.Purpose.class.isAssignableFrom(type) ||
    117                 VirtualCollection.Reproducibility.class.isAssignableFrom(type)) {
     127            if (VirtualCollection.Type.class.isAssignableFrom(type)
     128                    || VirtualCollection.Purpose.class.isAssignableFrom(type)
     129                    || VirtualCollection.Reproducibility.class.isAssignableFrom(type)) {
    118130                return convEnum;
    119131            }
     
    125137    } // class VirtualCollectionDetailsPage.TypeLabel
    126138
    127 
    128139    private final HideIfEmptyBehavior hideIfEmpty = new HideIfEmptyBehavior();
    129140
    130 
    131     public VirtualCollectionDetailsPage(final IModel<VirtualCollection> model,
    132             final Page previousPage) {
     141    public VirtualCollectionDetailsPage(PageParameters params) {
     142        this(getVirtualCollectionModel(params), getPageReference(params));
     143    }
     144
     145    public VirtualCollectionDetailsPage(final IModel<VirtualCollection> model, final PageReference previousPage) {
    133146        super(new CompoundPropertyModel<VirtualCollection>(model));
    134         if (previousPage == null) {
    135             throw new IllegalArgumentException("previousPage == null");
    136         }
     147        if (model == null) {
     148            setResponsePage(Application.get().getHomePage());
     149        } else {
     150            checkAccess(model.getObject());
     151        }
     152
    137153        final Link<Void> backLink = new Link<Void>("back") {
    138154            @Override
    139155            public void onClick() {
    140                 setResponsePage(previousPage);
     156                if (previousPage == null) {
     157                    setResponsePage(getApplication().getHomePage());
     158                } else {
     159                    setResponsePage(previousPage.getPage());
     160                }
    141161            }
    142162        };
     
    173193                item.add(new Label("email").add(hideIfEmpty));
    174194                item.add(new Label("telephone").add(hideIfEmpty));
    175                 final IModel<String> siteModel =
    176                     new ComponentPropertyModel<String>("website");
     195                final IModel<String> siteModel
     196                        = new ComponentPropertyModel<String>("website");
    177197                item.add(new ExternalLink("website", siteModel, siteModel)
    178198                        .setPopupSettings(new PopupSettings())
     
    191211            @Override
    192212            protected ListItem<Creator> newItem(int index) {
    193                 final IModel<Creator> model =
    194                     getListItemModel(getModel(), index);
     213                final IModel<Creator> model
     214                        = getListItemModel(getModel(), index);
    195215                return new OddEvenListItem<Creator>(index, model) {
    196216                    @Override
     
    213233        cols[0] = new PropertyColumn<Resource>(
    214234                new Model<String>("Type"), "type") {
    215             @Override
    216             public void populateItem(Item<ICellPopulator<Resource>> item,
    217                     String componentId, IModel<Resource> model) {
    218                 final Resource.Type type = model.getObject().getType();
    219                 item.add(new Label(componentId,
    220                         convEnum.convertToString(type, getLocale())));
    221             }
    222         };
     235                    @Override
     236                    public void populateItem(Item<ICellPopulator<Resource>> item,
     237                            String componentId, IModel<Resource> model) {
     238                        final Resource.Type type = model.getObject().getType();
     239                        item.add(new Label(componentId,
     240                                        convEnum.convertToString(type, getLocale())));
     241                    }
     242                };
    223243        cols[1] = new PropertyColumn<Resource>(
    224244                new Model<String>("Reference"), "ref");
    225245
    226246        @SuppressWarnings("unchecked")
    227         final DataTable<Resource> resourcesTable =
    228             new AjaxFallbackDefaultDataTable<Resource>("resourcesTable",
    229                     cols,
    230                     new SortableDataProvider<Resource>() {
    231                         @Override
    232                         public Iterator<? extends Resource>
     247        final DataTable<Resource> resourcesTable
     248                = new AjaxFallbackDefaultDataTable<Resource>("resourcesTable",
     249                        cols,
     250                        new SortableDataProvider<Resource>() {
     251                            @Override
     252                            public Iterator<? extends Resource>
    233253                            iterator(int first, int count) {
    234                             return model.getObject().getResources().listIterator(first);
    235                         }
    236 
    237                         @Override
    238                         public IModel<Resource> model(Resource resource) {
    239                             return new VolatileEntityModel<Resource>(resource);
    240                         }
    241 
    242                         @Override
    243                         public int size() {
    244                             return model.getObject().getResources().size();
    245                         }
    246                     },
    247                     64);
     254                                return model.getObject().getResources().listIterator(first);
     255                            }
     256
     257                            @Override
     258                            public IModel<Resource> model(Resource resource) {
     259                                return new VolatileEntityModel<Resource>(resource);
     260                            }
     261
     262                            @Override
     263                            public int size() {
     264                                return model.getObject().getResources().size();
     265                            }
     266                        },
     267                        64);
    248268        resources.add(resourcesTable);
    249269        resources.setVisible(model.getObject().getType() == Type.EXTENSIONAL);
     
    259279    }
    260280
     281    private static IModel<VirtualCollection> getVirtualCollectionModel(PageParameters params) {
     282        final Long collectionId = params.getAsLong(PARAM_VC_ID);
     283        if (collectionId == null) {
     284            Session.get().error("Collection could not be retrieved, id not provided");
     285            return null;
     286        }
     287        return new DetachableVirtualCollectionModel(collectionId);
     288    }
     289
     290    private static PageReference getPageReference(PageParameters params) {
     291        final Integer pageId = params.getAsInteger(PARAM_BACK_PAGE_ID);
     292        final Integer pageVersion = params.getAsInteger(PARAM_BACK_PAGE_VERSION);
     293        final String pageMap = params.getString(PARAM_BACK_PAGE_PAGEMAP_NAME);
     294        if (pageId != null && pageVersion != null) {
     295            for (IPageMap map : Session.get().getPageMaps()) {
     296                if (pageMap == null && map.getName() == null || pageMap != null && pageMap.equals(map.getName())) {
     297                    final Page page = map.get(pageId, pageVersion);
     298                    if (page != null) {
     299                        return page.getPageReference();
     300                    }
     301                }
     302            }
     303        }
     304        return null;
     305    }
     306
     307    public static PageParameters createPageParameters(VirtualCollection vc, PageReference pageReference) {
     308        final PageParameters params = new PageParameters();
     309        params.put(VirtualCollectionDetailsPage.PARAM_VC_ID, vc.getId());
     310
     311        if (pageReference != null) {
     312            params.put(VirtualCollectionDetailsPage.PARAM_BACK_PAGE_ID, pageReference.getPageNumber());
     313            params.put(VirtualCollectionDetailsPage.PARAM_BACK_PAGE_VERSION, pageReference.getPageVersion());
     314            if (pageReference.getPageMapName() != null) {
     315                params.put(VirtualCollectionDetailsPage.PARAM_BACK_PAGE_PAGEMAP_NAME, pageReference.getPageMapName());
     316            }
     317        }
     318        return params;
     319    }
     320
     321    /**
     322     *
     323     * @param vc collection to check for
     324     * @throws UnauthorizedActionException if the VC is private and the current
     325     * user is not the owner
     326     */
     327    private void checkAccess(final VirtualCollection vc) throws UnauthorizedActionException {
     328        if (vc.isPrivate()
     329                && !getSession().isCurrentUser(vc.getOwner())) {
     330            // user trying to access other user's collection
     331            throw new UnauthorizedActionException(this, Component.RENDER);
     332        }
     333    }
     334
    261335    @Override
    262336    protected void onBeforeRender() {
Note: See TracChangeset for help on using the changeset viewer.