/*******************************************************************************
* Copyright (c) 2010 xored software, Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* xored software, Inc. - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.internal.logconsole;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.dltk.logconsole.ILogConsole;
import org.eclipse.dltk.logconsole.ILogConsoleManager;
import org.eclipse.dltk.logconsole.LogConsoleType;
public class LogConsoleManager implements ILogConsoleManager {
public ILogConsole getConsole(LogConsoleType consoleType) {
return getConsole(consoleType, null);
}
protected static final LogConsoleType DEFAULT_CONSOLE_TYPE = new LogConsoleType(
"org.eclipse.dltk.logconsole.DEFAULT");
private static class ConsoleKey {
final LogConsoleType consoleType;
final Object identifier;
public ConsoleKey(LogConsoleType consoleType, Object identifier) {
this.consoleType = consoleType != null ? consoleType
: DEFAULT_CONSOLE_TYPE;
this.identifier = identifier;
}
@Override
public int hashCode() {
int result = consoleType.hashCode();
if (identifier != null) {
result = result * 13 + identifier.hashCode();
}
return result;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof ConsoleKey) {
final ConsoleKey other = (ConsoleKey) obj;
if (consoleType.equals(other.consoleType)) {
return identifier != null ? identifier
.equals(other.identifier)
: other.identifier == null;
}
}
return false;
}
}
private final Object lock = new Object();
private final Map<ConsoleKey, ILogConsole> consoles = new HashMap<ConsoleKey, ILogConsole>();
public ILogConsole getConsole(LogConsoleType consoleType, Object identifier) {
final ConsoleKey key = new ConsoleKey(consoleType, identifier);
synchronized (lock) {
final ILogConsole console = consoles.get(key);
if (console != null) {
return console;
}
}
final ILogConsole console = createConsole(key);
synchronized (lock) {
final ILogConsole c = consoles.get(key);
if (c != null) {
disposeConsole(console);
return c;
}
consoles.put(key, console);
}
return console;
}
private void disposeConsole(ILogConsole console) {
// TODO Auto-generated method stub
}
private ILogConsole createConsole(ConsoleKey key) {
final ILogConsole console = LogConsoleFactoryManager.getInstance()
.create(key.consoleType, key.identifier);
if (console != null) {
return console;
}
return new NopLogConsole(key.consoleType, key.identifier);
}
public ILogConsole[] list(LogConsoleType consoleType) {
final List<ILogConsole> result = new ArrayList<ILogConsole>();
synchronized (lock) {
for (Map.Entry<ConsoleKey, ILogConsole> entry : consoles.entrySet()) {
if (consoleType.equals(entry.getKey().consoleType)) {
result.add(entry.getValue());
}
}
}
return result.toArray(new ILogConsole[result.size()]);
}
}