/*
* Copyright 2000-2006 JetBrains s.r.o.
*
* 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 jetbrains.communicator.core.impl.users;
import jetbrains.communicator.commands.Helper;
import jetbrains.communicator.core.EventBroadcaster;
import jetbrains.communicator.core.Pico;
import jetbrains.communicator.core.impl.NullTransport;
import jetbrains.communicator.core.transport.CodePointerXmlMessage;
import jetbrains.communicator.core.transport.TextXmlMessage;
import jetbrains.communicator.core.transport.Transport;
import jetbrains.communicator.core.transport.XmlMessage;
import jetbrains.communicator.core.users.User;
import jetbrains.communicator.core.users.UserPresence;
import jetbrains.communicator.core.vfs.CodePointer;
import jetbrains.communicator.core.vfs.ProjectsData;
import jetbrains.communicator.core.vfs.VFile;
import jetbrains.communicator.ide.IDEFacade;
import jetbrains.communicator.ide.SendCodePointerEvent;
import jetbrains.communicator.ide.SendMessageEvent;
import jetbrains.communicator.util.TimeoutCachedValue;
import javax.swing.*;
import java.util.List;
/**
* @author Kir
*/
public final class UserImpl extends BaseUserImpl {
private final String myTransportCode;
private transient Transport myTransport;
private static final int CACHE_TIMEOUT = 800;
private transient TimeoutCachedValue<UserPresence> myUserPresenceCache;
private transient TimeoutCachedValue<Icon> myIconCache;
private UserImpl(String name, String transportCode) {
super(name, "");
myTransportCode = transportCode;
}
public static User create(String name, String transportCode) {
assert transportCode != null : "Null transport code. Use Fake for tests";
return new UserImpl(name, transportCode);
}
@Override
public String getTransportCode() {
return myTransportCode;
}
@Override
public UserPresence getPresence() {
updateVars();
return myUserPresenceCache.getValue();
}
@Override
public boolean isOnline() {
if (isSelf()) return getTransport().isOnline();
return getTransport().getUserPresence(this).isOnline();
}
@Override
public boolean isSelf() {
return getTransport().isSelf(this);
}
@Override
public Icon getIcon() {
updateVars();
return myIconCache.getValue();
}
@Override
public String[] getProjects() {
return getTransport().getProjects(this);
}
@Override
public ProjectsData getProjectsData(IDEFacade ideFacade) {
return Helper.doGetProjectsData(getTransport(), this, ideFacade);
}
@Override
public String getVFile(VFile vFile, IDEFacade ideFacade) {
Helper.fillVFileContent(getTransport(), this, vFile, ideFacade);
return vFile.getContents();
}
@Override
public void sendMessage(final String message, EventBroadcaster eventBroadcaster) {
eventBroadcaster.doChange(new SendMessageEvent(message, this), () -> sendXmlMessage(new TextXmlMessage(message)));
}
@Override
public void sendCodeIntervalPointer(final VFile file, final CodePointer pointer,
final String comment, EventBroadcaster eventBroadcaster) {
eventBroadcaster.doChange(new SendCodePointerEvent(comment, file, pointer, this),
() -> sendXmlMessage(new CodePointerXmlMessage(comment, pointer, file)));
}
@Override
public void sendXmlMessage(XmlMessage message) {
getTransport().sendXmlMessage(this, message);
}
@Override
public boolean hasIDEtalkClient() {
return getTransport().hasIdeTalkClient(this);
}
Transport getTransport() {
if (myTransport == null) {
myTransport = _getTransport();
}
return myTransport;
}
private Transport _getTransport() {
List availableTransports = Pico.getInstance().getComponentInstancesOfType(Transport.class);
for (Object availableTransport : availableTransports) {
Transport transport = (Transport) availableTransport;
if (transport.getName().equals(myTransportCode)) {
return transport;
}
}
return new NullTransport();
}
private void updateVars() {
if (myUserPresenceCache == null) {
myUserPresenceCache = new TimeoutCachedValue<UserPresence>(CACHE_TIMEOUT) {
@Override
protected UserPresence calculate() {
return getTransport().getUserPresence(UserImpl.this);
}
};
myIconCache = new TimeoutCachedValue<Icon>(CACHE_TIMEOUT) {
@Override
protected Icon calculate() {
return getTransport().getIcon(getPresence());
}
};
}
}
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof UserImpl)) return false;
if (!super.equals(o)) return false;
final UserImpl user = (UserImpl) o;
return !(myTransportCode != null ? !myTransportCode.equals(user.myTransportCode) : user.myTransportCode != null);
}
public int hashCode() {
int result = super.hashCode();
result = 29 * result + (myTransportCode != null ? myTransportCode.hashCode() : 0);
return result;
}
}