Java tutorial
/* * Copyright (c) 2017, University of Dayton * * 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://opensource.org/licenses/ecl2 * * 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.attendance.tool.pages; import lombok.Getter; 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.AttributeAppender; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.feedback.FeedbackMessage; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.OnLoadHeaderItem; import org.apache.wicket.markup.head.StringHeaderItem; import org.apache.wicket.markup.html.IHeaderContributor; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.sakaiproject.attendance.logic.AttendanceLogic; import org.sakaiproject.attendance.logic.SakaiProxy; import org.sakaiproject.attendance.model.AttendanceEvent; import org.sakaiproject.attendance.model.Status; import org.sakaiproject.attendance.tool.panels.EventInputPanel; import org.sakaiproject.attendance.tool.util.AttendanceFeedbackPanel; import javax.servlet.http.HttpServletRequest; /** * This is our base page for our Sakai app. It sets up the containing markup and top navigation. * All top level pages should extend from this page so as to keep the same navigation. The content for those pages will * be rendered in the main area below the top nav. * * <p>It also allows us to setup the API injection and any other common methods, which are then made available in the other pages. * * @author Leonardo Canessa [lcanessa1 (at) udayton (dot) edu] * @author David Bauer [dbauer1 (at) udayton (dot) edu] * @author Steve Swinsburg (steve.swinsburg@gmail.com) */ public class BasePage extends WebPage implements IHeaderContributor { protected static final Logger log = Logger.getLogger(BasePage.class); @SpringBean(name = "org.sakaiproject.attendance.logic.SakaiProxy") protected SakaiProxy sakaiProxy; @SpringBean(name = "org.sakaiproject.attendance.logic.AttendanceLogic") protected AttendanceLogic attendanceLogic; protected String role; Link<Void> homepageLink; Link<Void> settingsLink; Link<Void> studentOverviewLink; Link<Void> gradingLink; FeedbackPanel feedbackPanel; @Getter ModalWindow addOrEditItemWindow; public BasePage() { log.debug("BasePage()"); this.role = sakaiProxy.getCurrentUserRoleInCurrentSite(); //Take Attendance Overview link homepageLink = new Link<Void>("homepage-link") { private static final long serialVersionUID = 1L; public void onClick() { setResponsePage(new Overview()); } }; homepageLink.add(new Label("homepage-link-label", new ResourceModel("attendance.link.homepage")) .setRenderBodyOnly(true)); homepageLink.add(new AttributeModifier("title", new ResourceModel("attendance.link.homepage.tooltip"))); add(homepageLink); //student Overview Link studentOverviewLink = new Link<Void>("student-overview-link") { private static final long serialVersionUID = 1L; public void onClick() { setResponsePage(new StudentOverview()); } }; studentOverviewLink .add(new Label("student-overview-label", new ResourceModel("attendance.link.student.overview")) .setRenderBodyOnly(true)); studentOverviewLink .add(new AttributeModifier("title", new ResourceModel("attendance.link.student.overview.tooltip"))); add(studentOverviewLink); // Settings Link settingsLink = new Link<Void>("settings-link") { private static final long serialVersionUID = 1L; public void onClick() { setResponsePage(new SettingsPage()); } }; settingsLink.add(new Label("settings-link-label", new ResourceModel("attendance.link.settings.label")) .setRenderBodyOnly(true)); settingsLink.add(new AttributeModifier("title", new ResourceModel("attendance.link.settings.tooltip"))); add(settingsLink); // Grading Link gradingLink = new Link<Void>("grading-link") { private static final long serialVersionUID = 1L; @Override public void onClick() { setResponsePage(new GradingPage()); } }; gradingLink.add( new Label("grading-link-label", new ResourceModel("grading.link.label")).setRenderBodyOnly(true)); gradingLink.add(new AttributeModifier("title", new ResourceModel("grading.link.tooltip"))); add(gradingLink); // Add a FeedbackPanel for displaying our messages feedbackPanel = new AttendanceFeedbackPanel("feedback"); add(feedbackPanel); if (attendanceLogic.getCurrentAttendanceSite().getIsSyncing()) { getSession().error((new ResourceModel("attendance.site.syncing.error")).getObject()); } this.addOrEditItemWindow = new ModalWindow("addOrEditItemWindow"); this.addOrEditItemWindow.showUnloadConfirmation(false); this.addOrEditItemWindow.setInitialHeight(400); add(this.addOrEditItemWindow); } /** * This block adds the isRequired wrapper markup to style it like a Sakai tool. * Add to this any additional CSS or JS references that you need. * */ public void renderHead(IHeaderResponse response) { //get the Sakai skin header fragment from the request attribute HttpServletRequest request = (HttpServletRequest) getRequest().getContainerRequest(); response.render(StringHeaderItem.forString((String) request.getAttribute("sakai.html.head"))); response.render(OnLoadHeaderItem.forScript("setMainFrameHeight( window.name )")); //Tool additions (at end so we can override if isRequired) response.render(StringHeaderItem .forString("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />")); //response.renderCSSReference("css/my_tool_styles.css"); //response.renderJavascriptReference("js/my_tool_javascript.js"); } /** * Helper to disable a link. Add the Sakai class 'current'. */ protected void disableLink(Link<Void> l) { l.add(new AttributeAppender("class", new Model<String>("current"), " ")); l.setEnabled(false); } /** * Helper to disable the Link Headers */ protected void hideNavigationLink(Link<Void> l) { l.setVisible(false); } protected String getStatusString(Status s) { if (s == null) { return new ResourceModel("attendance.status.unknown").getObject(); } switch (s) { case UNKNOWN: return new ResourceModel("attendance.status.unknown").getObject(); case PRESENT: return new ResourceModel("attendance.status.present").getObject(); case EXCUSED_ABSENCE: return new ResourceModel("attendance.status.excused").getObject(); case UNEXCUSED_ABSENCE: return new ResourceModel("attendance.status.absent").getObject(); case LATE: return new ResourceModel("attendance.status.late").getObject(); case LEFT_EARLY: return new ResourceModel("attendance.status.left.early").getObject(); default: return new ResourceModel("attendance.status.unknown").getObject(); } } protected AjaxLink<?> getAddEditWindowAjaxLink(final AttendanceEvent obj, final String id) { return new AjaxLink<Void>(id) { private static final long serialVersionUID = 1L; public void onClick(AjaxRequestTarget target) { final ModalWindow window = getAddOrEditItemWindow(); window.setTitle(new ResourceModel("attendance.add.edit.header")); window.setContent( new EventInputPanel(window.getContentId(), window, new CompoundPropertyModel<>(obj))); window.show(target); } }; } public static final String OVERVIEW_PAGE = "overview"; public static final String STUDENT_PAGE = "student_view"; public static final String STUDENT_OVERVIEW_PAGE = "student_overview"; }