/*******************************************************************************
* Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.tools.workbench.scplugin.ui.broker;
// JDK
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContextHolder;
import org.eclipse.persistence.tools.workbench.framework.uitools.AddRemoveListPanel;
import org.eclipse.persistence.tools.workbench.scplugin.model.adapter.SessionAdapter;
import org.eclipse.persistence.tools.workbench.scplugin.model.adapter.SessionBrokerAdapter;
import org.eclipse.persistence.tools.workbench.scplugin.model.adapter.TopLinkSessionsAdapter;
import org.eclipse.persistence.tools.workbench.scplugin.ui.tools.AbstractSessionsListPane;
import org.eclipse.persistence.tools.workbench.scplugin.ui.tools.SessionCellRendererAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.CollectionAspectAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.CollectionValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyAspectAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.ReadOnlyCollectionValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.ListModelAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.swing.ObjectListSelectionModel;
import org.eclipse.persistence.tools.workbench.uitools.cell.CellRendererAdapter;
import org.eclipse.persistence.tools.workbench.utility.CollectionTools;
import org.eclipse.persistence.tools.workbench.utility.events.CollectionChangeEvent;
import org.eclipse.persistence.tools.workbench.utility.events.CollectionChangeListener;
// Mapping Workbench
/**
* This pane shows the list of {@link SessionsAdapter}s contained in a
* {@link SessionBrokerAdapter}.
* <p>
* Here the layout:
* <pre>
* _______________________________
* | |
* | {@link AbstractSessionsListPane} |
* | |
* -------------------------------</pre>
*
* @see SessionBrokerAdapter
*
* @version 10.0.3
* @author Pascal Filion
*/
final class SessionsListPane extends AbstractSessionsListPane
{
/**
* Creates a new <code>AbstractSessionsListPane</code>.
*
* @param subjectHolder The holder of {@link SessionBrokerAdapter}
* @param context
*/
SessionsListPane(PropertyValueModel subjectHolder,
WorkbenchContextHolder contextHolder)
{
super(subjectHolder, contextHolder);
}
/**
* Requests to add unmanaged sessions to the edited session brokers.
*/
protected void addNewSession()
{
CollectionValueModel itemHolder = buildUnmanagedSessionsCollectionHolder();
ObjectListSelectionModel selectionModel = buildSelectionModel(itemHolder);
// Show the list of unmanaged Sessions
SessionsListDialog dialog = new SessionsListDialog
(
getWorkbenchContext(),
itemHolder,
selectionModel,
buildLabelDecorator()
);
dialog.setVisible(true);
if (dialog.wasCanceled())
return;
// Add the selected Sessions to the Session Broker
Iterator iter = CollectionTools.iterator(selectionModel.getSelectedValues());
while (iter.hasNext())
{
SessionBrokerAdapter sessionBroker = (SessionBrokerAdapter) subject();
SessionAdapter session = (SessionAdapter) iter.next();
sessionBroker.manage(session.getName());
}
}
/**
* Creates a new <code>LabelDecorator</code> that decorates {@link SessionAdapter}s.
*
* @return A new {@link SessionLabelDecorator}
*/
private CellRendererAdapter buildLabelDecorator()
{
return new SessionCellRendererAdapter(resourceRepository());
}
/**
* Creates the <code>ObjectListSelectionModel</code> responsible to keep the
* selected items from the list.
*
* @return A new <code>ObjectListSelectionModel</code>
*/
private ObjectListSelectionModel buildSelectionModel(CollectionValueModel itemHolder)
{
ListModelAdapter adapter = new ListModelAdapter(itemHolder);
return new ObjectListSelectionModel(adapter);
}
/**
* Creates a new <code>AddRemoveListPanel</code> that will shows the sessions
* contained in the sessions.xml.
*
* @return A new <code>AddRemoveListPanel</code>
*/
protected AddRemoveListPanel buildSessionListPane()
{
AddRemoveListPanel panel = super.buildSessionListPane();
registerListenerToUpdateAddButtonEnableState(panel);
return panel;
}
/**
* Creates the <code>CollectionValueModel</code> containing all the items to
* be shown in the Sessions list.
*
* @return A new <code>CollectionValueModel</code>
*/
protected CollectionValueModel buildSessionsCollectionHolder()
{
return new CollectionAspectAdapter(getSubjectHolder(), SessionBrokerAdapter.SESSIONS_COLLECTION)
{
protected Iterator getValueFromSubject()
{
return ((SessionBrokerAdapter) subject).sessions();
}
protected int sizeFromSubject()
{
return ((SessionBrokerAdapter) subject).sessionsSize();
}
};
}
/**
* Creates a new <code>CollectionValueModel</code> where the items are the
* unmanaged sessions (excluding session brokers and managed sessions).
*
* @return A new <code>CollectionValueModel</code>
*/
private CollectionValueModel buildUnmanagedSessionsCollectionHolder()
{
Iterator iterator = buildUnmanagedSessionsIterator();
return new ReadOnlyCollectionValueModel(CollectionTools.collection(iterator));
}
/**
* Creates an <code>Iterator</code> that will return one by one each of the
* unmanaged sessions excluding {@link SessionBrokerAdapter}s and managed
* {@link SessionAdapter}s.
*
* @return A new <code>Iterator</code> when the object are an instance of
* {@link SessionAdapter}
*/
private Iterator buildUnmanagedSessionsIterator()
{
SessionBrokerAdapter broker = (SessionBrokerAdapter) subject();
TopLinkSessionsAdapter topLinkSessions = (TopLinkSessionsAdapter) broker.getParent();
return topLinkSessions.databaseSessions();
}
/**
* Installs a listener that will be notified when the collection of sessions
* contained by the TopLink Sessions has changed. Upon change, the enable
* state of the Add button will be updated.
*
* @param panel The panel showing the list of sessions
*/
private void registerListenerToUpdateAddButtonEnableState(final AddRemoveListPanel panel)
{
// Holder of the SessionBrokerAdapter's parent: TopLinkSessionsAdapter
PropertyAspectAdapter parentHolder = new PropertyAspectAdapter(getSubjectHolder(), "")
{
protected Object getValueFromSubject()
{
SessionBrokerAdapter broker = (SessionBrokerAdapter) subject;
return broker.getParent();
}
};
// Holder of the sessions collection
CollectionAspectAdapter collectionHolder = new CollectionAspectAdapter(parentHolder, TopLinkSessionsAdapter.SESSIONS_COLLECTION)
{
protected Iterator getValueFromSubject()
{
TopLinkSessionsAdapter topLinkSessions = (TopLinkSessionsAdapter) subject;
return topLinkSessions.databaseSessions();
}
};
// Listen to any change in the collection and update the enable state of the Add button
collectionHolder.addCollectionChangeListener(CollectionAspectAdapter.VALUE, new CollectionChangeListener()
{
public void collectionChanged(CollectionChangeEvent e)
{
updateAddButtonEnableState(panel);
}
public void itemsAdded(CollectionChangeEvent e)
{
updateAddButtonEnableState(panel);
}
public void itemsRemoved(CollectionChangeEvent e)
{
updateAddButtonEnableState(panel);
}
});
updateAddButtonEnableState(panel);
}
/**
* Removes the <code>SessionAdapter</code>s contained in the given collection.
*
* @param sessions The {@link SessionAdapter}s to be removed from the edited
* session broker
*/
protected void removeSessions(Collection sessions)
{
SessionBrokerAdapter broker = (SessionBrokerAdapter) subject();
broker.unManage(sessions);
}
/**
* Updates
*
* @param panel
*/
private void updateAddButtonEnableState(AddRemoveListPanel panel)
{
SessionBrokerAdapter broker = (SessionBrokerAdapter) subject();
if (broker != null)
{
TopLinkSessionsAdapter topLinkSessions = (TopLinkSessionsAdapter) broker.getParent();
boolean enabled = (topLinkSessions.databaseSessionsSize() > 0);
panel.setAddButtonEnabled(enabled);
}
}
}