提交 5822bd95 编写于 作者: J jurgen

Driver libraries model

上级 8adca1e7
......@@ -31,9 +31,7 @@ import org.jkiss.dbeaver.model.impl.AbstractDescriptor;
import org.jkiss.dbeaver.model.impl.PropertyDescriptor;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.navigator.meta.DBXTreeNode;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
import org.jkiss.dbeaver.model.runtime.OSDescriptor;
import org.jkiss.dbeaver.registry.DataSourceDescriptor;
import org.jkiss.dbeaver.registry.DataSourceProviderDescriptor;
......@@ -48,7 +46,6 @@ import org.jkiss.utils.xml.XMLBuilder;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
......@@ -897,6 +894,7 @@ public class DriverDescriptor extends AbstractDescriptor implements DBPDriver
public boolean acceptDriverLicenses(DBRRunnableContext runnableContext)
{
/*
// User must accept all licenses before actual drivers download
for (final DBPDriverLibrary file : libraries) {
if (file.getType() == DBPDriverLibrary.FileType.license) {
......@@ -924,6 +922,7 @@ public class DriverDescriptor extends AbstractDescriptor implements DBPDriver
if (!CommonUtils.isEmpty(licenseText)) {
return acceptLicense(licenseText);
}
*/
// No license
return true;
}
......
......@@ -147,7 +147,7 @@ public abstract class DriverLibraryAbstract implements DBPDriverLibrary
return system == null || system.matches(DBeaverCore.getInstance().getLocalSystem());
}
public void downloadLibraryFile(DBRProgressMonitor monitor, boolean updateVersion) throws IOException, InterruptedException
public void downloadLibraryFile(DBRProgressMonitor monitor, boolean forceUpdate) throws IOException, InterruptedException
{
String externalURL = getExternalURL();
if (externalURL == null) {
......
......@@ -25,6 +25,7 @@ import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.core.DBeaverCore;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBPDriverLibrary;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.ui.UIIcon;
import java.io.File;
......@@ -129,7 +130,7 @@ public class DriverLibraryLocal extends DriverLibraryAbstract
@Nullable
@Override
public Collection<DBPDriverLibrary> getDependencies() {
public Collection<DBPDriverLibrary> getDependencies(DBRProgressMonitor monitor) throws IOException {
return null;
}
......
......@@ -25,10 +25,7 @@ import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBPDriverLibrary;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.registry.maven.MavenArtifact;
import org.jkiss.dbeaver.registry.maven.MavenArtifactReference;
import org.jkiss.dbeaver.registry.maven.MavenLocalVersion;
import org.jkiss.dbeaver.registry.maven.MavenRegistry;
import org.jkiss.dbeaver.registry.maven.*;
import org.jkiss.dbeaver.ui.UIIcon;
import java.io.File;
......@@ -126,7 +123,18 @@ public class DriverLibraryMavenArtifact extends DriverLibraryAbstract
@Nullable
@Override
public Collection<DBPDriverLibrary> getDependencies() {
public Collection<DBPDriverLibrary> getDependencies(DBRProgressMonitor monitor) throws IOException {
MavenLocalVersion localVersion = resolveLocalVersion(monitor, false);
if (localVersion == null) {
return null;
}
MavenArtifactVersion metaData = localVersion.getMetaData();
if (metaData == null) {
return null;
}
for (MavenArtifactDependency dependency : metaData.getDependencies()) {
System.out.println(dependency);
}
return null;
}
......@@ -148,35 +156,32 @@ public class DriverLibraryMavenArtifact extends DriverLibraryAbstract
return UIIcon.APACHE;
}
public void downloadLibraryFile(DBRProgressMonitor monitor, boolean updateVersion) throws IOException, InterruptedException {
MavenArtifact artifact = downloadMavenArtifact(monitor, updateVersion);
if (artifact.getRepository().isLocal()) {
public void downloadLibraryFile(DBRProgressMonitor monitor, boolean forceUpdate) throws IOException, InterruptedException {
MavenLocalVersion localVersion = resolveLocalVersion(monitor, forceUpdate);
if (localVersion.getArtifact().getRepository().isLocal()) {
// No need to download local artifacts
return;
}
super.downloadLibraryFile(monitor, updateVersion);
super.downloadLibraryFile(monitor, forceUpdate);
}
private MavenArtifact downloadMavenArtifact(DBRProgressMonitor monitor, boolean updateVersion) throws IOException {
private MavenLocalVersion resolveLocalVersion(DBRProgressMonitor monitor, boolean forceUpdate) throws IOException {
MavenArtifactReference artifactInfo = new MavenArtifactReference(path);
if (updateVersion) {
if (forceUpdate) {
MavenRegistry.getInstance().resetArtifactInfo(artifactInfo);
}
MavenArtifact artifact = MavenRegistry.getInstance().findArtifact(artifactInfo);
if (artifact == null) {
throw new IOException("Maven artifact '" + path + "' not found");
}
if (updateVersion) {
artifact.loadMetadata();
} else {
if (!forceUpdate) {
MavenLocalVersion localVersion = artifact.getActiveLocalVersion();
if (localVersion != null && localVersion.getCacheFile().exists()) {
// Already cached
return artifact;
return localVersion;
}
}
artifact.resolveVersion(monitor, artifactInfo.getVersion());
return artifact;
return artifact.resolveVersion(monitor, artifactInfo.getVersion());
}
}
......@@ -197,6 +197,7 @@ public class MavenArtifact
log.debug("Artifact '" + artifactId + "' do not have version '" + versionStr + "' info in metadata");
}
version = new MavenLocalVersion(this, versionStr, getVersionFileName(versionStr, FILE_JAR), new Date());
version.getMetaData();
localVersions.add(version);
}
if (setActive) {
......
......@@ -26,9 +26,7 @@ import org.xml.sax.Attributes;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* Maven artifact version descriptor (POM).
......@@ -42,8 +40,10 @@ public class MavenArtifactVersion
private String version;
private String description;
private String url;
private List<MavenArtifactLicense> licenses;
private List<MavenArtifactDependency> dependencies;
private MavenArtifactReference parent;
private Map<String, String> properties = new LinkedHashMap<>();
private List<MavenArtifactLicense> licenses = new ArrayList<>();
private List<MavenArtifactDependency> dependencies = new ArrayList<>();
MavenArtifactVersion(MavenLocalVersion localVersion) throws IOException {
this.localVersion = localVersion;
......@@ -75,6 +75,14 @@ public class MavenArtifactVersion
return url;
}
public MavenArtifactReference getParent() {
return parent;
}
public Map<String, String> getProperties() {
return properties;
}
public List<MavenArtifactLicense> getLicenses() {
return licenses;
}
......@@ -90,6 +98,8 @@ public class MavenArtifactVersion
private enum ParserState {
ROOT,
PARENT,
PROPERTIES,
LICENSE,
DEPENDENCIES,
DEPENDENCY
......@@ -107,7 +117,11 @@ public class MavenArtifactVersion
@Override
public void saxStartElement(SAXReader reader, String namespaceURI, String localName, Attributes atts) throws XMLException {
lastTag = localName;
if ("license".equals(localName)) {
if ("parent".equals(localName) && state == ParserState.ROOT) {
state = ParserState.PARENT;
} else if ("properties".equals(localName)) {
state = ParserState.PROPERTIES;
} else if ("license".equals(localName)) {
state = ParserState.LICENSE;
} else if ("dependencies".equals(localName)) {
state = ParserState.DEPENDENCIES;
......@@ -130,6 +144,8 @@ public class MavenArtifactVersion
url = data;
}
break;
case PARENT:
case PROPERTIES:
case LICENSE:
case DEPENDENCY:
attributes.put(lastTag, data);
......@@ -149,6 +165,8 @@ public class MavenArtifactVersion
attributes.clear();
} else if ("dependencies".equals(localName) && state == ParserState.DEPENDENCIES) {
state = ParserState.ROOT;
attributes.clear();
} else if ("dependency".equals(localName) && state == ParserState.DEPENDENCY) {
dependencies.add(new MavenArtifactDependency(
new MavenArtifactReference(
attributes.get("groupId"),
......@@ -158,10 +176,20 @@ public class MavenArtifactVersion
attributes.get("type"),
Boolean.valueOf(attributes.get("optional"))
));
attributes.clear();
} else if ("dependency".equals(localName) && state == ParserState.DEPENDENCY) {
state = ParserState.DEPENDENCIES;
attributes.clear();
} else if ("properties".equals(localName) && state == ParserState.PROPERTIES) {
properties.putAll(attributes);
attributes.clear();
state = ParserState.ROOT;
} else if ("parent".equals(localName) && state == ParserState.PARENT) {
parent = new MavenArtifactReference(
attributes.get("groupId"),
attributes.get("artifactId"),
attributes.get("version")
);
attributes.clear();
state = ParserState.ROOT;
}
}
});
......
......@@ -17,9 +17,11 @@
*/
package org.jkiss.dbeaver.ui.dialogs.driver;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.*;
......@@ -28,7 +30,6 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
import org.jkiss.dbeaver.registry.driver.DriverDescriptor;
import org.jkiss.dbeaver.registry.driver.DriverLibraryAbstract;
import org.jkiss.dbeaver.runtime.RunnableContextDelegate;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIUtils;
......@@ -36,6 +37,7 @@ import org.jkiss.dbeaver.utils.GeneralUtils;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.List;
class DriverDownloadAutoPage extends DriverDownloadPage {
......@@ -90,6 +92,37 @@ class DriverDownloadAutoPage extends DriverDownloadPage {
setControl(composite);
}
@Override
void resolveLibraries() {
try {
new RunnableContextDelegate(getContainer()).run(true, true, new DBRRunnableWithProgress() {
@Override
public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
for (DBPDriverLibrary library : getWizard().getFiles()) {
resolveDependencies(monitor, library);
}
} catch (IOException e) {
throw new InvocationTargetException(e);
}
}
});
} catch (InterruptedException e) {
// User just canceled download
} catch (InvocationTargetException e) {
UIUtils.showErrorDialog(null, "Resolve libraries", "Error resolving driver libraries", e.getTargetException());
}
}
private void resolveDependencies(DBRProgressMonitor monitor, DBPDriverLibrary library) throws IOException {
Collection<DBPDriverLibrary> dependencies = library.getDependencies(monitor);
if (dependencies != null && !dependencies.isEmpty()) {
for (DBPDriverLibrary dep : dependencies) {
resolveDependencies(monitor, dep);
}
}
}
@Override
void performFinish() {
downloadLibraryFiles(new RunnableContextDelegate(getContainer()), getWizard().getFiles());
......
......@@ -18,6 +18,8 @@
package org.jkiss.dbeaver.ui.dialogs.driver;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IPageChangedListener;
import org.eclipse.jface.dialogs.PageChangedEvent;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
......@@ -45,6 +47,12 @@ public class DriverDownloadDialog extends WizardDialog
{
super(shell, new DriverDownloadWizard(driver, files, updateVersion, forceDownload));
getWizard().init(DBeaverUI.getActiveWorkbenchWindow().getWorkbench(), null);
addPageChangedListener(new IPageChangedListener() {
@Override
public void pageChanged(PageChangedEvent event) {
getWizard().pageActivated(event.getSelectedPage());
}
});
}
DriverDescriptor getDriver() {
......
......@@ -102,6 +102,11 @@ class DriverDownloadManualPage extends DriverDownloadPage {
return fileSource != null;
}
@Override
void resolveLibraries() {
// do nothing
}
@Override
void performFinish() {
UIUtils.runInDetachedUI(getShell(), new Runnable() {
......
......@@ -40,6 +40,8 @@ abstract class DriverDownloadPage extends WizardPage {
return (DriverDownloadWizard) super.getWizard();
}
abstract void resolveLibraries();
abstract void performFinish();
protected void createLinksPanel(Composite composite) {
......
......@@ -83,6 +83,10 @@ public class DriverDownloadWizard extends Wizard implements IExportWizard {
addPage(downloadPage);
}
void pageActivated(Object selectedPage) {
downloadPage.resolveLibraries();
}
@Override
public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
setWindowTitle("Driver settings");
......
......@@ -80,8 +80,8 @@ public interface DBPDriverLibrary
boolean matchesCurrentPlatform();
@Nullable
Collection<DBPDriverLibrary> getDependencies();
Collection<DBPDriverLibrary> getDependencies(DBRProgressMonitor monitor) throws IOException;
void downloadLibraryFile(DBRProgressMonitor monitor, boolean updateVersion)
void downloadLibraryFile(DBRProgressMonitor monitor, boolean forceUpdate)
throws IOException, InterruptedException;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册