/**
* 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 java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.sakaiproject.api.common.edu.person.SakaiPerson;
import org.sakaiproject.profile2.exception.ProfilePrototypeNotDefinedException;
import org.sakaiproject.profile2.logic.ProfileLogic;
import org.sakaiproject.profile2.logic.ProfilePrivacyLogic;
import org.sakaiproject.profile2.logic.SakaiProxy;
import org.sakaiproject.profile2.model.ProfilePrivacy;
import org.sakaiproject.profile2.model.SocialNetworkingInfo;
import org.sakaiproject.profile2.types.PrivacyType;
import org.sakaiproject.profile2.util.ProfileConstants;
import org.sakaiproject.profile2.util.ProfileUtils;
/**
* Container for viewing the profile of someone else.
*/
public class ViewProfilePanel extends Panel {
private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(ViewProfilePanel.class);
@SpringBean(name="org.sakaiproject.profile2.logic.SakaiProxy")
protected SakaiProxy sakaiProxy;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfileLogic")
protected ProfileLogic profileLogic;
@SpringBean(name="org.sakaiproject.profile2.logic.ProfilePrivacyLogic")
protected ProfilePrivacyLogic privacyLogic;
public ViewProfilePanel(String id, final String userUuid, final String currentUserId,
ProfilePrivacy privacy, boolean friend) {
super(id);
//get SakaiPerson for the person who's profile we are viewing
//SakaiPerson returns NULL strings if value is not set, not blank ones
final SakaiPerson sakaiPerson;
//if null, they have no profile so just get a prototype
if(sakaiProxy.getSakaiPerson(userUuid) == null) {
log.info("No SakaiPerson for " + userUuid);
sakaiPerson = sakaiProxy.getSakaiPersonPrototype();
//if its still null, throw exception
if(sakaiPerson == null) {
throw new ProfilePrototypeNotDefinedException("Couldn't create a SakaiPerson prototype for " + userUuid);
}
} else {
sakaiPerson = sakaiProxy.getSakaiPerson(userUuid);
}
//holds number of profile containers that are visible
int visibleContainerCount = 0;
boolean isBasicInfoAllowed = privacyLogic.isActionAllowed(userUuid,currentUserId, PrivacyType.PRIVACY_OPTION_BASICINFO);
boolean isContactInfoAllowed = privacyLogic.isActionAllowed(userUuid, currentUserId, PrivacyType.PRIVACY_OPTION_CONTACTINFO);
boolean isBusinessInfoAllowed = privacyLogic.isActionAllowed(userUuid, currentUserId, PrivacyType.PRIVACY_OPTION_BUSINESSINFO);
boolean isPersonalInfoAllowed = privacyLogic.isActionAllowed(userUuid, currentUserId, PrivacyType.PRIVACY_OPTION_PERSONALINFO);
boolean isStaffInfoAllowed = privacyLogic.isActionAllowed(userUuid, currentUserId, PrivacyType.PRIVACY_OPTION_STAFFINFO);
boolean isStudentInfoAllowed = privacyLogic.isActionAllowed(userUuid, currentUserId, PrivacyType.PRIVACY_OPTION_STUDENTINFO);
boolean isSocialNetworkingInfoAllowed = privacyLogic.isActionAllowed(userUuid, currentUserId, PrivacyType.PRIVACY_OPTION_SOCIALINFO);
/* BASIC INFO */
WebMarkupContainer basicInfoContainer = new WebMarkupContainer("mainSectionContainer_basic");
basicInfoContainer.setOutputMarkupId(true);
//get info
String nickname = sakaiPerson.getNickname();
String personalSummary = sakaiPerson.getNotes();
Date dateOfBirth = sakaiPerson.getDateOfBirth();
String birthday = "";
int visibleFieldCount_basic = 0;
if(dateOfBirth != null) {
if(privacyLogic.isBirthYearVisible(userUuid)) {
birthday = ProfileUtils.convertDateToString(dateOfBirth, ProfileConstants.DEFAULT_DATE_FORMAT);
} else {
birthday = ProfileUtils.convertDateToString(dateOfBirth, ProfileConstants.DEFAULT_DATE_FORMAT_HIDE_YEAR);
}
}
//heading
basicInfoContainer.add(new Label("mainSectionHeading_basic", new ResourceModel("heading.basic")));
//nickname
WebMarkupContainer nicknameContainer = new WebMarkupContainer("nicknameContainer");
nicknameContainer.add(new Label("nicknameLabel", new ResourceModel("profile.nickname")));
nicknameContainer.add(new Label("nickname", nickname));
basicInfoContainer.add(nicknameContainer);
if(StringUtils.isBlank(nickname)) {
nickname=""; //for the 'add friend' link
nicknameContainer.setVisible(false);
} else {
visibleFieldCount_basic++;
}
//birthday
WebMarkupContainer birthdayContainer = new WebMarkupContainer("birthdayContainer");
birthdayContainer.add(new Label("birthdayLabel", new ResourceModel("profile.birthday")));
birthdayContainer.add(new Label("birthday", birthday));
basicInfoContainer.add(birthdayContainer);
if(StringUtils.isBlank(birthday)) {
birthdayContainer.setVisible(false);
} else {
visibleFieldCount_basic++;
}
//personal summary
WebMarkupContainer personalSummaryContainer = new WebMarkupContainer("personalSummaryContainer");
personalSummaryContainer.add(new Label("personalSummaryLabel", new ResourceModel("profile.summary")));
personalSummaryContainer.add(new Label("personalSummary", ProfileUtils.processHtml(personalSummary)).setEscapeModelStrings(false));
basicInfoContainer.add(personalSummaryContainer);
if(StringUtils.isBlank(personalSummary)) {
personalSummaryContainer.setVisible(false);
} else {
visibleFieldCount_basic++;
}
add(basicInfoContainer);
//if nothing/not allowed, hide whole panel
if(visibleFieldCount_basic == 0 || !isBasicInfoAllowed) {
basicInfoContainer.setVisible(false);
} else {
visibleContainerCount++;
}
/* CONTACT INFO */
WebMarkupContainer contactInfoContainer = new WebMarkupContainer("mainSectionContainer_contact");
contactInfoContainer.setOutputMarkupId(true);
//get info
String email = sakaiProxy.getUserEmail(userUuid); //must come from SakaiProxy
String homepage = sakaiPerson.getLabeledURI();
String workphone = sakaiPerson.getTelephoneNumber();
String homephone = sakaiPerson.getHomePhone();
String mobilephone = sakaiPerson.getMobile();
String facsimile = sakaiPerson.getFacsimileTelephoneNumber();
int visibleFieldCount_contact = 0;
//heading
contactInfoContainer.add(new Label("mainSectionHeading_contact", new ResourceModel("heading.contact")));
//email
WebMarkupContainer emailContainer = new WebMarkupContainer("emailContainer");
emailContainer.add(new Label("emailLabel", new ResourceModel("profile.email")));
emailContainer.add(new Label("email", email));
contactInfoContainer.add(emailContainer);
if(StringUtils.isBlank(email)) {
emailContainer.setVisible(false);
} else {
visibleFieldCount_contact++;
}
//homepage
WebMarkupContainer homepageContainer = new WebMarkupContainer("homepageContainer");
homepageContainer.add(new Label("homepageLabel", new ResourceModel("profile.homepage")));
homepageContainer.add(new ExternalLink("homepage", homepage, homepage));
contactInfoContainer.add(homepageContainer);
if(StringUtils.isBlank(homepage)) {
homepageContainer.setVisible(false);
} else {
visibleFieldCount_contact++;
}
//work phone
WebMarkupContainer workphoneContainer = new WebMarkupContainer("workphoneContainer");
workphoneContainer.add(new Label("workphoneLabel", new ResourceModel("profile.phone.work")));
workphoneContainer.add(new Label("workphone", workphone));
contactInfoContainer.add(workphoneContainer);
if(StringUtils.isBlank(workphone)) {
workphoneContainer.setVisible(false);
} else {
visibleFieldCount_contact++;
}
//home phone
WebMarkupContainer homephoneContainer = new WebMarkupContainer("homephoneContainer");
homephoneContainer.add(new Label("homephoneLabel", new ResourceModel("profile.phone.home")));
homephoneContainer.add(new Label("homephone", homephone));
contactInfoContainer.add(homephoneContainer);
if(StringUtils.isBlank(homephone)) {
homephoneContainer.setVisible(false);
} else {
visibleFieldCount_contact++;
}
//mobile phone
WebMarkupContainer mobilephoneContainer = new WebMarkupContainer("mobilephoneContainer");
mobilephoneContainer.add(new Label("mobilephoneLabel", new ResourceModel("profile.phone.mobile")));
mobilephoneContainer.add(new Label("mobilephone", mobilephone));
contactInfoContainer.add(mobilephoneContainer);
if(StringUtils.isBlank(mobilephone)) {
mobilephoneContainer.setVisible(false);
} else {
visibleFieldCount_contact++;
}
//facsimile
WebMarkupContainer facsimileContainer = new WebMarkupContainer("facsimileContainer");
facsimileContainer.add(new Label("facsimileLabel", new ResourceModel("profile.phone.facsimile")));
facsimileContainer.add(new Label("facsimile", facsimile));
contactInfoContainer.add(facsimileContainer);
if(StringUtils.isBlank(facsimile)) {
facsimileContainer.setVisible(false);
} else {
visibleFieldCount_contact++;
}
add(contactInfoContainer);
//if nothing/not allowed, hide whole panel
if(visibleFieldCount_contact == 0 || !isContactInfoAllowed) {
contactInfoContainer.setVisible(false);
} else {
visibleContainerCount++;
}
/* STAFF INFO */
WebMarkupContainer staffInfoContainer = new WebMarkupContainer("mainSectionContainer_staff");
staffInfoContainer.setOutputMarkupId(true);
//get info
String department = sakaiPerson.getOrganizationalUnit();
String position = sakaiPerson.getTitle();
String school = sakaiPerson.getCampus();
String room = sakaiPerson.getRoomNumber();
String staffProfile = sakaiPerson.getStaffProfile();
String universityProfileUrl = sakaiPerson.getUniversityProfileUrl();
String academicProfileUrl = sakaiPerson.getAcademicProfileUrl();
String publications = sakaiPerson.getPublications();
int visibleFieldCount_staff = 0;
//heading
staffInfoContainer.add(new Label("mainSectionHeading_staff", new ResourceModel("heading.staff")));
//department
WebMarkupContainer departmentContainer = new WebMarkupContainer("departmentContainer");
departmentContainer.add(new Label("departmentLabel", new ResourceModel("profile.department")));
departmentContainer.add(new Label("department", department));
staffInfoContainer.add(departmentContainer);
if(StringUtils.isBlank(department)) {
departmentContainer.setVisible(false);
} else {
visibleFieldCount_staff++;
}
//position
WebMarkupContainer positionContainer = new WebMarkupContainer("positionContainer");
positionContainer.add(new Label("positionLabel", new ResourceModel("profile.position")));
positionContainer.add(new Label("position", position));
staffInfoContainer.add(positionContainer);
if(StringUtils.isBlank(position)) {
positionContainer.setVisible(false);
} else {
visibleFieldCount_staff++;
}
//school
WebMarkupContainer schoolContainer = new WebMarkupContainer("schoolContainer");
schoolContainer.add(new Label("schoolLabel", new ResourceModel("profile.school")));
schoolContainer.add(new Label("school", school));
staffInfoContainer.add(schoolContainer);
if(StringUtils.isBlank(school)) {
schoolContainer.setVisible(false);
} else {
visibleFieldCount_staff++;
}
//room
WebMarkupContainer roomContainer = new WebMarkupContainer("roomContainer");
roomContainer.add(new Label("roomLabel", new ResourceModel("profile.room")));
roomContainer.add(new Label("room", room));
staffInfoContainer.add(roomContainer);
if(StringUtils.isBlank(room)) {
roomContainer.setVisible(false);
} else {
visibleFieldCount_staff++;
}
//staff profile
WebMarkupContainer staffProfileContainer = new WebMarkupContainer("staffProfileContainer");
staffProfileContainer.add(new Label("staffProfileLabel", new ResourceModel("profile.staffprofile")));
staffProfileContainer.add(new Label("staffProfile", staffProfile));
staffInfoContainer.add(staffProfileContainer);
if(StringUtils.isBlank(staffProfile)) {
staffProfileContainer.setVisible(false);
} else {
visibleFieldCount_staff++;
}
//university profile URL
WebMarkupContainer universityProfileUrlContainer = new WebMarkupContainer("universityProfileUrlContainer");
universityProfileUrlContainer.add(new Label("universityProfileUrlLabel", new ResourceModel("profile.universityprofileurl")));
universityProfileUrlContainer.add(new ExternalLink("universityProfileUrl", universityProfileUrl, universityProfileUrl));
staffInfoContainer.add(universityProfileUrlContainer);
if(StringUtils.isBlank(universityProfileUrl)) {
universityProfileUrlContainer.setVisible(false);
} else {
visibleFieldCount_contact++;
}
//academic/research profile URL
WebMarkupContainer academicProfileUrlContainer = new WebMarkupContainer("academicProfileUrlContainer");
academicProfileUrlContainer.add(new Label("academicProfileUrlLabel", new ResourceModel("profile.academicprofileurl")));
academicProfileUrlContainer.add(new ExternalLink("academicProfileUrl", academicProfileUrl, academicProfileUrl));
staffInfoContainer.add(academicProfileUrlContainer);
if(StringUtils.isBlank(academicProfileUrl)) {
academicProfileUrlContainer.setVisible(false);
} else {
visibleFieldCount_contact++;
}
//publications
WebMarkupContainer publicationsContainer = new WebMarkupContainer("publicationsContainer");
publicationsContainer.add(new Label("publicationsLabel", new ResourceModel("profile.publications")));
publicationsContainer.add(new Label("publications", ProfileUtils.processHtml(publications)).setEscapeModelStrings(false));
staffInfoContainer.add(publicationsContainer);
if(StringUtils.isBlank(publications)) {
publicationsContainer.setVisible(false);
} else {
visibleFieldCount_staff++;
}
add(staffInfoContainer);
//if nothing/not allowed, hide whole panel
if(visibleFieldCount_staff == 0 || !isStaffInfoAllowed) {
staffInfoContainer.setVisible(false);
} else {
visibleContainerCount++;
}
/* BUSINESS INFO (OPTIONAL) */
if (sakaiProxy.isBusinessProfileEnabled()) {
ViewBusiness businessPanel = new ViewBusiness("viewBusiness",
userUuid, sakaiPerson, isBusinessInfoAllowed);
if (0 == businessPanel.getVisibleFieldCount() || !isBusinessInfoAllowed) {
businessPanel.setVisible(false);
} else {
visibleContainerCount++;
}
add(businessPanel);
} else {
Panel businessPanel = new EmptyPanel("viewBusiness");
add(businessPanel);
}
/* STUDENT INFO*/
WebMarkupContainer studentInfoContainer = new WebMarkupContainer("mainSectionContainer_student");
studentInfoContainer.setOutputMarkupId(true);
String course = sakaiPerson.getEducationCourse();
String subjects = sakaiPerson.getEducationSubjects();
int visibleFieldCount_student = 0;
//heading
studentInfoContainer.add(new Label("mainSectionHeading_student", new ResourceModel("heading.student")));
//course
WebMarkupContainer courseContainer = new WebMarkupContainer("courseContainer");
courseContainer.add(new Label("courseLabel", new ResourceModel("profile.course")));
courseContainer.add(new Label("course", course));
studentInfoContainer.add(courseContainer);
if(StringUtils.isBlank(course)) {
courseContainer.setVisible(false);
} else {
visibleFieldCount_student++;
}
//subjects
WebMarkupContainer subjectsContainer = new WebMarkupContainer("subjectsContainer");
subjectsContainer.add(new Label("subjectsLabel", new ResourceModel("profile.subjects")));
subjectsContainer.add(new Label("subjects", subjects));
studentInfoContainer.add(subjectsContainer);
if(StringUtils.isBlank(subjects)) {
subjectsContainer.setVisible(false);
} else {
visibleFieldCount_student++;
}
add(studentInfoContainer);
//if nothing/not allowed, hide whole panel
if(visibleFieldCount_student == 0 || !isStudentInfoAllowed) {
studentInfoContainer.setVisible(false);
} else {
visibleContainerCount++;
}
/* SOCIAL NETWORKING */
WebMarkupContainer socialNetworkingInfoContainer = new WebMarkupContainer("mainSectionContainer_socialNetworking");
socialNetworkingInfoContainer.setOutputMarkupId(true);
//heading
socialNetworkingInfoContainer.add(new Label("mainSectionHeading_socialNetworking", new ResourceModel("heading.social")));
SocialNetworkingInfo socialNetworkingInfo = profileLogic.getSocialNetworkingInfo(userUuid);
if (null == socialNetworkingInfo) {
socialNetworkingInfo = profileLogic.getSocialNetworkingInfo(userUuid);
}
String facebookUsername = socialNetworkingInfo.getFacebookUrl();
String linkedinUsername = socialNetworkingInfo.getLinkedinUrl();
String myspaceUsername = socialNetworkingInfo.getMyspaceUrl();
String skypeUsername = socialNetworkingInfo.getSkypeUsername();
String twitterUsername = socialNetworkingInfo.getTwitterUrl();
int visibleFieldCount_socialNetworking = 0;
//facebook
WebMarkupContainer facebookContainer = new WebMarkupContainer("facebookContainer");
facebookContainer.add(new Label("facebookLabel", new ResourceModel("profile.socialnetworking.facebook")));
facebookContainer.add(new ExternalLink("facebookLink", facebookUsername, facebookUsername));
socialNetworkingInfoContainer.add(facebookContainer);
if(StringUtils.isBlank(facebookUsername)) {
facebookContainer.setVisible(false);
} else {
visibleFieldCount_socialNetworking++;
}
//linkedin
WebMarkupContainer linkedinContainer = new WebMarkupContainer("linkedinContainer");
linkedinContainer.add(new Label("linkedinLabel", new ResourceModel("profile.socialnetworking.linkedin")));
linkedinContainer.add(new ExternalLink("linkedinLink", linkedinUsername, linkedinUsername));
socialNetworkingInfoContainer.add(linkedinContainer);
if(StringUtils.isBlank(linkedinUsername)) {
linkedinContainer.setVisible(false);
} else {
visibleFieldCount_socialNetworking++;
}
//myspace
WebMarkupContainer myspaceContainer = new WebMarkupContainer("myspaceContainer");
myspaceContainer.add(new Label("myspaceLabel", new ResourceModel("profile.socialnetworking.myspace")));
myspaceContainer.add(new ExternalLink("myspaceLink", myspaceUsername, myspaceUsername));
socialNetworkingInfoContainer.add(myspaceContainer);
if(StringUtils.isBlank(myspaceUsername)) {
myspaceContainer.setVisible(false);
} else {
visibleFieldCount_socialNetworking++;
}
//twitter
WebMarkupContainer twitterContainer = new WebMarkupContainer("twitterContainer");
twitterContainer.add(new Label("twitterLabel", new ResourceModel("profile.socialnetworking.twitter")));
twitterContainer.add(new ExternalLink("twitterLink", twitterUsername, twitterUsername));
socialNetworkingInfoContainer.add(twitterContainer);
if(StringUtils.isBlank(twitterUsername)) {
twitterContainer.setVisible(false);
} else {
visibleFieldCount_socialNetworking++;
}
//skypeme
WebMarkupContainer skypeContainer = new WebMarkupContainer("skypeContainer");
skypeContainer.add(new Label("skypeLabel", new ResourceModel("profile.socialnetworking.skype")));
skypeContainer.add(new ExternalLink("skypeLink", ProfileUtils.getSkypeMeURL(skypeUsername), new ResourceModel("profile.socialnetworking.skype.link").getObject()));
socialNetworkingInfoContainer.add(skypeContainer);
if(StringUtils.isBlank(skypeUsername)) {
skypeContainer.setVisible(false);
} else {
visibleFieldCount_socialNetworking++;
}
add(socialNetworkingInfoContainer);
//if nothing/not allowed, hide whole panel
if(visibleFieldCount_socialNetworking == 0 || !isSocialNetworkingInfoAllowed) {
socialNetworkingInfoContainer.setVisible(false);
} else {
visibleContainerCount++;
}
/* PERSONAL INFO */
WebMarkupContainer personalInfoContainer = new WebMarkupContainer("mainSectionContainer_personal");
personalInfoContainer.setOutputMarkupId(true);
//setup info
// favourites and other
String favouriteBooks = sakaiPerson.getFavouriteBooks();
String favouriteTvShows = sakaiPerson.getFavouriteTvShows();
String favouriteMovies = sakaiPerson.getFavouriteMovies();
String favouriteQuotes = sakaiPerson.getFavouriteQuotes();
int visibleFieldCount_personal = 0;
//heading
personalInfoContainer.add(new Label("mainSectionHeading_personal", new ResourceModel("heading.interests")));
//favourite books
WebMarkupContainer booksContainer = new WebMarkupContainer("booksContainer");
booksContainer.add(new Label("booksLabel", new ResourceModel("profile.favourite.books")));
booksContainer.add(new Label("favouriteBooks", favouriteBooks));
personalInfoContainer.add(booksContainer);
if(StringUtils.isBlank(favouriteBooks)) {
booksContainer.setVisible(false);
} else {
visibleFieldCount_personal++;
}
//favourite tv shows
WebMarkupContainer tvContainer = new WebMarkupContainer("tvContainer");
tvContainer.add(new Label("tvLabel", new ResourceModel("profile.favourite.tv")));
tvContainer.add(new Label("favouriteTvShows", favouriteTvShows));
personalInfoContainer.add(tvContainer);
if(StringUtils.isBlank(favouriteTvShows)) {
tvContainer.setVisible(false);
} else {
visibleFieldCount_personal++;
}
//favourite movies
WebMarkupContainer moviesContainer = new WebMarkupContainer("moviesContainer");
moviesContainer.add(new Label("moviesLabel", new ResourceModel("profile.favourite.movies")));
moviesContainer.add(new Label("favouriteMovies", favouriteMovies));
personalInfoContainer.add(moviesContainer);
if(StringUtils.isBlank(favouriteMovies)) {
moviesContainer.setVisible(false);
} else {
visibleFieldCount_personal++;
}
//favourite quotes
WebMarkupContainer quotesContainer = new WebMarkupContainer("quotesContainer");
quotesContainer.add(new Label("quotesLabel", new ResourceModel("profile.favourite.quotes")));
quotesContainer.add(new Label("favouriteQuotes", favouriteQuotes));
personalInfoContainer.add(quotesContainer);
if(StringUtils.isBlank(favouriteQuotes)) {
quotesContainer.setVisible(false);
} else {
visibleFieldCount_personal++;
}
add(personalInfoContainer);
//if nothing/not allowed, hide whole panel
if(visibleFieldCount_personal == 0 || !isPersonalInfoAllowed) {
personalInfoContainer.setVisible(false);
} else {
visibleContainerCount++;
}
/* NO INFO VISIBLE MESSAGE (hide if some visible) */
Label noContainersVisible = new Label ("noContainersVisible", new ResourceModel("text.view.profile.nothing"));
noContainersVisible.setOutputMarkupId(true);
add(noContainersVisible);
if(visibleContainerCount > 0) {
noContainersVisible.setVisible(false);
}
}
}