/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache 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.apache.org/licenses/LICENSE-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 net.java.sip.communicator.impl.muc;
import java.beans.*;
import net.java.sip.communicator.service.msghistory.*;
import net.java.sip.communicator.service.muc.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
import org.jitsi.util.event.*;
/**
* The ChatRoomWrapper is the representation of the ChatRoom
* in the GUI. It stores the information for the chat room even when the
* corresponding protocol provider is not connected.
*
* @author Yana Stamcheva
* @author Damian Minkov
*/
public class ChatRoomWrapperImpl
extends PropertyChangeNotifier
implements ChatRoomWrapper
{
/**
* The protocol provider to which the corresponding chat room belongs.
*/
private final ChatRoomProviderWrapper parentProvider;
/**
* The room that is wrapped.
*/
private ChatRoom chatRoom;
/**
* The room name.
*/
private final String chatRoomName;
/**
* The room id.
*/
private final String chatRoomID;
/**
* The property we use to store values in configuration service.
*/
private static final String AUTOJOIN_PROPERTY_NAME = "autoJoin";
/**
* As isAutoJoin can be called from GUI many times we store its value once
* retrieved to minimize calls to configuration service.
*/
private Boolean autoJoin = null;
/**
* By default all chat rooms are persistent from UI point of view.
* But we can override this and force not saving it.
* If not overridden we query the wrapped room.
*/
private Boolean persistent = null;
/**
* The prefix needed by the credential storage service to store the password
* of the chat room.
*/
private String passwordPrefix;
/**
* The property change listener for the message service.
*/
private PropertyChangeListener propertyListener
= new PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent e)
{
MessageHistoryService mhs = MUCActivator.getMessageHistoryService();
if(!mhs.isHistoryLoggingEnabled()
|| !mhs.isHistoryLoggingEnabled(getChatRoomID()))
{
MUCService.setChatRoomAutoOpenOption(
getParentProvider().getProtocolProvider(),
getChatRoomID(),
MUCService.OPEN_ON_ACTIVITY);
}
}
};
/**
* Creates a ChatRoomWrapper by specifying the protocol provider,
* the identifier and the name of the chat room.
*
* @param parentProvider the protocol provider to which the corresponding
* chat room belongs
* @param chatRoomID the identifier of the corresponding chat room
* @param chatRoomName the name of the corresponding chat room
*/
public ChatRoomWrapperImpl( ChatRoomProviderWrapper parentProvider,
String chatRoomID,
String chatRoomName)
{
this.parentProvider = parentProvider;
this.chatRoomID = chatRoomID;
this.chatRoomName = chatRoomName;
passwordPrefix = ConfigurationUtils.getChatRoomPrefix(
getParentProvider().getProtocolProvider().getAccountID()
.getAccountUniqueID(), chatRoomID) + ".password";
MUCActivator.getConfigurationService().addPropertyChangeListener(
MessageHistoryService.PNAME_IS_MESSAGE_HISTORY_ENABLED,
propertyListener);
MUCActivator.getConfigurationService().addPropertyChangeListener(
MessageHistoryService
.PNAME_IS_MESSAGE_HISTORY_PER_CONTACT_ENABLED_PREFIX + "."
+ getChatRoomID(),
propertyListener);
}
/**
* Creates a ChatRoomWrapper by specifying the corresponding chat
* room.
*
* @param parentProvider the protocol provider to which the corresponding
* chat room belongs
* @param chatRoom the chat room to which this wrapper corresponds.
*/
public ChatRoomWrapperImpl( ChatRoomProviderWrapper parentProvider,
ChatRoom chatRoom)
{
this( parentProvider,
chatRoom.getIdentifier(),
chatRoom.getName());
this.chatRoom = chatRoom;
}
/**
* Returns the ChatRoom that this wrapper represents.
*
* @return the ChatRoom that this wrapper represents.
*/
public ChatRoom getChatRoom()
{
return chatRoom;
}
/**
* Sets the ChatRoom that this wrapper represents.
*
* @param chatRoom the chat room
*/
public void setChatRoom(ChatRoom chatRoom)
{
this.chatRoom = chatRoom;
}
/**
* Returns the chat room name.
*
* @return the chat room name
*/
public String getChatRoomName()
{
return chatRoomName;
}
/**
* Returns the identifier of the chat room.
*
* @return the identifier of the chat room
*/
public String getChatRoomID()
{
return chatRoomID;
}
/**
* Returns the parent protocol provider.
*
* @return the parent protocol provider
*/
public ChatRoomProviderWrapper getParentProvider()
{
return this.parentProvider;
}
/**
* Returns true
if the chat room is persistent,
* otherwise - returns false
.
*
* @return true
if the chat room is persistent,
* otherwise - returns false
.
*/
public boolean isPersistent()
{
if(persistent == null)
{
if(chatRoom != null)
persistent = chatRoom.isPersistent();
else
return true;
}
return persistent;
}
/**
* Change persistence of this room.
* @param value set persistent state.
*/
public void setPersistent(boolean value)
{
this.persistent = value;
}
/**
* Stores the password for the chat room.
*
* @param password the password to store
*/
public void savePassword(String password)
{
MUCActivator.getCredentialsStorageService()
.storePassword(passwordPrefix, password);
}
/**
* Returns the password for the chat room.
*
* @return the password
*/
public String loadPassword()
{
return MUCActivator.getCredentialsStorageService()
.loadPassword(passwordPrefix);
}
/**
* Removes the saved password for the chat room.
*/
public void removePassword()
{
MUCActivator.getCredentialsStorageService()
.removePassword(passwordPrefix);
}
/**
* Is room set to auto join on start-up.
* @return is auto joining enabled.
*/
public boolean isAutojoin()
{
if(autoJoin == null)
{
String val = ConfigurationUtils.getChatRoomProperty(
getParentProvider().getProtocolProvider(),
getChatRoomID(), AUTOJOIN_PROPERTY_NAME);
autoJoin = Boolean.valueOf(val);
}
return autoJoin;
}
/**
* Changes auto join value in configuration service.
*
* @param value change of auto join property.
*/
public void setAutoJoin(boolean value)
{
autoJoin = value;
// as the user wants to autojoin this room
// and it maybe already created as non persistent
// we must set it persistent and store it
if(!isPersistent())
{
setPersistent(true);
ConfigurationUtils.saveChatRoom(
getParentProvider().getProtocolProvider(),
getChatRoomID(),
getChatRoomID(),
getChatRoomName());
}
if(value)
{
ConfigurationUtils.updateChatRoomProperty(
getParentProvider().getProtocolProvider(),
chatRoomID, AUTOJOIN_PROPERTY_NAME, Boolean.toString(autoJoin));
}
else
{
ConfigurationUtils.updateChatRoomProperty(
getParentProvider().getProtocolProvider(),
chatRoomID, AUTOJOIN_PROPERTY_NAME, null);
}
MUCActivator.getMUCService().fireChatRoomListChangedEvent(this,
ChatRoomListChangeEvent.CHAT_ROOM_CHANGED);
}
/**
* Removes the listeners.
*/
public void removeListeners()
{
MUCActivator.getConfigurationService().removePropertyChangeListener(
MessageHistoryService.PNAME_IS_MESSAGE_HISTORY_ENABLED,
propertyListener);
MUCActivator.getConfigurationService().removePropertyChangeListener(
MessageHistoryService
.PNAME_IS_MESSAGE_HISTORY_PER_CONTACT_ENABLED_PREFIX + "."
+ getChatRoomID(),
propertyListener);
}
/**
* Fire property change.
* @param property
*/
public void firePropertyChange(String property)
{
super.firePropertyChange(property, null, null);
}
}