/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.runtime.ui.views.content;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
import org.eclipse.wst.server.core.IServer;
import org.teiid.designer.runtime.spi.ITeiidServer;
import org.teiid.designer.runtime.ui.DqpUiConstants;
import org.teiid.designer.runtime.ui.views.TeiidServerContentProvider;
/**
* Root node of the {@link ITeiidServer} tree view.
*
* The node is cached against its {@link TeiidServerContentProvider} so that the same
* node can be returned, allowing calls to method like setExpandedState(node, true) to
* still work.
*
* @since 8.0
*/
public class TeiidResourceNode extends TeiidContentNode implements ITeiidResourceNode {
private static Map<String, ITeiidResourceNode> nodeCache = new WeakHashMap<String, ITeiidResourceNode>();
private ArrayList<ITeiidContentNode<? extends ITeiidContainerNode<?>>> children;
private TeiidServerContentProvider provider;
private ITeiidServer teiidServer;
private TeiidErrorNode error;
private boolean dirty = true;
/**
* @param server
* @param provider
*
* @return new or cached {@link ITeiidResourceNode}
*/
public static ITeiidResourceNode getInstance(IServer server, TeiidServerContentProvider provider) {
String key = server.toString() + provider.toString();
ITeiidResourceNode node = nodeCache.get(key);
if (node == null) {
node = new TeiidResourceNode(server, provider);
nodeCache.put(key, node);
}
return node;
}
/**
* Create a new instance
*
* @param server
* @param provider
*/
private TeiidResourceNode(IServer server, TeiidServerContentProvider provider) {
super(server, DqpUiConstants.UTIL.getString(TeiidResourceNode.class.getSimpleName() + ".label")); //$NON-NLS-1$
this.provider = provider;
}
@Override
public void setDirty() {
dirty = true;
}
@Override
public final List<? extends ITeiidContentNode<?>> getChildren() {
if (dirty) {
/*
* node flagged as dirty so the children are out-of-date. Avoid
* returning them thereby making the content provider reload
* them.
*/
return null;
}
if (error != null) {
return Collections.singletonList(error);
}
return children;
}
@Override
public final void load() {
clearChildren();
if (getServer().getServerState() != IServer.STATE_STARTED) {
setError(new TeiidErrorNode(this, null, DqpUiConstants.UTIL.getString(getClass().getSimpleName() + ".labelNotConnected"))); //$NON-NLS-1$
dirty = false;
return;
}
synchronized(provider) {
try {
teiidServer = (ITeiidServer)getServer().loadAdapter(ITeiidServer.class, null);
if (teiidServer == null) {
setError(new TeiidErrorNode(this, teiidServer, DqpUiConstants.UTIL.getString(getClass().getSimpleName()
+ ".labelNotConnected"))); //$NON-NLS-1$
return;
}
if (teiidServer.isConnecting() && ! teiidServer.isConnected()) {
setError(new TeiidErrorNode(this, teiidServer, DqpUiConstants.UTIL.getString(getClass().getSimpleName()
+ ".labelConnecting"))); //$NON-NLS-1$
return;
}
if (teiidServer.isConnected()) {
if (children == null)
children = new ArrayList<ITeiidContentNode<? extends ITeiidContainerNode<?>>>();
children.add(new TeiidServerContainerNode(this, provider));
clearError();
} else {
setError(new TeiidErrorNode(this, teiidServer, DqpUiConstants.UTIL.getString(getClass().getSimpleName()
+ ".labelNotConnected"))); //$NON-NLS-1$
}
} catch (Exception e) {
DqpUiConstants.UTIL.log(e);
setError(new TeiidErrorNode(this, teiidServer, DqpUiConstants.UTIL.getString(getClass().getSimpleName()
+ ".labelRetrievalError"))); //$NON-NLS-1$
} finally {
dirty = false;
}
}
}
private void clearChildren() {
synchronized (provider) {
clearError();
if (children != null) {
for (ITeiidContentNode<? extends ITeiidContainerNode<?>> child : children) {
child.dispose();
}
children.clear();
children = null;
}
teiidServer = null;
}
}
private void clearError() {
if (error != null) {
error.dispose();
error = null;
}
}
protected void setError(TeiidErrorNode error) {
clearError();
this.error = error;
}
@Override
public void dispose() {
clearChildren();
super.dispose();
}
/**
* @return the teiidServer
*/
@Override
public ITeiidServer getTeiidServer() {
return this.teiidServer;
}
@Override
public boolean hasChildren() {
if (dirty)
return false;
return children != null && ! children.isEmpty();
}
@Override
public String toString() {
if (teiidServer == null)
return DqpUiConstants.UTIL.getString(TeiidResourceNode.class.getSimpleName() + ".labelNotConnected"); //$NON-NLS-1$
String ttip = teiidServer.toString();
if( teiidServer.getConnectionError() != null ) {
ttip = ttip + "\n\n" + teiidServer.getConnectionError(); //$NON-NLS-1$
}
return ttip;
}
}