/* * 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.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPImage; import org.jkiss.dbeaver.model.exec.DBCResultSet; import org.jkiss.dbeaver.registry.AbstractContextDescriptor; import org.jkiss.dbeaver.registry.RegistryConstants; import org.jkiss.utils.CommonUtils; import org.jkiss.utils.MimeType; import java.util.ArrayList; import java.util.List; import java.util.Locale; /** * ResultSetPresentationDescriptor */ public class ResultSetPresentationDescriptor extends AbstractContextDescriptor { private static final Log log = Log.getLog(ResultSetPresentationDescriptor.class); public static final String EXTENSION_ID = "org.jkiss.dbeaver.resultset.presentation"; //NON-NLS-1 //$NON-NLS-1$ private static final String CONTENT_TYPE = "contentType"; private final String id; private final String label; private final String description; private final ObjectType implClass; private final DBPImage icon; private final int order; private final IResultSetPresentation.PresentationType presentationType; private final List<MimeType> contentTypes = new ArrayList<>(); protected ResultSetPresentationDescriptor(IConfigurationElement config) { super(config); this.id = config.getAttribute(RegistryConstants.ATTR_ID); this.label = config.getAttribute(RegistryConstants.ATTR_LABEL); this.description = config.getAttribute(RegistryConstants.ATTR_DESCRIPTION); this.implClass = new ObjectType(config.getAttribute(RegistryConstants.ATTR_CLASS)); this.icon = iconToImage(config.getAttribute(RegistryConstants.ATTR_ICON)); this.order = CommonUtils.toInt(config.getAttribute(RegistryConstants.ATTR_ORDER)); this.presentationType = IResultSetPresentation.PresentationType.valueOf(config.getAttribute(RegistryConstants.ATTR_TYPE).toUpperCase(Locale.ENGLISH)); for (IConfigurationElement typeCfg : config.getChildren(CONTENT_TYPE)) { String type = typeCfg.getAttribute(RegistryConstants.ATTR_TYPE); try { MimeType contentType = new MimeType(type); contentTypes.add(contentType); } catch (Throwable e) { log.warn("Invalid content type: " + type, e); } } } public String getId() { return id; } public String getLabel() { return label; } public String getDescription() { return description; } public DBPImage getIcon() { return icon; } public int getOrder() { return order; } public IResultSetPresentation.PresentationType getPresentationType() { return presentationType; } public boolean supportedBy(DBCResultSet resultSet, IResultSetContext context) { return appliesTo(resultSet, context) || matchesContentType(context); } public IResultSetPresentation createInstance() throws DBException { return implClass.createInstance(IResultSetPresentation.class); } public boolean matches(Class<? extends IResultSetPresentation> type) { return implClass.matchesType(type); } private boolean matchesContentType(IResultSetContext context) { String documentType = context.getDocumentContentType(); if (contentTypes.isEmpty() || CommonUtils.isEmpty(documentType)) { return false; } for (MimeType mimeType : contentTypes) { try { if (mimeType.match(documentType)) { return true; } } catch (Throwable e) { log.warn("Bad document content type: " + documentType, e); } } return false; } @Override public String toString() { return id; } }