Java tutorial
/********************************************************************************** * $URL$ * $Id$ *********************************************************************************** * * Copyright (c) 2011 The Sakai Foundation * * Licensed under the Educational Community 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.osedu.org/licenses/ECL-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 org.sakaiproject.dash.tool.panels; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.markup.html.link.ExternalLink; import org.apache.wicket.markup.html.navigation.paging.IPagingLabelProvider; import org.apache.wicket.markup.html.navigation.paging.PagingNavigator; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.DefaultItemReuseStrategy; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.IDataProvider; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.sakaiproject.dash.app.DashboardCommonLogic; import org.sakaiproject.dash.app.DashboardConfig; import org.sakaiproject.dash.logic.DashboardLogic; import org.sakaiproject.dash.app.SakaiProxy; import org.sakaiproject.dash.model.NewsItem; import org.sakaiproject.dash.model.NewsLink; import org.sakaiproject.dash.tool.util.JsonHelper; import org.sakaiproject.dash.util.DateUtil; import org.sakaiproject.util.FormattedText; import org.sakaiproject.util.ResourceLoader; /** * * */ public class NewsLinksPanel extends Panel { public static final String TAB_ID_CURRENT = "current"; public static final String TAB_ID_STARRED = "starred"; public static final String TAB_ID_HIDDEN = "hidden"; private static final Logger logger = Logger.getLogger(NewsLinksPanel.class); protected static final String DATE_FORMAT = "dd-MMM-yyyy"; protected static final String TIME_FORMAT = "HH:mm"; protected static final String DATETIME_FORMAT = "dd-MMM-yyyy HH:mm"; @SpringBean(name = "org.sakaiproject.dash.app.SakaiProxy") protected SakaiProxy sakaiProxy; @SpringBean(name = "org.sakaiproject.dash.app.DashboardCommonLogic") protected DashboardCommonLogic dashboardCommonLogic; @SpringBean(name = "org.sakaiproject.dash.app.DashboardConfig") protected DashboardConfig dashboardConfig; protected NewsLinksDataProvider newsLinksProvider = null; protected String selectedNewsTab; protected String newsLinksDivId = null; protected String newsLinksCountId = null; //protected int pageSize = 5; protected int pageSize = dashboardConfig.getConfigValue(DashboardConfig.PROP_DEFAULT_ITEMS_IN_PANEL, 5); public NewsLinksPanel(String id) { super(id); initPanel(); } public NewsLinksPanel(String id, String selectedTab) { super(id); this.selectedNewsTab = selectedTab; initPanel(); } protected void initPanel() { if (this.selectedNewsTab == null) { this.selectedNewsTab = TAB_ID_CURRENT; } if (this.newsLinksDivId != null) { this.remove(newsLinksDivId); } ResourceLoader rl = new ResourceLoader("dash_entity"); //get list of items from db, wrapped in a dataprovider newsLinksProvider = new NewsLinksDataProvider(this.selectedNewsTab); final WebMarkupContainer newsLinksDiv = new WebMarkupContainer("newsLinksDiv"); newsLinksDiv.setOutputMarkupId(true); add(newsLinksDiv); this.newsLinksDivId = newsLinksDiv.getId(); newsLinksDiv.add(new Label("newsTitle", rl.getString("dash.news.title"))); AjaxLink<IModel<List<NewsLink>>> currentNewsLink = new AjaxLink<IModel<List<NewsLink>>>("link") { @Override public void onClick(AjaxRequestTarget target) { if (logger.isDebugEnabled()) { logger.debug("currentNewsLink onClick called"); } // set currentNewsTab to "current" selectedNewsTab = TAB_ID_CURRENT; // reset news dataview to show current stuff if (newsLinksProvider == null) { newsLinksProvider = new NewsLinksDataProvider(selectedNewsTab); } else { newsLinksProvider.setNewsTab(selectedNewsTab); dashboardCommonLogic.recordDashboardActivity(DashboardCommonLogic.EVENT_DASH_TABBING, "/dashboard/news/" + selectedNewsTab); } initPanel(); // refresh newsLinksDiv target.addComponent(NewsLinksPanel.this); target.appendJavascript("resizeFrame('grow');"); target.appendJavascript("$('#newsPanel').focus();"); } }; currentNewsLink.add(new Label("label", rl.getString("dash.news.current"))); WebMarkupContainer currentNewsTab = new WebMarkupContainer("currentNewsTab"); if (selectedNewsTab == null || TAB_ID_CURRENT.equalsIgnoreCase(selectedNewsTab)) { currentNewsTab.add(new SimpleAttributeModifier("class", "activeTab")); } currentNewsTab.add(currentNewsLink); newsLinksDiv.add(currentNewsTab); AjaxLink<IModel<List<NewsLink>>> starredNewsLink = new AjaxLink<IModel<List<NewsLink>>>("link") { @Override public void onClick(AjaxRequestTarget target) { if (logger.isDebugEnabled()) { logger.debug("starredNewsLink onClick called"); } // set currentNewsTab to "starred" selectedNewsTab = TAB_ID_STARRED; // reset news dataview to show starred stuff if (newsLinksProvider == null) { newsLinksProvider = new NewsLinksDataProvider(selectedNewsTab); } else { newsLinksProvider.setNewsTab(selectedNewsTab); dashboardCommonLogic.recordDashboardActivity(DashboardCommonLogic.EVENT_DASH_TABBING, "/dashboard/news/" + selectedNewsTab); } initPanel(); // refresh newsLinksDiv target.addComponent(NewsLinksPanel.this); target.appendJavascript("resizeFrame('grow');"); target.appendJavascript("$('#newsPanel').focus();"); } }; starredNewsLink.add(new Label("label", rl.getString("dash.news.starred"))); WebMarkupContainer starredNewsTab = new WebMarkupContainer("starredNewsTab"); if (selectedNewsTab != null && TAB_ID_STARRED.equalsIgnoreCase(selectedNewsTab)) { starredNewsTab.add(new SimpleAttributeModifier("class", "activeTab")); } starredNewsTab.add(starredNewsLink); newsLinksDiv.add(starredNewsTab); AjaxLink<IModel<List<NewsLink>>> hiddenNewsLink = new AjaxLink<IModel<List<NewsLink>>>("link") { @Override public void onClick(AjaxRequestTarget target) { if (logger.isDebugEnabled()) { logger.debug("hiddenNewsLink onClick called"); } // set currentNewsTab to "hidden" selectedNewsTab = TAB_ID_HIDDEN; // reset news dataview to show hidden stuff if (newsLinksProvider == null) { newsLinksProvider = new NewsLinksDataProvider(selectedNewsTab); } else { newsLinksProvider.setNewsTab(selectedNewsTab); dashboardCommonLogic.recordDashboardActivity(DashboardCommonLogic.EVENT_DASH_TABBING, "/dashboard/news/" + selectedNewsTab); } initPanel(); // refresh newsLinksDiv target.addComponent(NewsLinksPanel.this); target.appendJavascript("resizeFrame('grow');"); target.appendJavascript("$('#newsPanel').focus();"); } }; hiddenNewsLink.add(new Label("label", rl.getString("dash.news.hidden"))); WebMarkupContainer hiddenNewsTab = new WebMarkupContainer("hiddenNewsTab"); if (selectedNewsTab != null && TAB_ID_HIDDEN.equalsIgnoreCase(selectedNewsTab)) { hiddenNewsTab.add(new SimpleAttributeModifier("class", "activeTab")); } hiddenNewsTab.add(hiddenNewsLink); newsLinksDiv.add(hiddenNewsTab); WebMarkupContainer haveLinks = new WebMarkupContainer("haveLinks"); newsLinksDiv.add(haveLinks); //present the news data in a table final DataView<NewsLink> newsDataView = new DataView<NewsLink>("newsLinks", newsLinksProvider) { @Override public void populateItem(final Item item) { item.setOutputMarkupId(true); ResourceLoader rl = new ResourceLoader("dash_entity"); final NewsLink nLink = (NewsLink) item.getModelObject(); final NewsItem nItem = nLink.getNewsItem(); if (logger.isDebugEnabled()) { logger.debug(this + "populateItem() item: " + item); } boolean hideActionLinks = nItem.getItemCount() > 1; String itemType = nItem.getSourceType().getIdentifier(); item.add(new Label("itemType", itemType)); item.add(new Label("itemCount", Integer.toString(nItem.getItemCount()))); item.add(new Label("entityReference", nItem.getEntityReference())); String siteTitle = nItem.getContext().getContextTitle(); StringBuilder errorMessages = new StringBuilder(); String title = FormattedText.processFormattedText(nItem.getTitle(), errorMessages, true, true); if (errorMessages != null && errorMessages.length() > 0) { logger.warn("Error(s) encountered while processing newsItem title:\n" + errorMessages); } ExternalLink itemLink = new ExternalLink("itemLink", "#itemEvent"); itemLink.add(new Label("itemTitle", title)); itemLink.add(new Label("itemClick", rl.getString("dash.details"))); item.add(itemLink); Image icon = new Image("icon"); icon.add(new AttributeModifier("src", true, new AbstractReadOnlyModel() { @Override public Object getObject() { // TODO Auto-generated method stub return dashboardCommonLogic.getEntityIconUrl(nItem.getSourceType().getIdentifier(), nItem.getSubtype()); } })); item.add(icon); String newsItemLabel = dashboardCommonLogic.getString(nItem.getNewsTimeLabelKey(), "", itemType); if (newsItemLabel == null || hideActionLinks) { newsItemLabel = ""; } Label itemLabel = new Label("itemLabel", newsItemLabel); if (!"".equals(newsItemLabel)) { itemLabel.add(new SimpleAttributeModifier("class", "itemLabel")); } item.add(itemLabel); item.add(new ExternalLink("siteLink", nItem.getContext().getContextUrl(), siteTitle)); Component timeLabel = new Label("newsTime", DateUtil.getNewsTimeString(nItem.getNewsTime())); timeLabel.add(new AttributeModifier("title", true, new AbstractReadOnlyModel() { @Override public Object getObject() { // TODO Auto-generated method stub return DateUtil.getFullDateString(nItem.getNewsTime()); } })); item.add(timeLabel); if (nLink.isSticky()) { AjaxLink<NewsLink> starringAction = new AjaxLink<NewsLink>("starringAction") { protected long newsItemId = nItem.getId(); protected Component thisRow = item; @Override public void onClick(AjaxRequestTarget target) { logger.debug("starringAction onClick() called -- unstar "); // need to keep one item logger.debug(newsItemId); //logger.debug(this.getModelObject()); String sakaiUserId = sakaiProxy.getCurrentUserId(); boolean success = dashboardCommonLogic.unkeepNewsItem(sakaiUserId, newsItemId); dashboardCommonLogic.recordDashboardActivity(DashboardCommonLogic.EVENT_DASH_UNSTAR, "/dashboard/news/" + selectedNewsTab + "/" + newsItemId); // if success adjust UI, else report failure? if (success) { target.addComponent(NewsLinksPanel.this); if (TAB_ID_STARRED.equals(selectedNewsTab)) { ResourceLoader rl = new ResourceLoader("dash_entity"); NewsItem changedItem = dashboardCommonLogic.getNewsItem(newsItemId); JsonHelper jsonHelper = new JsonHelper(dashboardCommonLogic, dashboardConfig); String jsonStr = jsonHelper.getJsonObjectFromNewsItem(changedItem).toString(); String javascript = "reportSuccess('" + rl.getString("dash.ajax.unstar.success") + "'," + jsonStr + ",'" + "not-sure-about-url-yet" + "');"; target.appendJavascript(javascript); } target.appendJavascript("resizeFrame('grow');"); target.appendJavascript("$('#newsPanel').focus();"); } } }; starringAction.setDefaultModel(item.getModel()); item.add(starringAction); Image starringActionIcon = new Image("starringActionIcon"); starringActionIcon.add(new AttributeModifier("src", true, new AbstractReadOnlyModel() { @Override public Object getObject() { return dashboardConfig.getActionIcon(dashboardConfig.ACTION_UNSTAR); } })); starringActionIcon.add(new AttributeModifier("alt", true, new AbstractReadOnlyModel() { @Override public Object getObject() { ResourceLoader rl = new ResourceLoader("dash_entity"); return rl.getString("dash.unstar"); } })); starringAction.add(starringActionIcon); //starringAction.add(new Label("starringActionLabel", "Unstar")); if (nLink.isHidden() || hideActionLinks) { starringAction.setVisible(false); starringAction.setVisibilityAllowed(false); } } else { AjaxLink<NewsLink> starringAction = new AjaxLink<NewsLink>("starringAction") { protected long newsItemId = nItem.getId(); protected Component thisRow = item; @Override public void onClick(AjaxRequestTarget target) { logger.debug("starringAction onClick() called -- star "); // need to keep one item logger.debug(newsItemId); //logger.debug(this.getModelObject()); String sakaiUserId = sakaiProxy.getCurrentUserId(); boolean success = dashboardCommonLogic.keepNewsItem(sakaiUserId, newsItemId); dashboardCommonLogic.recordDashboardActivity(DashboardCommonLogic.EVENT_DASH_STAR, "/dashboard/news/" + selectedNewsTab + "/" + newsItemId); // if success adjust UI, else report failure? if (success) { target.addComponent(NewsLinksPanel.this); //String javascript = "alert('success. (" + thisRow.getMarkupId() + ")');"; //target.appendJavascript(javascript ); } target.appendJavascript("resizeFrame('grow');"); target.appendJavascript("$('#newsPanel').focus();"); } }; Image starringActionIcon = new Image("starringActionIcon"); starringActionIcon.add(new AttributeModifier("src", true, new AbstractReadOnlyModel() { @Override public Object getObject() { return dashboardConfig.getActionIcon(dashboardConfig.ACTION_STAR); } })); starringActionIcon.add(new AttributeModifier("alt", true, new AbstractReadOnlyModel() { @Override public Object getObject() { ResourceLoader rl = new ResourceLoader("dash_entity"); return rl.getString("dash.star"); } })); starringAction.add(starringActionIcon); // starringAction.add(new Label("starringActionLabel", "Star")); item.add(starringAction); if (nLink.isHidden() || hideActionLinks) { starringAction.setVisible(false); starringAction.setVisibilityAllowed(false); } } if (nLink.isHidden()) { AjaxLink<NewsLink> hidingAction = new AjaxLink<NewsLink>("hidingAction") { protected long newsItemId = nItem.getId(); protected Component thisRow = item; @Override public void onClick(AjaxRequestTarget target) { logger.debug("hidingAction onClick() called -- show"); // need to trash one item logger.debug(newsItemId); //logger.debug(this.getModelObject()); String sakaiUserId = sakaiProxy.getCurrentUserId(); boolean success = dashboardCommonLogic.unhideNewsItem(sakaiUserId, newsItemId); dashboardCommonLogic.recordDashboardActivity(DashboardCommonLogic.EVENT_DASH_SHOW, "/dashboard/news/" + selectedNewsTab + "/" + newsItemId); // if success adjust UI, else report failure? if (success) { ResourceLoader rl = new ResourceLoader("dash_entity"); target.addComponent(NewsLinksPanel.this); NewsItem changedItem = dashboardCommonLogic.getNewsItem(newsItemId); JsonHelper jsonHelper = new JsonHelper(dashboardCommonLogic, dashboardConfig); String jsonStr = jsonHelper.getJsonObjectFromNewsItem(changedItem).toString(); String javascript = "reportSuccess('" + rl.getString("dash.ajax.show.success") + "'," + jsonStr + ",'" + "not-sure-about-url-yet" + "');"; target.appendJavascript(javascript); } target.appendJavascript("resizeFrame('grow');"); target.appendJavascript("$('#newsPanel').focus();"); } }; hidingAction.setDefaultModel(item.getModel()); //actionHideThisLink.setModelObject(nItem); item.add(hidingAction); Image hidingActionIcon = new Image("hidingActionIcon"); hidingActionIcon.add(new AttributeModifier("src", true, new AbstractReadOnlyModel() { @Override public Object getObject() { return dashboardConfig.getActionIcon(dashboardConfig.ACTION_SHOW); } })); hidingActionIcon.add(new AttributeModifier("alt", true, new AbstractReadOnlyModel() { @Override public Object getObject() { ResourceLoader rl = new ResourceLoader("dash_entity"); return rl.getString("dash.show"); } })); hidingAction.add(hidingActionIcon); //hidingAction.add(new Label("hidingActionLabel", "Show")); if (nLink.isSticky() || hideActionLinks) { hidingAction.setVisible(false); hidingAction.setVisibilityAllowed(false); } } else { AjaxLink<NewsLink> hidingAction = new AjaxLink<NewsLink>("hidingAction") { protected long newsItemId = nItem.getId(); protected Component thisRow = item; @Override public void onClick(AjaxRequestTarget target) { logger.debug("hidingAction onClick() called -- hide"); // need to trash one item logger.debug(newsItemId); //logger.debug(this.getModelObject()); String sakaiUserId = sakaiProxy.getCurrentUserId(); boolean success = dashboardCommonLogic.hideNewsItem(sakaiUserId, newsItemId); dashboardCommonLogic.recordDashboardActivity(DashboardCommonLogic.EVENT_DASH_HIDE, "/dashboard/news/" + selectedNewsTab + "/" + newsItemId); // if success adjust UI, else report failure? if (success) { ResourceLoader rl = new ResourceLoader("dash_entity"); target.addComponent(NewsLinksPanel.this); NewsItem changedItem = dashboardCommonLogic.getNewsItem(newsItemId); JsonHelper jsonHelper = new JsonHelper(dashboardCommonLogic, dashboardConfig); String jsonStr = jsonHelper.getJsonObjectFromNewsItem(changedItem).toString(); String javascript = "reportSuccess('" + rl.getString("dash.ajax.hide.success") + "'," + jsonStr + ",'" + "not-sure-about-url-yet" + "');"; target.appendJavascript(javascript); } target.appendJavascript("resizeFrame('grow');"); target.appendJavascript("$('#newsPanel').focus();"); } }; hidingAction.setDefaultModel(item.getModel()); //actionHideThisLink.setModelObject(nItem); item.add(hidingAction); Image hidingActionIcon = new Image("hidingActionIcon"); hidingActionIcon.add(new AttributeModifier("src", true, new AbstractReadOnlyModel() { @Override public Object getObject() { return dashboardConfig.getActionIcon(dashboardConfig.ACTION_HIDE); } })); hidingActionIcon.add(new AttributeModifier("alt", true, new AbstractReadOnlyModel() { @Override public Object getObject() { ResourceLoader rl = new ResourceLoader("dash_entity"); return rl.getString("dash.hide"); } })); hidingAction.add(hidingActionIcon); //hidingAction.add(new Label("hidingActionLabel", "Hide")); if (nLink.isSticky() || hideActionLinks) { hidingAction.setVisible(false); hidingAction.setVisibilityAllowed(false); } } } }; newsDataView.setItemReuseStrategy(new DefaultItemReuseStrategy()); newsDataView.setItemsPerPage(pageSize); haveLinks.add(newsDataView); IPagingLabelProvider pagingLabelProvider = new IPagingLabelProvider() { public String getPageLabel(int page) { ResourceLoader rl = new ResourceLoader("dash_entity"); int itemCount = 0; String pagerStatus = ""; if (newsDataView != null) { int first = 0; int last = 0; itemCount = newsDataView.getItemCount(); int pageSize = newsDataView.getItemsPerPage(); if (itemCount > pageSize) { //int page = calendarDataView.getCurrentPage(); first = page * pageSize + 1; last = Math.min(itemCount, (page + 1) * pageSize); if (first == last) { pagerStatus = Integer.toString(first); } else { pagerStatus = rl.getFormattedMessage("dash.pager.range", new Object[] { new Integer(first), new Integer(last) }); } } else if (itemCount > 1) { pagerStatus = rl.getFormattedMessage("dash.pager.range", new Object[] { new Integer(1), new Integer(itemCount) }); } else if (itemCount > 0) { pagerStatus = "1"; } else { pagerStatus = "0"; } } if (logger.isDebugEnabled()) { logger.debug("getPageLabel() " + pagerStatus); } return pagerStatus; } }; //add a pager to our table, only visible if we have more than 5 items newsLinksDiv.add(new PagingNavigator("newsNavigator", newsDataView, pagingLabelProvider) { protected int currentPage = 1; @Override public boolean isVisible() { if (newsLinksProvider.size() > pageSize) { return true; } return false; } @Override public void onBeforeRender() { if (this.getPageable().getCurrentPage() != currentPage) { dashboardCommonLogic.recordDashboardActivity(DashboardCommonLogic.EVENT_DASH_PAGING, "/dashboard/news/" + selectedNewsTab); currentPage = this.getPageable().getCurrentPage(); } //renderItemCounter(newsLinksDiv, newsDataView); //clear the feedback panel messages //clearFeedback(feedbackPanel); super.onBeforeRender(); } }); WebMarkupContainer haveNoLinks = new WebMarkupContainer("haveNoLinks"); newsLinksDiv.add(haveNoLinks); String noNewsLinksLabel = null; if (TAB_ID_CURRENT.equals(selectedNewsTab)) { noNewsLinksLabel = rl.getString("dash.news.nocurrent"); } else if (TAB_ID_STARRED.equals(selectedNewsTab)) { noNewsLinksLabel = rl.getString("dash.news.nostarred"); } else if (TAB_ID_HIDDEN.equals(selectedNewsTab)) { noNewsLinksLabel = rl.getString("dash.news.nohidden"); } haveNoLinks.add(new Label("message", noNewsLinksLabel)); //renderItemCounter(newsLinksDiv, newsDataView); int itemCount = 0; if (newsDataView != null) { itemCount = newsDataView.getItemCount(); } if (itemCount > 0) { // show the haveLinks haveLinks.setVisible(true); // hide the noNewsLinksDiv haveNoLinks.setVisible(false); } else { // show the noNewsLinksDiv haveNoLinks.setVisible(true); // hide the haveLinks haveLinks.setVisible(false); } } /** * @param rl * @param newsLinksDiv * @param newsDataView */ protected void renderItemCounter(final WebMarkupContainer newsLinksDiv, final DataView<NewsLink> newsDataView) { ResourceLoader rl = new ResourceLoader("dash_entity"); if (newsLinksCountId != null) { Iterator itx = newsLinksDiv.iterator(); while (itx.hasNext()) { Component child = (Component) itx.next(); if (newsLinksCountId.equals(child.getId())) { newsLinksDiv.remove(child); break; } } } int itemCount = 0; String pagerStatus = ""; if (newsDataView != null) { int first = 0; int last = 0; itemCount = newsDataView.getItemCount(); int pageSize = newsDataView.getItemsPerPage(); if (itemCount > pageSize) { int page = newsDataView.getCurrentPage(); first = page * pageSize + 1; last = Math.min(itemCount, (page + 1) * pageSize); if (first == last) { pagerStatus = rl.getFormattedMessage("dash.news.linksCount2", new Object[] { new Integer(first), new Integer(itemCount) }); } else { pagerStatus = rl.getFormattedMessage("dash.news.linksCount3", new Object[] { new Integer(first), new Integer(last), new Integer(itemCount) }); } } else if (itemCount > 1) { pagerStatus = rl.getFormattedMessage("dash.news.linksCount3", new Object[] { new Integer(1), new Integer(itemCount), new Integer(itemCount) }); } else if (itemCount > 0) { pagerStatus = rl.getString("dash.news.linksCount1"); } else { pagerStatus = rl.getString("dash.news.linksCount0"); } } Label newsLinksCount = new Label("newsLinksCount", pagerStatus); newsLinksCount.setOutputMarkupId(true); // add the count to the newsLinksDiv newsLinksDiv.add(newsLinksCount); newsLinksCountId = newsLinksCount.getId(); } /** * DataProvider to manage our list * */ private class NewsLinksDataProvider implements IDataProvider<NewsLink> { protected List<NewsLink> newsLinks; protected String newsTabId = null; public NewsLinksDataProvider() { super(); } public NewsLinksDataProvider(String selectedTab) { super(); this.newsTabId = selectedTab; if (this.newsTabId == null) { this.newsTabId = TAB_ID_CURRENT; } } public void setNewsTab(String newsTabId) { if (this.newsTabId == null || !this.newsTabId.equals(newsTabId)) { // force refresh of dataProvider this.newsLinks = null; } this.newsTabId = newsTabId; } private List<NewsLink> getData() { if (newsLinks == null) { String siteId = sakaiProxy.getCurrentSiteId(); String sakaiId = sakaiProxy.getCurrentUserId(); if (siteId == null || sakaiId == null) { if (logger.isDebugEnabled()) { logger.debug("NewsLinksDataProvider.getData() siteId:" + siteId + " sakaiId:" + sakaiId); } return new ArrayList<NewsLink>(); } if (sakaiProxy.isWorksite(siteId)) { if (TAB_ID_CURRENT.equals(newsTabId)) { newsLinks = dashboardCommonLogic.getCurrentNewsLinks(sakaiId, null); } else if (TAB_ID_STARRED.equals(newsTabId)) { newsLinks = dashboardCommonLogic.getStarredNewsLinks(sakaiId, null); } else if (TAB_ID_HIDDEN.equals(newsTabId)) { newsLinks = dashboardCommonLogic.getHiddenNewsLinks(sakaiId, null); } } else { if (TAB_ID_CURRENT.equals(newsTabId)) { newsLinks = dashboardCommonLogic.getCurrentNewsLinks(sakaiId, siteId); } else if (TAB_ID_STARRED.equals(newsTabId)) { newsLinks = dashboardCommonLogic.getStarredNewsLinks(sakaiId, siteId); } else if (TAB_ID_HIDDEN.equals(newsTabId)) { newsLinks = dashboardCommonLogic.getHiddenNewsLinks(sakaiId, siteId); } } } if (logger.isDebugEnabled()) { logger.debug("NewsLinksDataProvider selectedNewsTab=" + this.newsTabId + " newsLinks=" + newsLinks); } if (newsLinks == null) { logger.warn("Error getting news items"); return new ArrayList<NewsLink>(); } return newsLinks; } public Iterator<NewsLink> iterator(int first, int count) { return getData().subList(first, first + count).iterator(); } public int size() { return getData().size(); } public IModel<NewsLink> model(NewsLink object) { return new DetachableNewsLinkModel(object); } public void detach() { newsLinks = null; } } /** * Detachable model to wrap a NewsLink * */ private class DetachableNewsLinkModel extends LoadableDetachableModel<NewsLink> { private NewsLink newsLink = null; /** * @param m */ public DetachableNewsLinkModel(NewsLink t) { this.newsLink = new NewsLink(t); } /** * @param id */ // public DetachableNewsLinkModel(long id){ // this.id = id; // } /** * @see java.lang.Object#hashCode() */ public int hashCode() { if (this.newsLink == null || this.newsLink.getId() == null) { return Long.valueOf(0L).hashCode(); } return Long.valueOf(this.newsLink.getId()).hashCode(); } /** * used for dataview with ReuseIfModelsEqualStrategy item reuse strategy * * @see org.apache.wicket.markup.repeater.ReuseIfModelsEqualStrategy * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(final Object obj) { if (obj == this) { return true; } else if (obj == null) { return false; } else if (this.newsLink == null) { return false; } else if (obj instanceof DetachableNewsLinkModel) { DetachableNewsLinkModel other = (DetachableNewsLinkModel) obj; if (other.newsLink == null) { return false; } return other.newsLink.getId() == this.newsLink.getId(); } return false; } /** * @see org.apache.wicket.model.LoadableDetachableModel#load() */ protected NewsLink load() { // get the news item return new NewsLink(this.newsLink); } } }