/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* 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 org.jkiss.dbeaver.ui.controls.resultset;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.exec.DBCResultSet;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* ResultSetPresentationRegistry
*/
public class ResultSetPresentationRegistry {
private static final String TAG_PRESENTATION = "presentation"; //NON-NLS-1
private static final String TAG_PANEL = "panel"; //NON-NLS-1
private static ResultSetPresentationRegistry instance;
public synchronized static ResultSetPresentationRegistry getInstance() {
if (instance == null) {
instance = new ResultSetPresentationRegistry(Platform.getExtensionRegistry());
}
return instance;
}
private List<ResultSetPresentationDescriptor> presentations = new ArrayList<>();
private List<ResultSetPanelDescriptor> panels = new ArrayList<>();
private ResultSetPresentationRegistry(IExtensionRegistry registry)
{
// Load presentation descriptors
IConfigurationElement[] extElements = registry.getConfigurationElementsFor(ResultSetPresentationDescriptor.EXTENSION_ID);
for (IConfigurationElement ext : extElements) {
if (TAG_PRESENTATION.equals(ext.getName())) {
ResultSetPresentationDescriptor descriptor = new ResultSetPresentationDescriptor(ext);
presentations.add(descriptor);
}
}
Collections.sort(presentations, new Comparator<ResultSetPresentationDescriptor>() {
@Override
public int compare(ResultSetPresentationDescriptor o1, ResultSetPresentationDescriptor o2) {
return o1.getOrder() - o2.getOrder();
}
});
// Load panel descriptors
IConfigurationElement[] panelElements = registry.getConfigurationElementsFor(ResultSetPanelDescriptor.EXTENSION_ID);
for (IConfigurationElement ext : panelElements) {
if (TAG_PANEL.equals(ext.getName())) {
ResultSetPanelDescriptor descriptor = new ResultSetPanelDescriptor(ext);
panels.add(descriptor);
}
}
}
public ResultSetPresentationDescriptor getPresentation(String id)
{
for (ResultSetPresentationDescriptor descriptor : presentations) {
if (descriptor.getId().equals(id)) {
return descriptor;
}
}
return null;
}
public ResultSetPresentationDescriptor getPresentation(Class<? extends IResultSetPresentation> implType)
{
for (ResultSetPresentationDescriptor descriptor : presentations) {
if (descriptor.matches(implType)) {
return descriptor;
}
}
return null;
}
public List<ResultSetPresentationDescriptor> getAvailablePresentations(DBCResultSet resultSet, IResultSetContext context)
{
List<ResultSetPresentationDescriptor> result = new ArrayList<>();
for (ResultSetPresentationDescriptor descriptor : presentations) {
if (descriptor.supportedBy(resultSet, context)) {
result.add(descriptor);
}
}
return result;
}
public List<ResultSetPanelDescriptor> getAllPanels() {
return panels;
}
public List<ResultSetPanelDescriptor> getSupportedPanels(DBPDataSource dataSource, String presentationId, IResultSetPresentation.PresentationType presentationType) {
List<ResultSetPanelDescriptor> result = new ArrayList<>();
for (ResultSetPanelDescriptor panel : panels) {
if (panel.supportedBy(dataSource, presentationId, presentationType)) {
result.add(panel);
}
}
Collections.sort(result, new Comparator<ResultSetPanelDescriptor>() {
@Override
public int compare(ResultSetPanelDescriptor o1, ResultSetPanelDescriptor o2) {
return o1.getLabel().compareTo(o2.getLabel());
}
});
return result;
}
}