001    /**
002     * Copyright 2004-2012 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.StringUtils;
021    import org.joda.time.DateTime;
022    import org.joda.time.DateTimeZone;
023    import org.kuali.hr.job.Job;
024    import org.kuali.hr.location.Location;
025    import org.kuali.hr.time.principal.PrincipalHRAttributes;
026    import org.kuali.hr.time.service.base.TkServiceLocator;
027    import org.kuali.hr.time.timeblock.TimeBlock;
028    import org.kuali.hr.time.util.TKContext;
029    import org.kuali.hr.time.util.TKUtils;
030    import org.kuali.hr.time.util.TkConstants;
031    
032    public class TimezoneServiceImpl implements TimezoneService {
033    
034        @Override
035        public String getUserTimezone(String principalId) {
036            PrincipalHRAttributes principalCalendar = TkServiceLocator.getPrincipalHRAttributeService().getPrincipalCalendar(principalId, TKUtils.getCurrentDate());
037            if(principalCalendar != null && principalCalendar.getTimezone() != null){
038                return principalCalendar.getTimezone();
039            }
040            List<Job> jobs = TkServiceLocator.getJobService().getJobs(TKContext.getPrincipalId(), TKUtils.getCurrentDate());
041            if (jobs.size() > 0) {
042                // Grab the location off the first job in the list
043                Location location = TkServiceLocator.getLocationService().getLocation(jobs.get(0).getLocation(), TKUtils.getCurrentDate());
044                if (location!=null){
045                    if(StringUtils.isNotBlank(location.getTimezone())){
046                        return location.getTimezone();
047                    }
048                }
049            }
050            return TKUtils.getSystemTimeZone();
051        }
052    
053        /**
054             * Used to determine if an override condition exists for a user timezone
055             */
056            @Override
057            public String getUserTimezone() {
058            return getUserTimezone(TKContext.getPrincipalId());
059            }
060    
061        @Override
062        public DateTimeZone getUserTimezoneWithFallback() {
063            String tzid = getUserTimezone();
064            if (StringUtils.isEmpty(tzid)) {
065                return TKUtils.getSystemDateTimeZone();
066            } else {
067                return DateTimeZone.forID(tzid);
068            }
069        }
070    
071            /**
072             * Translation needed for UI Display
073             * @param timeBlocks
074             * @param timezone
075             * @return timeblock list modified with times offset for timezone
076             */
077            public List<TimeBlock> translateForTimezone(List<TimeBlock> timeBlocks, String timezone){
078                    for(TimeBlock tb : timeBlocks){
079                            //No need for translation if it matches the current timezone
080                            if(StringUtils.equals(timezone, TKUtils.getSystemTimeZone())){
081                                    tb.setBeginTimeDisplay(new DateTime(tb.getBeginTimestamp()));
082                                    tb.setEndTimeDisplay(new DateTime(tb.getEndTimestamp()));
083                            }
084                            else {
085                                    tb.setBeginTimeDisplay(new DateTime(tb.getBeginTimestamp(),DateTimeZone.forID(timezone)));
086                                    tb.setEndTimeDisplay(new DateTime(tb.getEndTimestamp(), DateTimeZone.forID(timezone)));
087                            }
088                    }
089                    return timeBlocks;
090            }
091    
092        public void translateForTimezone(List<TimeBlock> timeBlocks) {
093            translateForTimezone(timeBlocks, getUserTimezone());
094        }
095    
096            @Override
097            public boolean isSameTimezone() {
098                    String userTimezone = getUserTimezone();
099                    if(StringUtils.isNotBlank(userTimezone)) {
100                            return StringUtils.equals(TKUtils.getSystemTimeZone(), userTimezone);
101                    }
102                    return true;
103            }
104            
105            
106            public long getTimezoneOffsetFromServerTime(DateTimeZone dtz){
107                    long systemOffsetUTC = TKUtils.getSystemDateTimeZone().getOffset(null);
108                    long tzOffsetUTC = dtz.getOffset(null);
109                    return tzOffsetUTC - systemOffsetUTC;
110            }
111    
112    
113    
114    }