提交 a96ba569 编写于 作者: J jurgen

RS presnetation bind to content type

上级 e97af93b
......@@ -26,4 +26,6 @@ public interface IResultSetContext
boolean supportsAttributes();
boolean supportsDocument();
String getDocumentContentType();
}
......@@ -20,25 +20,36 @@ 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 javax.activation.MimeType;
import javax.activation.MimeTypeParseException;
import java.util.ArrayList;
import java.util.List;
/**
* ResultSetPresentationDescriptor
*/
public class ResultSetPresentationDescriptor extends AbstractContextDescriptor {
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 presentationType;
private final DBPImage icon;
private final int order;
private final List<MimeType> contentTypes = new ArrayList<MimeType>();
protected ResultSetPresentationDescriptor(IConfigurationElement config) {
super(config);
......@@ -49,6 +60,16 @@ public class ResultSetPresentationDescriptor extends AbstractContextDescriptor {
this.presentationType = new ObjectType(config.getAttribute(RegistryConstants.ATTR_CLASS));
this.icon = iconToImage(config.getAttribute(RegistryConstants.ATTR_ICON));
this.order = CommonUtils.toInt(config.getAttribute(RegistryConstants.ATTR_ORDER));
for (IConfigurationElement typeCfg : config.getChildren(CONTENT_TYPE)) {
String type = typeCfg.getAttribute(RegistryConstants.ATTR_TYPE);
try {
MimeType contentType = new MimeType(type);
contentTypes.add(contentType);
} catch (MimeTypeParseException e) {
log.warn("Invalid content type: " + type, e);
}
}
}
public String getId() {
......@@ -72,7 +93,7 @@ public class ResultSetPresentationDescriptor extends AbstractContextDescriptor {
}
public boolean supportedBy(DBCResultSet resultSet, IResultSetContext context) {
return appliesTo(resultSet, context);
return appliesTo(resultSet, context) || matchesContentType(context);
}
public IResultSetPresentation createInstance() throws DBException {
......@@ -82,4 +103,22 @@ public class ResultSetPresentationDescriptor extends AbstractContextDescriptor {
public boolean matches(Class<? extends IResultSetPresentation> type) {
return presentationType.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 (MimeTypeParseException e) {
log.warn("Bad document content type: " + documentType, e);
}
}
return false;
}
}
......@@ -522,6 +522,12 @@ public class ResultSetViewer extends Viewer
public boolean supportsDocument() {
return model.getDocumentAttribute() != null;
}
@Override
public String getDocumentContentType() {
DBDAttributeBinding docAttr = model.getDocumentAttribute();
return docAttr == null ? null : docAttr.getValueHandler().getValueContentType(docAttr);
}
};
availablePresentations = ResultSetPresentationRegistry.getInstance().getAvailablePresentations(resultSet, context);
if (!availablePresentations.isEmpty()) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册