parent
							
								
									370089f3e1
								
							
						
					
					
						commit
						cc0ac2e4d2
					
				| @ -1,161 +0,0 @@ | ||||
| /* | ||||
|  This file is part of Libresonic. | ||||
| 
 | ||||
|  Libresonic is free software: you can redistribute it and/or modify | ||||
|  it under the terms of the GNU General Public License as published by | ||||
|  the Free Software Foundation, either version 3 of the License, or | ||||
|  (at your option) any later version. | ||||
| 
 | ||||
|  Libresonic is distributed in the hope that it will be useful, | ||||
|  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  GNU General Public License for more details. | ||||
| 
 | ||||
|  You should have received a copy of the GNU General Public License | ||||
|  along with Libresonic.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
|  Copyright 2016 (C) Libresonic Authors | ||||
|  Based upon Subsonic, Copyright 2009 (C) Sindre Mehus | ||||
|  */ | ||||
| package org.libresonic.player.ajax; | ||||
| 
 | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.directwebremoting.WebContext; | ||||
| import org.directwebremoting.WebContextFactory; | ||||
| import org.libresonic.player.Logger; | ||||
| import org.libresonic.player.service.SecurityService; | ||||
| import org.libresonic.player.util.BoundedList; | ||||
| 
 | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
| 
 | ||||
| import java.io.Serializable; | ||||
| import java.util.*; | ||||
| import java.util.concurrent.Executors; | ||||
| import java.util.concurrent.ScheduledExecutorService; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| 
 | ||||
| /** | ||||
|  * Provides AJAX-enabled services for the chatting. | ||||
|  * This class is used by the DWR framework (http://getahead.ltd.uk/dwr/).
 | ||||
|  * | ||||
|  * @author Sindre Mehus | ||||
|  */ | ||||
| public class ChatService { | ||||
| 
 | ||||
|     private static final Logger LOG = Logger.getLogger(ChatService.class); | ||||
|     private static final String CACHE_KEY = "1"; | ||||
|     private static final int MAX_MESSAGES = 10; | ||||
|     private static final long TTL_MILLIS = 3L * 24L * 60L * 60L * 1000L; // 3 days.
 | ||||
| 
 | ||||
|     private final LinkedList<Message> messages = new BoundedList<Message>(MAX_MESSAGES); | ||||
|     private SecurityService securityService; | ||||
| 
 | ||||
|     private long revision = System.identityHashCode(this); | ||||
| 
 | ||||
|     /** | ||||
|      * Invoked by Spring. | ||||
|      */ | ||||
|     public void init() { | ||||
|         // Delete old messages every hour.
 | ||||
|         ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); | ||||
|         Runnable runnable = new Runnable() { | ||||
|             public void run() { | ||||
|                 removeOldMessages(); | ||||
|             } | ||||
|         }; | ||||
|         executor.scheduleWithFixedDelay(runnable, 0L, 3600L, TimeUnit.SECONDS); | ||||
|     } | ||||
| 
 | ||||
|     private synchronized void removeOldMessages() { | ||||
|         long now = System.currentTimeMillis(); | ||||
|         for (Iterator<Message> iterator = messages.iterator(); iterator.hasNext();) { | ||||
|             Message message = iterator.next(); | ||||
|             if (now - message.getDate().getTime() > TTL_MILLIS) { | ||||
|                 iterator.remove(); | ||||
|                 revision++; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public synchronized void addMessage(String message) { | ||||
|         WebContext webContext = WebContextFactory.get(); | ||||
|         doAddMessage(message, webContext.getHttpServletRequest()); | ||||
|     } | ||||
| 
 | ||||
|     public synchronized void doAddMessage(String message, HttpServletRequest request) { | ||||
| 
 | ||||
|         String user = securityService.getCurrentUsername(request); | ||||
|         message = StringUtils.trimToNull(message); | ||||
|         if (message != null && user != null) { | ||||
|             messages.addFirst(new Message(message, user, new Date())); | ||||
|             revision++; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public synchronized void clearMessages() { | ||||
|         messages.clear(); | ||||
|         revision++; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns all messages, but only if the given revision is different from the | ||||
|      * current revision. | ||||
|      */ | ||||
|     public synchronized Messages getMessages(long revision) { | ||||
|         if (this.revision != revision) { | ||||
|             return new Messages(new ArrayList<Message>(messages), this.revision); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public void setSecurityService(SecurityService securityService) { | ||||
|         this.securityService = securityService; | ||||
|     } | ||||
| 
 | ||||
|     public static class Messages implements Serializable { | ||||
| 
 | ||||
|         private static final long serialVersionUID = -752602719879818165L; | ||||
|         private final  List<Message> messages; | ||||
|         private final long revision; | ||||
| 
 | ||||
|         public Messages(List<Message> messages, long revision) { | ||||
|             this.messages = messages; | ||||
|             this.revision = revision; | ||||
|         } | ||||
| 
 | ||||
|         public List<Message> getMessages() { | ||||
|             return messages; | ||||
|         } | ||||
| 
 | ||||
|         public long getRevision() { | ||||
|             return revision; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static class Message implements Serializable { | ||||
| 
 | ||||
|         private static final long serialVersionUID = -1907101191518133712L; | ||||
|         private final String content; | ||||
|         private final String username; | ||||
|         private final Date date; | ||||
| 
 | ||||
|         public Message(String content, String username, Date date) { | ||||
|             this.content = content; | ||||
|             this.username = username; | ||||
|             this.date = date; | ||||
|         } | ||||
| 
 | ||||
|         public String getContent() { | ||||
|             return content; | ||||
|         } | ||||
| 
 | ||||
|         public String getUsername() { | ||||
|             return username; | ||||
|         } | ||||
| 
 | ||||
|         public Date getDate() { | ||||
|             return date; | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,6 @@ | ||||
| <databaseChangeLog | ||||
|         xmlns="http://www.liquibase.org/xml/ns/dbchangelog" | ||||
|         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|         xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> | ||||
|     <include file="remove-show-chat.xml" relativeToChangelogFile="true"/> | ||||
| </databaseChangeLog> | ||||
| @ -0,0 +1,12 @@ | ||||
| <databaseChangeLog | ||||
|         xmlns="http://www.liquibase.org/xml/ns/dbchangelog" | ||||
|         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|         xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> | ||||
|     <changeSet id="remove-show-chat_001" author="muff1nman"> | ||||
|         <preConditions onFail="MARK_RAN"> | ||||
|             <columnExists tableName="user_settings" columnName="show_chat" /> | ||||
|         </preConditions> | ||||
|         <dropColumn tableName="user_settings" columnName="show_chat" /> | ||||
|         <rollback changeSetId="schema38_003" changeSetPath="classpath:liquibase/legacy/schema38.xml" changeSetAuthor="muff1nman"/> | ||||
|     </changeSet> | ||||
| </databaseChangeLog> | ||||
					Loading…
					
					
				
		Reference in new issue