This commit is contained in:
Christopher Schnick
2022-06-20 01:35:51 +02:00
parent b80b8121f6
commit af17d731ab
29 changed files with 60 additions and 308 deletions
@@ -27,6 +27,11 @@ public class FileStore implements StreamDataStore, FilenameStore {
this.file = file;
}
@Override
public boolean canOpen() {
return machine.exists(file);
}
@Override
public String toDisplay() {
return file + "@" + machine.toDisplay();
@@ -109,7 +109,7 @@ public class InputStreamDataStore implements StreamDataStore {
}
@Override
public boolean exists() {
public boolean canOpen() {
return true;
}
}
@@ -10,6 +10,11 @@ import java.nio.file.Path;
@JsonTypeName("local")
public class LocalMachineStore implements MachineStore {
@Override
public boolean exists(String file) {
return Files.exists(Path.of(file));
}
@Override
public String toDisplay() {
return "local";
@@ -13,4 +13,5 @@ public interface MachineStore extends DataStore {
OutputStream openOutput(String file) throws Exception;
public boolean exists(String file);
}
@@ -22,7 +22,7 @@ public class OutputStreamStore implements StreamDataStore {
}
@Override
public boolean exists() {
public boolean canOpen() {
return true;
}
}
@@ -87,7 +87,7 @@ public class StdinDataStore implements StreamDataStore {
}
@Override
public boolean exists() {
public boolean canOpen() {
return false;
}
}
@@ -40,7 +40,7 @@ public class StdoutDataStore implements StreamDataStore {
}
@Override
public boolean exists() {
public boolean canOpen() {
return false;
}
}
@@ -23,12 +23,8 @@ public interface StreamDataStore extends DataStore {
throw new UnsupportedOperationException("Can't open store output");
}
default OutputStream openAppendingOutput() throws Exception {
throw new UnsupportedOperationException("Can't open store output");
}
default boolean exists() {
return false;
default boolean canOpen() {
return true;
}
default boolean persistent() {
@@ -16,7 +16,7 @@ public class URLDataStore implements StreamDataStore {
}
@Override
public boolean exists() {
public boolean canOpen() {
return true;
}
}
+1 -1
Submodule deps updated: cbac51bc63...49a1ad06bc
@@ -158,6 +158,12 @@ public interface DataSourceProvider<T extends DataSource<?>> {
return getPossibleNames().get(0);
}
default String getModuleName() {
var n = getClass().getPackageName();
var i = n.lastIndexOf('.');
return i != -1 ? n.substring(i + 1) : n;
}
/**
* Attempt to create a useful data source descriptor from a data store.
* The result does not need to be always right, it should only reflect the best effort.
@@ -27,8 +27,14 @@ public interface DataStoreProvider {
return i18n("displayDescription");
}
default String getModuleName() {
var n = getClass().getPackageName();
var i = n.lastIndexOf('.');
return i != -1 ? n.substring(i + 1) : n;
}
default String getDisplayIconFileName() {
return getId() + ":icon.png";
return getModuleName() + ":" + getId() + ".png";
}
default Dialog dialogForURL(URL url) {
@@ -50,4 +56,6 @@ public interface DataStoreProvider {
default String getId() {
return getPossibleNames().get(0);
}
List<Class<?>> getStoreClasses();
}
@@ -53,6 +53,16 @@ public class DataStoreProviders {
return ALL.stream().map(d -> d.dialogForString(s)).filter(Objects::nonNull).findAny();
}
@SuppressWarnings("unchecked")
public static <T extends DataStoreProvider> T byStoreClass(Class<?> c) {
if (ALL == null) {
throw new IllegalStateException("Not initialized");
}
return (T) ALL.stream().filter(d -> d.getStoreClasses().contains(c)).findAny()
.orElseThrow(() -> new IllegalArgumentException("Provider for " + c.getSimpleName() + " not found"));
}
public static Set<DataStoreProvider> getAll() {
return ALL;
}
@@ -12,7 +12,7 @@ public interface SupportedApplicationProvider {
APPLICATION
}
Region createRetrieveInstructions(DataSourceProvider provider, ObservableValue<String> id);
Region createRetrieveInstructions(DataSourceProvider<?> provider, ObservableValue<String> id);
String getId();
@@ -88,6 +88,21 @@ public record CodeSnippet(List<CodeSnippet.Line> lines) {
}
return new CodeSnippet(lines);
}
public Builder snippet(CodeSnippet s) {
if (s.lines.size() == 0) {
return this;
}
var first = s.lines.get(0);
var line = new ArrayList<>(currentLine);
line.addAll(first.elements);
lines.add(new Line(new ArrayList<>(line)));
currentLine.clear();
s.lines.stream().skip(1).forEach(l -> lines.add(l));
return this;
}
}
public static record StaticElement(String value, Color color) implements Element {
@@ -1,11 +0,0 @@
plugins {
id 'java'
id "org.moditect.gradleplugin" version "1.0.0-rc3"
}
apply from: "$rootDir/deps/lombok.gradle"
apply from: "$rootDir/deps/extension.gradle"
configurations {
compileOnly.extendsFrom(dep)
}
@@ -1,18 +0,0 @@
package io.xpipe.ext.json;
import io.xpipe.core.source.RawDataSourceDescriptor;
import io.xpipe.core.source.RawReadConnection;
import io.xpipe.core.source.RawWriteConnection;
import io.xpipe.core.store.StreamDataStore;
public class MyRawFileDescriptor extends RawDataSourceDescriptor<StreamDataStore> {
@Override
protected RawWriteConnection newWriteConnection(StreamDataStore store) {
return new MyRawFileWriteConnection(store);
}
@Override
protected RawReadConnection newReadConnection(StreamDataStore store) {
return new MyRawFileReadConnection(store);
}
}
@@ -1,30 +0,0 @@
package io.xpipe.ext.json;
import io.xpipe.core.source.DataSourceDescriptor;
import io.xpipe.core.source.DataSourceType;
import io.xpipe.extension.DataSourceProvider;
import io.xpipe.extension.SimpleFileDataSourceProvider;
import io.xpipe.extension.UniformDataSourceProvider;
import java.util.LinkedHashMap;
import java.util.Map;
public class MyRawFileProvider implements UniformDataSourceProvider, SimpleFileDataSourceProvider, DataSourceProvider {
@Override
public DataSourceType getPrimaryType() {
return DataSourceType.RAW;
}
@Override
public Map<String, String> getSupportedExtensions() {
var map = new LinkedHashMap<String, String>();
map.put(i18nKey("fileName"), "myf");
return map;
}
@Override
public Class<? extends DataSourceDescriptor<?>> getDescriptorClass() {
return MyRawFileDescriptor.class;
}
}
@@ -1,43 +0,0 @@
package io.xpipe.ext.json;
import io.xpipe.core.source.RawReadConnection;
import io.xpipe.core.store.StreamDataStore;
import java.io.InputStream;
public class MyRawFileReadConnection implements RawReadConnection {
private InputStream inputStream;
private final StreamDataStore store;
public MyRawFileReadConnection(StreamDataStore store) {
this.store = store;
}
@Override
public void init() throws Exception {
if (inputStream != null) {
throw new IllegalStateException("Already initialized");
}
inputStream = store.openInput();
}
@Override
public void close() throws Exception {
if (inputStream == null) {
throw new IllegalStateException("Not initialized");
}
inputStream.close();
}
@Override
public byte[] readBytes(int max) throws Exception {
if (inputStream == null) {
throw new IllegalStateException("Not initialized");
}
return inputStream.readNBytes(max);
}
}
@@ -1,43 +0,0 @@
package io.xpipe.ext.json;
import io.xpipe.core.source.RawWriteConnection;
import io.xpipe.core.store.StreamDataStore;
import java.io.OutputStream;
public class MyRawFileWriteConnection implements RawWriteConnection {
private final StreamDataStore store;
private OutputStream outputStream;
public MyRawFileWriteConnection(StreamDataStore store) {
this.store = store;
}
@Override
public void init() throws Exception {
if (outputStream != null) {
throw new IllegalStateException("Already initialized");
}
outputStream = store.openOutput();
}
@Override
public void close() throws Exception {
if (outputStream == null) {
throw new IllegalStateException("Not initialized");
}
outputStream.close();
}
@Override
public void write(byte[] bytes) throws Exception {
if (outputStream == null) {
throw new IllegalStateException("Not initialized");
}
outputStream.write(bytes);
}
}
@@ -1,13 +0,0 @@
import io.xpipe.ext.json.MyRawFileProvider;
import io.xpipe.extension.DataSourceProvider;
module io.xpipe.ext.file_data_source_sample {
exports io.xpipe.ext.json;
opens io.xpipe.ext.json;
requires io.xpipe.core;
requires io.xpipe.extension;
provides DataSourceProvider with MyRawFileProvider;
}
@@ -1,3 +0,0 @@
displayName=Mein Dateiformat
description=Meine Dateiformat-Beschreibung
fileName=Mein Dateiformat Datei
@@ -1,3 +0,0 @@
displayName=My file format
description=My file format description
fileName=My file format file
-28
View File
@@ -1,28 +0,0 @@
plugins {
id 'application'
}
java {
modularity.inferModulePath = true
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
repositories {
mavenCentral()
}
// The used X-Pipe API version.
// In your case, you have to fix this value to the target API version,
// which you can find at https://search.maven.org/artifact/io.xpipe/api/
def apiVersion = file('../../misc/version').text
dependencies {
implementation project(':core')
implementation project(':api')
}
application {
mainModule = 'io.xpipe.sample'
mainClass = 'io.xpipe.sample.HomePricesSample'
}
@@ -1,38 +0,0 @@
package io.xpipe.sample;
import io.xpipe.api.DataSource;
import io.xpipe.api.DataTable;
import io.xpipe.core.data.node.TupleNode;
import java.util.Comparator;
import java.util.Map;
public class HomePricesSample {
private static DataTable homePricesTable;
public static void main(String[] args) {
var resource = HomePricesSample.class.getResource("homes.csv");
// Creates a wrapped data source using the url.
// Note that while this is possible, it is not recommended as
// all queries are routed through the XPipe client anyway.
// It allows us however to bundle the data with this sample program.
homePricesTable = DataSource.createAnonymous("csv", Map.of(), resource).asTable();
// As we didn't pass any configuration parameters, X-Pipe will try to automatically detect
// the correct configuration parameters. You can access these parameters like this:
System.out.println("Determined configuration: " + homePricesTable.getConfig());
// In case these some parameters are not chosen correctly, you can pass the proper values
// to the wrap() method.
System.out.println("The highest selling house entry is: " + getHighestSellingHouse());
}
private static TupleNode getHighestSellingHouse() {
return homePricesTable.stream()
.min(Comparator.comparingInt(t -> t.forKey("Sell").asInt()))
.get();
}
}
@@ -1,4 +0,0 @@
module io.xpipe.sample {
requires io.xpipe.api;
requires io.xpipe.core;
}
@@ -1,52 +0,0 @@
"Sell", "List", "Living", "Rooms", "Beds", "Baths", "Age", "Acres", "Taxes"
142, 160, 28, 10, 5, 3, 60, 0.28, 3167
175, 180, 18, 8, 4, 1, 12, 0.43, 4033
129, 132, 13, 6, 3, 1, 41, 0.33, 1471
138, 140, 17, 7, 3, 1, 22, 0.46, 3204
232, 240, 25, 8, 4, 3, 5, 2.05, 3613
135, 140, 18, 7, 4, 3, 9, 0.57, 3028
150, 160, 20, 8, 4, 3, 18, 4.00, 3131
207, 225, 22, 8, 4, 2, 16, 2.22, 5158
271, 285, 30, 10, 5, 2, 30, 0.53, 5702
89, 90, 10, 5, 3, 1, 43, 0.30, 2054
153, 157, 22, 8, 3, 3, 18, 0.38, 4127
87, 90, 16, 7, 3, 1, 50, 0.65, 1445
234, 238, 25, 8, 4, 2, 2, 1.61, 2087
106, 116, 20, 8, 4, 1, 13, 0.22, 2818
175, 180, 22, 8, 4, 2, 15, 2.06, 3917
165, 170, 17, 8, 4, 2, 33, 0.46, 2220
166, 170, 23, 9, 4, 2, 37, 0.27, 3498
136, 140, 19, 7, 3, 1, 22, 0.63, 3607
148, 160, 17, 7, 3, 2, 13, 0.36, 3648
151, 153, 19, 8, 4, 2, 24, 0.34, 3561
180, 190, 24, 9, 4, 2, 10, 1.55, 4681
293, 305, 26, 8, 4, 3, 6, 0.46, 7088
167, 170, 20, 9, 4, 2, 46, 0.46, 3482
190, 193, 22, 9, 5, 2, 37, 0.48, 3920
184, 190, 21, 9, 5, 2, 27, 1.30, 4162
157, 165, 20, 8, 4, 2, 7, 0.30, 3785
110, 115, 16, 8, 4, 1, 26, 0.29, 3103
135, 145, 18, 7, 4, 1, 35, 0.43, 3363
567, 625, 64, 11, 4, 4, 4, 0.85, 12192
180, 185, 20, 8, 4, 2, 11, 1.00, 3831
183, 188, 17, 7, 3, 2, 16, 3.00, 3564
185, 193, 20, 9, 3, 2, 56, 6.49, 3765
152, 155, 17, 8, 4, 1, 33, 0.70, 3361
148, 153, 13, 6, 3, 2, 22, 0.39, 3950
152, 159, 15, 7, 3, 1, 25, 0.59, 3055
146, 150, 16, 7, 3, 1, 31, 0.36, 2950
170, 190, 24, 10, 3, 2, 33, 0.57, 3346
127, 130, 20, 8, 4, 1, 65, 0.40, 3334
265, 270, 36, 10, 6, 3, 33, 1.20, 5853
157, 163, 18, 8, 4, 2, 12, 1.13, 3982
128, 135, 17, 9, 4, 1, 25, 0.52, 3374
110, 120, 15, 8, 4, 2, 11, 0.59, 3119
123, 130, 18, 8, 4, 2, 43, 0.39, 3268
212, 230, 39, 12, 5, 3, 202, 4.29, 3648
145, 145, 18, 8, 4, 2, 44, 0.22, 2783
129, 135, 10, 6, 3, 1, 15, 1.00, 2438
143, 145, 21, 7, 4, 2, 10, 1.20, 3529
247, 252, 29, 9, 4, 2, 4, 1.25, 4626
111, 120, 15, 8, 3, 1, 97, 1.11, 3205
133, 145, 26, 7, 3, 1, 42, 0.36, 3059
1 Sell List Living Rooms Beds Baths Age Acres Taxes
2 142 160 28 10 5 3 60 0.28 3167
3 175 180 18 8 4 1 12 0.43 4033
4 129 132 13 6 3 1 41 0.33 1471
5 138 140 17 7 3 1 22 0.46 3204
6 232 240 25 8 4 3 5 2.05 3613
7 135 140 18 7 4 3 9 0.57 3028
8 150 160 20 8 4 3 18 4.00 3131
9 207 225 22 8 4 2 16 2.22 5158
10 271 285 30 10 5 2 30 0.53 5702
11 89 90 10 5 3 1 43 0.30 2054
12 153 157 22 8 3 3 18 0.38 4127
13 87 90 16 7 3 1 50 0.65 1445
14 234 238 25 8 4 2 2 1.61 2087
15 106 116 20 8 4 1 13 0.22 2818
16 175 180 22 8 4 2 15 2.06 3917
17 165 170 17 8 4 2 33 0.46 2220
18 166 170 23 9 4 2 37 0.27 3498
19 136 140 19 7 3 1 22 0.63 3607
20 148 160 17 7 3 2 13 0.36 3648
21 151 153 19 8 4 2 24 0.34 3561
22 180 190 24 9 4 2 10 1.55 4681
23 293 305 26 8 4 3 6 0.46 7088
24 167 170 20 9 4 2 46 0.46 3482
25 190 193 22 9 5 2 37 0.48 3920
26 184 190 21 9 5 2 27 1.30 4162
27 157 165 20 8 4 2 7 0.30 3785
28 110 115 16 8 4 1 26 0.29 3103
29 135 145 18 7 4 1 35 0.43 3363
30 567 625 64 11 4 4 4 0.85 12192
31 180 185 20 8 4 2 11 1.00 3831
32 183 188 17 7 3 2 16 3.00 3564
33 185 193 20 9 3 2 56 6.49 3765
34 152 155 17 8 4 1 33 0.70 3361
35 148 153 13 6 3 2 22 0.39 3950
36 152 159 15 7 3 1 25 0.59 3055
37 146 150 16 7 3 1 31 0.36 2950
38 170 190 24 10 3 2 33 0.57 3346
39 127 130 20 8 4 1 65 0.40 3334
40 265 270 36 10 6 3 33 1.20 5853
41 157 163 18 8 4 2 12 1.13 3982
42 128 135 17 9 4 1 25 0.52 3374
43 110 120 15 8 4 2 11 0.59 3119
44 123 130 18 8 4 2 43 0.39 3268
45 212 230 39 12 5 3 202 4.29 3648
46 145 145 18 8 4 2 44 0.22 2783
47 129 135 10 6 3 1 15 1.00 2438
48 143 145 21 7 4 2 10 1.20 3529
49 247 252 29 9 4 2 4 1.25 4626
50 111 120 15 8 3 1 97 1.11 3205
51 133 145 26 7 3 1 42 0.36 3059
52
-8
View File
@@ -4,11 +4,3 @@ include 'api'
include 'core'
include 'beacon'
include 'extension'
include 'sample_extension'
project(":sample_extension").projectDir = file("samples/sample_extension")
include 'sample_program'
project(":sample_program").projectDir = file("samples/sample_program")