001 /** 002 * Copyright 2004-2013 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.hr.time.timezone.service; 017 018 import java.util.List; 019 020 import org.apache.commons.lang.ObjectUtils; 021 import org.apache.commons.lang.StringUtils; 022 import org.joda.time.DateTime; 023 import org.joda.time.DateTimeZone; 024 import org.kuali.hr.job.Job; 025 import org.kuali.hr.location.Location; 026 import org.kuali.hr.time.principal.PrincipalHRAttributes; 027 import org.kuali.hr.time.service.base.TkServiceLocator; 028 import org.kuali.hr.time.timeblock.TimeBlock; 029 import org.kuali.hr.time.util.TKContext; 030 import org.kuali.hr.time.util.TKUtils; 031 import org.kuali.rice.krad.util.GlobalVariables; 032 033 public class TimezoneServiceImpl implements TimezoneService { 034 035 @Override 036 public String getUserTimezone(String principalId) { 037 PrincipalHRAttributes principalCalendar = TkServiceLocator.getPrincipalHRAttributeService().getPrincipalCalendar(principalId, TKUtils.getCurrentDate()); 038 if(principalCalendar != null && principalCalendar.getTimezone() != null){ 039 return principalCalendar.getTimezone(); 040 } 041 List<Job> jobs = TkServiceLocator.getJobService().getJobs(principalId, TKUtils.getCurrentDate()); 042 if (jobs.size() > 0) { 043 // Grab the location off the first job in the list 044 Location location = TkServiceLocator.getLocationService().getLocation(jobs.get(0).getLocation(), TKUtils.getCurrentDate()); 045 if (location!=null){ 046 if(StringUtils.isNotBlank(location.getTimezone())){ 047 return location.getTimezone(); 048 } 049 } 050 } 051 return TKUtils.getSystemTimeZone(); 052 } 053 054 /** 055 * Used to determine if an override condition exists for a user timezone 056 */ 057 @Override 058 public String getUserTimezone() { 059 String timezone = ""; 060 if (GlobalVariables.getUserSession() != null) { 061 timezone = getUserTimezone(GlobalVariables.getUserSession().getPrincipalId()); 062 } 063 return timezone; 064 } 065 066 @Override 067 public DateTimeZone getUserTimezoneWithFallback() { 068 String tzid = getUserTimezone(); 069 if (StringUtils.isEmpty(tzid)) { 070 return TKUtils.getSystemDateTimeZone(); 071 } else { 072 return DateTimeZone.forID(tzid); 073 } 074 } 075 076 private DateTimeZone getUserTimezoneWithFallback(String principalId) { 077 String tzid = getUserTimezone(principalId); 078 if (StringUtils.isEmpty(tzid)) { 079 return TKUtils.getSystemDateTimeZone(); 080 } else { 081 return DateTimeZone.forID(tzid); 082 } 083 } 084 085 /** 086 * Translation needed for UI Display 087 * @param timeBlocks 088 * @param timezone 089 * @return timeblock list modified with times offset for timezone 090 */ 091 public List<TimeBlock> translateForTimezone(List<TimeBlock> timeBlocks, DateTimeZone timezone){ 092 for(TimeBlock tb : timeBlocks){ 093 //No need for translation if it matches the current timezone 094 if(ObjectUtils.equals(timezone, TKUtils.getSystemDateTimeZone())){ 095 tb.setBeginTimeDisplay(new DateTime(tb.getBeginTimestamp())); 096 tb.setEndTimeDisplay(new DateTime(tb.getEndTimestamp())); 097 } 098 else { 099 tb.setBeginTimeDisplay(new DateTime(tb.getBeginTimestamp(), timezone)); 100 tb.setEndTimeDisplay(new DateTime(tb.getEndTimestamp(), timezone)); 101 } 102 } 103 return timeBlocks; 104 } 105 106 public void translateForTimezone(List<TimeBlock> timeBlocks) { 107 if (timeBlocks.isEmpty()) { 108 translateForTimezone(timeBlocks, getUserTimezoneWithFallback()); 109 } 110 else { 111 translateForTimezone(timeBlocks, getUserTimezoneWithFallback(timeBlocks.get(0).getPrincipalId())); 112 } 113 } 114 115 @Override 116 public boolean isSameTimezone() { 117 String userTimezone = getUserTimezone(); 118 if(StringUtils.isNotBlank(userTimezone)) { 119 return StringUtils.equals(TKUtils.getSystemTimeZone(), userTimezone); 120 } 121 return true; 122 } 123 124 125 public long getTimezoneOffsetFromServerTime(DateTimeZone dtz){ 126 long systemOffsetUTC = TKUtils.getSystemDateTimeZone().getOffset(null); 127 long tzOffsetUTC = dtz.getOffset(null); 128 return tzOffsetUTC - systemOffsetUTC; 129 } 130 131 132 133 }