/**
* Copyright (c) 2008-2012 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.profile2.tool.pages.panels;
import org.apache.log4j.Logger;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.markup.html.form.upload.FileUploadField;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.lang.Bytes;
import org.sakaiproject.profile2.logic.ProfileImageLogic;
import org.sakaiproject.profile2.logic.ProfileWallLogic;
import org.sakaiproject.profile2.logic.SakaiProxy;
import org.sakaiproject.profile2.tool.components.CloseButton;
import org.sakaiproject.profile2.tool.pages.MyProfile;
import org.sakaiproject.profile2.util.ProfileConstants;
import org.sakaiproject.profile2.util.ProfileUtils;
public class ChangeProfilePictureUpload extends Panel{
private static final long serialVersionUID = 1L;
private FileUploadField uploadField;
@SpringBean(name="org.sakaiproject.profile2.logic.SakaiProxy")
private SakaiProxy sakaiProxy;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileImageLogic")
private ProfileImageLogic imageLogic;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileWallLogic")
private ProfileWallLogic wallLogic;
private static final Logger log = Logger.getLogger(ChangeProfilePictureUpload.class);
private FeedbackPanel feedback;
/**
* Default constructor if modifying own
*/
public ChangeProfilePictureUpload(String id) {
super(id);
log.debug("ChangeProfilePictureUpload()");
//get user for this profile and render it
String userUuid = sakaiProxy.getCurrentUserId();
renderChangeProfilePictureUpload(userUuid);
}
/**
* This constructor only called if we were a superuser editing someone else's picture.
* An additional catch is also in place.
* @param id component id
* @param userUuid uuid of other user
*/
public ChangeProfilePictureUpload(String id, String userUuid) {
super(id);
log.debug("ChangeProfilePictureUpload(" + userUuid +")");
//double check only super users
if(!sakaiProxy.isSuperUser()) {
log.error("ChangeProfilePictureUpload: user " + sakaiProxy.getCurrentUserId() + " attempted to access ChangeProfilePictureUpload for " + userUuid + ". Redirecting...");
throw new RestartResponseException(new MyProfile());
}
//render for given user
renderChangeProfilePictureUpload(userUuid);
}
/**
* Does the actual rendering of the panel
* @param userUuid
*/
private void renderChangeProfilePictureUpload(final String userUuid) {
//setup form
Form<Void> form = new Form<Void>("form") {
private static final long serialVersionUID = 1L;
public void onSubmit(){
//get file that was uploaded
FileUpload upload = uploadField.getFileUpload();
if (upload == null) {
log.error("Profile.ChangeProfilePicture.onSubmit: upload was null.");
//error(new StringResourceModel("error.no.file.uploaded", this, null).getString());
feedback.setDefaultModel(new ResourceModel("error.no.file.uploaded"));
return;
} else if (upload.getSize() == 0) {
log.error("Profile.ChangeProfilePicture.onSubmit: upload was empty.");
//error(new StringResourceModel("error.empty.file.uploaded", this, null).getString());
feedback.setDefaultModel(new ResourceModel("error.empty.file.uploaded"));
return;
} else if (!ProfileUtils.checkContentTypeForProfileImage(upload.getContentType())) {
log.error("Profile.ChangeProfilePicture.onSubmit: invalid file type uploaded for profile picture");
//error(new StringResourceModel("error.invalid.image.type", this, null).getString());
feedback.setDefaultModel(new ResourceModel("error.invalid.image.type"));
return;
} else {
String mimeType = upload.getContentType();
//String fileName = upload.getClientFileName();
//ok so get bytes of file uploaded
byte[] imageBytes = upload.getBytes();
//add image using ProfileImageLogic which scales and sets up CHS automatically
if(imageLogic.setUploadedProfileImage(userUuid, imageBytes, mimeType, null)) {
//log it
log.info("User " + userUuid + " successfully changed profile picture by upload.");
//post update event
sakaiProxy.postEvent(ProfileConstants.EVENT_PROFILE_IMAGE_CHANGE_UPLOAD, "/profile/"+userUuid, true);
if (true == sakaiProxy.isWallEnabledGlobally() && false == sakaiProxy.isSuperUserAndProxiedToUser(userUuid)) {
wallLogic.addNewEventToWall(ProfileConstants.EVENT_PROFILE_IMAGE_CHANGE_UPLOAD, sakaiProxy.getCurrentUserId());
}
//refresh image data
if(sakaiProxy.isSuperUserAndProxiedToUser(userUuid)){
setResponsePage(new MyProfile(userUuid));
} else {
setResponsePage(new MyProfile());
}
} else {
//error(new StringResourceModel("error.file.save.failed", this, null).getString());
feedback.setDefaultModel(new ResourceModel("error.file.save.failed"));
return;
}
}
}
};
//get the max upload size from Sakai
int maxSize = sakaiProxy.getMaxProfilePictureSize();
//setup form
form.setMaxSize(Bytes.megabytes(maxSize));
form.setOutputMarkupId(true);
form.setMultiPart(true);
//add warning message if superUser and not editing own image
Label editWarning = new Label("editWarning");
editWarning.setVisible(false);
if(sakaiProxy.isSuperUserAndProxiedToUser(userUuid)) {
editWarning.setDefaultModel(new StringResourceModel("text.edit.other.warning", null, new Object[]{ sakaiProxy.getUserDisplayName(userUuid) } ));
editWarning.setEscapeModelStrings(false);
editWarning.setVisible(true);
}
form.add(editWarning);
//close button component
CloseButton closeButton = new CloseButton("closeButton", this);
closeButton.setOutputMarkupId(true);
form.add(closeButton);
//text
Label textSelectImage = new Label("textSelectImage", new StringResourceModel("text.upload.image.file", null, new Object[]{ maxSize } ));
form.add(textSelectImage);
//upload
uploadField = new FileUploadField("picture");
uploadField.setMarkupId("pictureupload");
uploadField.setOutputMarkupId(true);
form.add(uploadField);
//feedback for form submit action
feedback = new FeedbackPanel("feedback");
feedback.setOutputMarkupId(true);
form.add(feedback);
//submit button
IndicatingAjaxButton submitButton = new IndicatingAjaxButton(
"submit", new ResourceModel("button.upload")) {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
target.addComponent(feedback);
}
// update feedback panel if validation failed
protected void onError(AjaxRequestTarget target, Form form) {
log.debug("ChangeProfilePictureUpload.onSubmit validation failed.");
target.addComponent(feedback);
}
};
form.add(submitButton);
//add form to page
add(form);
}
}