You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/11/12 14:39:43 UTC
[isis] branch v2 updated: ISIS-2006: extending applib with
universal source/sink and 'try'
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/v2 by this push:
new 22ac7b9 ISIS-2006: extending applib with universal source/sink and 'try'
22ac7b9 is described below
commit 22ac7b957e529883282f84b845e1031307a6c4fc
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Nov 12 15:39:26 2018 +0100
ISIS-2006: extending applib with universal source/sink and 'try'
introduces AnyIn - universal source
introduces AnyOut - universal sink
introduces AnyOutBuffer - universal in-memory sink
introduces Try - immutable holder for either a result or an exception
---
.../java/org/apache/isis/applib/anyio/AnyIn.java | 73 +++++++++++++++++++
.../isis/applib/anyio/AnyIn_InputStream.java | 56 +++++++++++++++
.../java/org/apache/isis/applib/anyio/AnyOut.java | 68 ++++++++++++++++++
.../org/apache/isis/applib/anyio/AnyOutBuffer.java | 62 ++++++++++++++++
.../isis/applib/anyio/AnyOut_OutputStream.java | 55 ++++++++++++++
.../java/org/apache/isis/applib/anyio/Try.java | 74 +++++++++++++++++++
.../isis/applib/client/RestfulClientConfig.java | 84 +++++++++++++++++++++-
7 files changed, 471 insertions(+), 1 deletion(-)
diff --git a/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyIn.java b/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyIn.java
new file mode 100644
index 0000000..7e5d6dc
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyIn.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.isis.applib.anyio;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import org.apache.isis.commons.internal.base._Strings;
+
+/**
+ * Universal data source.
+ *
+ * @since 2.0.0-M2
+ */
+public interface AnyIn {
+
+ // -- INTERFACE
+
+ <T> Try<T> tryApplyInputStream(Function<InputStream, Try<T>> inputConsumer);
+
+ // -- FACTORIES
+
+ static AnyIn ofTryInputStream(final Supplier<Try<InputStream>> inputStreamSupplier) {
+ return new AnyIn_InputStream(inputStreamSupplier);
+ }
+
+ static AnyIn ofFile(final File file) {
+ return ofTryInputStream(()->{
+ try {
+ InputStream fis = new FileInputStream(file);
+ return Try.success(fis);
+ } catch (FileNotFoundException e) {
+ return Try.failure(e);
+ }
+ });
+ }
+
+ static AnyIn ofInputStream(final Supplier<InputStream> inputStreamSupplier) {
+ return ofTryInputStream(()->Try.success(inputStreamSupplier.get()));
+ }
+
+ static AnyIn ofBytes(final byte[] bytes) {
+ return ofInputStream(()->new ByteArrayInputStream(bytes));
+ }
+
+ static AnyIn ofString(final String string, Charset charset) {
+ return ofBytes(_Strings.toBytes(string, charset));
+ }
+
+}
+
diff --git a/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyIn_InputStream.java b/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyIn_InputStream.java
new file mode 100644
index 0000000..9d980e8
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyIn_InputStream.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.isis.applib.anyio;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+class AnyIn_InputStream implements AnyIn {
+
+ private final Supplier<Try<InputStream>> inputStreamSupplier;
+
+ public AnyIn_InputStream(Supplier<Try<InputStream>> inputStreamSupplier) {
+ this.inputStreamSupplier = inputStreamSupplier;
+ }
+
+ @Override
+ public <T> Try<T> tryApplyInputStream(Function<InputStream, Try<T>> inputConsumer) {
+
+ Try<InputStream> try_is = inputStreamSupplier.get();
+ if(try_is.isFailure()) {
+ return Try.failure(try_is.getFailure());
+ }
+
+ try(InputStream is = try_is.getResult()) {
+
+ Try<T> _try = inputConsumer.apply(is);
+ return _try;
+
+ } catch (IOException e) {
+
+ return Try.failure(e);
+
+ }
+
+ }
+
+}
+
diff --git a/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyOut.java b/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyOut.java
new file mode 100644
index 0000000..5577b8c
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyOut.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.isis.applib.anyio;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+/**
+ * Universal data sink.
+ *
+ * @since 2.0.0-M2
+ */
+public interface AnyOut {
+
+ // -- INTERFACE
+
+ <T> Try<T> tryApplyOutputStream(Function<OutputStream, Try<T>> outputConsumer);
+
+ // -- FACTORIES
+
+ static AnyOut ofTryOutputStream(final Supplier<Try<OutputStream>> outputStreamSupplier) {
+ return new AnyOut_OutputStream(outputStreamSupplier);
+ }
+
+ static AnyOut ofFile(final File file) {
+ return ofTryOutputStream(()->{
+ try {
+ OutputStream fos = new FileOutputStream(file);
+ return Try.success(fos);
+ } catch (FileNotFoundException e) {
+ return Try.failure(e);
+ }
+ });
+ }
+
+ static AnyOut ofOutputStream(final Supplier<OutputStream> outputStreamSupplier) {
+ return ofTryOutputStream(()->Try.success(outputStreamSupplier.get()));
+ }
+
+ static AnyOutBuffer buffer(final int buffersize) {
+ return new AnyOutBuffer(buffersize);
+ }
+
+ static AnyOutBuffer buffer16k() {
+ return buffer(1024*16);
+ }
+
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyOutBuffer.java b/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyOutBuffer.java
new file mode 100644
index 0000000..b4f3e29
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyOutBuffer.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.isis.applib.anyio;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.nio.charset.Charset;
+import java.util.function.Function;
+
+import org.apache.isis.commons.internal.base._Strings;
+
+/**
+ * Universal in-memory sink, that can be read from after having been written to.
+ *
+ * @since 2.0.0-M2
+ */
+public class AnyOutBuffer implements AnyOut {
+
+ private final ByteArrayOutputStream buffer;
+ private Try<?> lastTry;
+
+ AnyOutBuffer(int buffersize) {
+ buffer = new ByteArrayOutputStream(buffersize);
+ }
+
+ @Override
+ public <T> Try<T> tryApplyOutputStream(Function<OutputStream, Try<T>> outputConsumer) {
+ if(lastTry!=null) {
+ throw new IllegalStateException("Buffer was already written to.");
+ }
+ Try<T> _try = outputConsumer.apply(buffer);
+ return _try;
+ }
+
+ public Try<byte[]> tryReadBytes(){
+ if(lastTry!=null && lastTry.isFailure()) {
+ return Try.failure(lastTry.getFailure());
+ }
+ return Try.success(buffer.toByteArray());
+ }
+
+ public Try<CharSequence> tryReadCharacters(Charset charset){
+ return tryReadBytes().map(bytes->_Strings.ofBytes(bytes, charset));
+ }
+
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyOut_OutputStream.java b/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyOut_OutputStream.java
new file mode 100644
index 0000000..ae45bef
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/anyio/AnyOut_OutputStream.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.isis.applib.anyio;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+class AnyOut_OutputStream implements AnyOut {
+
+ private final Supplier<Try<OutputStream>> outputStreamSupplier;
+
+ public AnyOut_OutputStream(Supplier<Try<OutputStream>> outputStreamSupplier) {
+ this.outputStreamSupplier = outputStreamSupplier;
+ }
+
+ @Override
+ public <T> Try<T> tryApplyOutputStream(Function<OutputStream, Try<T>> outputConsumer) {
+
+ Try<OutputStream> try_os = outputStreamSupplier.get();
+ if(try_os.isFailure()) {
+ return Try.failure(try_os.getFailure());
+ }
+
+ try(OutputStream os = try_os.getResult()) {
+
+ Try<T> _try = outputConsumer.apply(os);
+ return _try;
+
+ } catch (IOException e) {
+
+ return Try.failure(e);
+
+ }
+ }
+
+
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/anyio/Try.java b/core/applib/src/main/java/org/apache/isis/applib/anyio/Try.java
new file mode 100644
index 0000000..1a59caa
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/anyio/Try.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.isis.applib.anyio;
+
+import java.util.function.Function;
+
+/**
+ * Immutable data class, holds either a result or a failure object.
+ *
+ * @since 2.0.0-M2
+ *
+ * @param <T>
+ */
+public final class Try<T> {
+
+ private final T result;
+ private final Exception failure;
+
+ public static <T> Try<T> success(T result) {
+ return new Try<>(result, null);
+ }
+
+ public static <T> Try<T> failure(Exception failure) {
+ return new Try<>(null, failure);
+ }
+
+ private Try(T result, Exception failure) {
+ this.result = result;
+ this.failure = failure;
+ }
+
+ public boolean isSuccess() {
+ return failure==null;
+ }
+
+ public boolean isFailure() {
+ return failure!=null;
+ }
+
+ public Exception getFailure() {
+ return failure;
+ }
+
+ public T getResult() {
+ return result;
+ }
+
+ public void throwIfFailure() throws Exception {
+ if(isFailure()) {
+ throw failure;
+ }
+ }
+
+ public <R> Try<R> map(Function<T, R> mapper) {
+ return isSuccess() ? Try.success(mapper.apply(getResult())) : Try.failure(getFailure());
+ }
+
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/client/RestfulClientConfig.java b/core/applib/src/main/java/org/apache/isis/applib/client/RestfulClientConfig.java
index cdd9b84..12d8327 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/client/RestfulClientConfig.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/client/RestfulClientConfig.java
@@ -18,10 +18,19 @@
*/
package org.apache.isis.applib.client;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.isis.applib.anyio.AnyIn;
+import org.apache.isis.applib.anyio.AnyOut;
+import org.apache.isis.applib.anyio.Try;
/**
*
@@ -96,6 +105,79 @@ public class RestfulClientConfig {
this.useRequestDebugLogging = useRequestDebugLogging;
}
- // --
+ // -- MARSHALLING
+
+ public static Marshaller createMarshaller() throws JAXBException {
+ Marshaller marshaller = JAXBContext.newInstance(RestfulClientConfig.class).createMarshaller();
+ return marshaller;
+ }
+
+ public static Unmarshaller createUnmarshaller() throws JAXBException {
+ Unmarshaller unmarshaller = JAXBContext.newInstance(RestfulClientConfig.class).createUnmarshaller();
+ return unmarshaller;
+ }
+
+ // -- READ
+
+ /**
+ * Tries to read the RestfulClientConfig from universal source {@code in}.
+ * @param in - universal source {@link AnyIn}
+ * @return
+ */
+ public static Try<RestfulClientConfig> tryRead(AnyIn in) {
+
+ return in.tryApplyInputStream(is->{
+
+ try {
+ StreamSource source = new StreamSource(is);
+ RestfulClientConfig clientConfig = createUnmarshaller()
+ .unmarshal(source, RestfulClientConfig.class).getValue();
+
+ return Try.success(clientConfig);
+
+ } catch (JAXBException e) {
+
+ return Try.failure(e);
+ }
+
+ });
+
+ }
+
+ // -- WRITE
+
+ /**
+ * Tries to write this RestfulClientConfig to universal sink {@code output}.
+ * @param output - universal sink {@link AnyOut}
+ * @return
+ */
+ public Try<Void> tryWrite(AnyOut output) {
+ return output.tryApplyOutputStream(os->{
+
+ try {
+
+ createMarshaller().marshal(this, os);
+ return Try.success(null);
+
+ } catch (JAXBException e) {
+
+ return Try.failure(e);
+ }
+
+ });
+ }
+
+ /**
+ * Writes this RestfulClientConfig to universal sink {@code output}.
+ * @param output - universal sink {@link AnyOut}
+ * @throws Exception
+ */
+ public void write(AnyOut output) throws Exception {
+
+ Try<Void> _try = tryWrite(output);
+ _try.throwIfFailure();
+
+ }
+
}