Java tutorial
/** * Copyright (c) 2007 The Apereo 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://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.scorm.ui.console.pages; import java.io.Serializable; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.adl.validator.contentpackage.LaunchData; import org.apache.wicket.PageParameters; import org.apache.wicket.ResourceReference; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; import org.apache.wicket.extensions.yui.calendar.DateTimeField; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.ChoiceRenderer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.sakaiproject.scorm.dao.api.ContentPackageManifestDao; import org.sakaiproject.scorm.model.api.ContentPackage; import org.sakaiproject.scorm.model.api.ContentPackageManifest; import org.sakaiproject.scorm.service.api.LearningManagementSystem; import org.sakaiproject.scorm.service.api.ScormContentService; import org.sakaiproject.service.gradebook.shared.GradebookExternalAssessmentService; import org.sakaiproject.tool.api.Placement; import org.sakaiproject.tool.cover.ToolManager; import org.sakaiproject.wicket.markup.html.form.CancelButton; import org.sakaiproject.wicket.model.DecoratedPropertyModel; import org.sakaiproject.wicket.model.SimpleDateFormatPropertyModel; public class PackageConfigurationPage extends ConsoleBasePage { static class AssessmentSetup implements Serializable { private static final long serialVersionUID = 1L; LaunchData launchData; Double numberOffPoints = 100d; boolean synchronizeSCOWithGradebook; public AssessmentSetup() { super(); } public AssessmentSetup(LaunchData launchData) { super(); this.launchData = launchData; } public String getItemIdentifier() { return launchData.getItemIdentifier(); } public String getItemTitle() { return launchData.getItemTitle(); } public LaunchData getLaunchData() { return launchData; } public Double getNumberOffPoints() { return numberOffPoints; } public boolean issynchronizeSCOWithGradebook() { return synchronizeSCOWithGradebook; } public void setLaunchData(LaunchData launchData) { this.launchData = launchData; } public void setNumberOffPoints(Double numberOffPoints) { this.numberOffPoints = numberOffPoints; } public void setsynchronizeSCOWithGradebook(boolean synchronizeSCOWithGradebook) { this.synchronizeSCOWithGradebook = synchronizeSCOWithGradebook; } } public class DisplayNamePropertyModel extends DecoratedPropertyModel implements Serializable { private static final long serialVersionUID = 1L; public DisplayNamePropertyModel(Object modelObject, String expression) { super(modelObject, expression); } @Override public Object convertObject(Object object) { String userId = String.valueOf(object); return lms.getLearnerName(userId); } } static class GradebookSetup implements Serializable { private static final long serialVersionUID = 1L; boolean isGradebookDefined; ContentPackage contentPackage; public ContentPackage getContentPackage() { return contentPackage; } public void setContentPackage(ContentPackage contentPackage) { this.contentPackage = contentPackage; } ContentPackageManifest contentPackageManifest; List<AssessmentSetup> assessments = new ArrayList<PackageConfigurationPage.AssessmentSetup>(); public List<AssessmentSetup> getAssessments() { return assessments; } public String getContentPackageId() { return "" + contentPackage.getContentPackageId(); } public ContentPackageManifest getContentPackageManifest() { return contentPackageManifest; } public boolean isGradebookDefined() { return isGradebookDefined; } public void setContentPackageManifest(ContentPackageManifest contentPackageManifest) { this.contentPackageManifest = contentPackageManifest; assessments.clear(); @SuppressWarnings("unchecked") List<LaunchData> launchDatas = contentPackageManifest.getLaunchData(); for (LaunchData launchData : launchDatas) { String scormType = launchData.getSCORMType(); if ("sco".equalsIgnoreCase(scormType)) { AssessmentSetup assessment = buildAssessmentSetup(launchData); assessments.add(assessment); } } } protected AssessmentSetup buildAssessmentSetup(LaunchData launchData) { AssessmentSetup assessment = new AssessmentSetup(launchData); return assessment; } public void setGradebookDefined(boolean isGradebookDefined) { this.isGradebookDefined = isGradebookDefined; } } public class TryChoiceRenderer extends ChoiceRenderer implements Serializable { private static final long serialVersionUID = 1L; public TryChoiceRenderer() { super(); } @Override public Object getDisplayValue(Object object) { Integer n = (Integer) object; if (n == -1) { return unlimitedMessage; } return object; } } private static final long serialVersionUID = 1L; private static ResourceReference PAGE_ICON = new ResourceReference(PackageConfigurationPage.class, "res/table_edit.png"); @SpringBean LearningManagementSystem lms; @SpringBean(name = "org.sakaiproject.scorm.service.api.ScormContentService") ScormContentService contentService; @SpringBean(name = "org.sakaiproject.service.gradebook.GradebookExternalAssessmentService") GradebookExternalAssessmentService gradebookExternalAssessmentService; @SpringBean(name = "org.sakaiproject.scorm.dao.api.ContentPackageManifestDao") ContentPackageManifestDao contentPackageManifestDao; private String unlimitedMessage; public PackageConfigurationPage(PageParameters params) { super(params); long contentPackageId = params.getLong("contentPackageId"); final ContentPackage contentPackage = contentService.getContentPackage(contentPackageId); final GradebookSetup gradebookSetup = getAssessmentSetup(contentPackage); final Class pageSubmit; final Class pageCancel; // @NOTE this is a hack that allows us to change the destination we // are redirected to after form submission depending on where we come from // I'm sure there's a more reliable way to do this is Wicket but it's not trivial to figure it out. if (params.getBoolean("no-toolbar")) { pageSubmit = DisplayDesignatedPackage.class; pageCancel = DisplayDesignatedPackage.class; } else { pageSubmit = PackageListPage.class; pageCancel = PackageListPage.class; } Form form = new Form("configurationForm") { private static final long serialVersionUID = 1L; @Override protected void onSubmit() { if (gradebookSetup.isGradebookDefined()) { List<AssessmentSetup> assessments = gradebookSetup.getAssessments(); for (AssessmentSetup assessmentSetup : assessments) { boolean on = assessmentSetup.issynchronizeSCOWithGradebook(); String assessmentExternalId = getAssessmentExternalId(gradebookSetup, assessmentSetup); String context = getContext(); boolean has = gradebookExternalAssessmentService.isExternalAssignmentDefined(context, assessmentExternalId); String fixedTitle = getItemTitle(assessmentSetup, context); if (has && on) { gradebookExternalAssessmentService.updateExternalAssessment(context, assessmentExternalId, null, fixedTitle, assessmentSetup.numberOffPoints, gradebookSetup.getContentPackage().getDueOn()); } else if (!has && on) { gradebookExternalAssessmentService.addExternalAssessment(context, assessmentExternalId, null, fixedTitle, assessmentSetup.numberOffPoints, gradebookSetup.getContentPackage().getDueOn(), "SCORM player"); } else if (has && !on) { gradebookExternalAssessmentService.removeExternalAssessment(context, assessmentExternalId); } } } contentService.updateContentPackage(contentPackage); setResponsePage(pageSubmit); } protected String getItemTitle(AssessmentSetup assessmentSetup, String context) { String fixedTitle = assessmentSetup.getItemTitle(); int count = 1; while (gradebookExternalAssessmentService.isAssignmentDefined(context, fixedTitle)) { fixedTitle = assessmentSetup.getItemTitle() + " (" + count++ + ")"; } return fixedTitle; } }; List<Integer> tryList = new LinkedList<Integer>(); tryList.add(-1); for (int i = 1; i <= 10; i++) { tryList.add(i); } this.unlimitedMessage = getLocalizer().getString("unlimited", this); TextField nameField = new TextField("packageName", new PropertyModel(contentPackage, "title")); nameField.setRequired(true); form.add(nameField); DateTimeField releaseOnDTF = new DateTimeField("releaseOnDTF", new PropertyModel(contentPackage, "releaseOn")); releaseOnDTF.setRequired(true); form.add(releaseOnDTF); form.add(new DateTimeField("dueOnDTF", new PropertyModel(contentPackage, "dueOn"))); form.add(new DateTimeField("acceptUntilDTF", new PropertyModel(contentPackage, "acceptUntil"))); form.add(new DropDownChoice("numberOfTries", new PropertyModel(contentPackage, "numberOfTries"), tryList, new TryChoiceRenderer())); form.add(new Label("createdBy", new DisplayNamePropertyModel(contentPackage, "createdBy"))); form.add(new Label("createdOn", new SimpleDateFormatPropertyModel(contentPackage, "createdOn"))); form.add(new Label("modifiedBy", new DisplayNamePropertyModel(contentPackage, "modifiedBy"))); form.add(new Label("modifiedOn", new SimpleDateFormatPropertyModel(contentPackage, "modifiedOn"))); ListView scos; form.add(scos = new ListView("scos", gradebookSetup.getAssessments()) { private static final long serialVersionUID = 965550162166385688L; @Override protected void populateItem(final ListItem item) { Label label = new Label("itemTitle", new PropertyModel(item.getModelObject(), "itemTitle")); item.add(label); final WebMarkupContainer verifySyncWithGradebook = new WebMarkupContainer( "verifySyncWithGradebook"); verifySyncWithGradebook.setOutputMarkupId(true); verifySyncWithGradebook.setOutputMarkupPlaceholderTag(true); verifySyncWithGradebook.setVisible(false); item.add(verifySyncWithGradebook); AjaxCheckBox synchronizeSCOWithGradebook = new AjaxCheckBox("synchronizeSCOWithGradebook", new PropertyModel(item.getModelObject(), "synchronizeSCOWithGradebook")) { @Override protected void onUpdate(AjaxRequestTarget target) { AssessmentSetup as = (AssessmentSetup) item.getModelObject(); String assessmentExternalId = getAssessmentExternalId(gradebookSetup, as); boolean hasGradebookSync = gradebookExternalAssessmentService .isExternalAssignmentDefined(getContext(), assessmentExternalId); boolean isChecked = this.getModelObject(); verifySyncWithGradebook.setVisible(hasGradebookSync && !isChecked); target.addComponent(verifySyncWithGradebook); } }; item.add(synchronizeSCOWithGradebook); } }); scos.setVisible(gradebookSetup.isGradebookDefined() && !gradebookSetup.getAssessments().isEmpty()); form.add(new CancelButton("cancel", pageCancel)); add(form); } private GradebookSetup getAssessmentSetup(ContentPackage contentPackage) { final GradebookSetup gradebookSetup = new GradebookSetup(); String context = getContext(); boolean isGradebookDefined = gradebookExternalAssessmentService.isGradebookDefined(context); gradebookSetup.setGradebookDefined(isGradebookDefined); gradebookSetup.setContentPackage(contentPackage); if (isGradebookDefined) { ContentPackageManifest contentPackageManifest = contentPackageManifestDao .load(contentPackage.getManifestId()); gradebookSetup.setContentPackageManifest(contentPackageManifest); List<AssessmentSetup> assessments = gradebookSetup.getAssessments(); for (AssessmentSetup as : assessments) { String assessmentExternalId = getAssessmentExternalId(gradebookSetup, as); boolean has = gradebookExternalAssessmentService.isExternalAssignmentDefined(getContext(), assessmentExternalId); as.setsynchronizeSCOWithGradebook(has); } } return gradebookSetup; } protected String getContext() { Placement placement = ToolManager.getCurrentPlacement(); String context = placement.getContext(); return context; } @Override protected ResourceReference getPageIconReference() { return PAGE_ICON; } private static String getAssessmentExternalId(final GradebookSetup gradebook, AssessmentSetup assessment) { String assessmentExternalId = "" + gradebook.getContentPackageId() + ":" + assessment.getLaunchData().getItemIdentifier(); return assessmentExternalId; } }