This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 3ad401fccb8083153fb58bd78759157b03214fe5 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Wed Apr 8 12:46:10 2020 +0200 CAMEL-14864: Be able to generate configurer for any pojo. WIP --- .../org/apache/camel/spi/PropertiesFunction.java | 0 core/camel-main/pom.xml | 18 --- .../camel/main/ExtendedCamelContextConfigurer.java | 157 --------------------- .../apache/camel/configurer/ExtendedCamelContext | 2 - .../camel/main/HystrixConfigurationProperties.java | 3 + .../camel/main/MainConfigurationProperties.java | 3 + .../main/Resilience4jConfigurationProperties.java | 3 + .../camel/main/RestConfigurationProperties.java | 2 + .../maven/packaging/GenerateConfigurerMojo.java | 4 + .../camel/maven/packaging/MainConfigurerMojo.java | 154 -------------------- 10 files changed, 15 insertions(+), 331 deletions(-) diff --git a/core/camel-api/src/generated/java/org/apache/camel/spi/PropertiesFunction.java b/core/camel-api/src/main/java/org/apache/camel/spi/PropertiesFunction.java similarity index 100% rename from core/camel-api/src/generated/java/org/apache/camel/spi/PropertiesFunction.java rename to core/camel-api/src/main/java/org/apache/camel/spi/PropertiesFunction.java diff --git a/core/camel-main/pom.xml b/core/camel-main/pom.xml index a13dea6..bcd57da 100644 --- a/core/camel-main/pom.xml +++ b/core/camel-main/pom.xml @@ -128,22 +128,4 @@ </dependency> </dependencies> - <build> - <plugins> - <plugin> - <groupId>org.apache.camel</groupId> - <artifactId>camel-package-maven-plugin</artifactId> - <executions> - <execution> - <id>generate</id> - <goals> - <goal>generate-main-configurer</goal> - </goals> - <phase>process-classes</phase> - </execution> - </executions> - </plugin> - </plugins> - </build> - </project> diff --git a/core/camel-main/src/generated/java/org/apache/camel/main/ExtendedCamelContextConfigurer.java b/core/camel-main/src/generated/java/org/apache/camel/main/ExtendedCamelContextConfigurer.java deleted file mode 100644 index 2702d26..0000000 --- a/core/camel-main/src/generated/java/org/apache/camel/main/ExtendedCamelContextConfigurer.java +++ /dev/null @@ -1,157 +0,0 @@ -/* Generated by camel build tools - do NOT edit this file! */ -package org.apache.camel.main; - -import org.apache.camel.CamelContext; -import org.apache.camel.spi.GeneratedPropertyConfigurer; -import org.apache.camel.ExtendedCamelContext; - -/** - * Generated by camel build tools - do NOT edit this file! - */ -@SuppressWarnings("unchecked") -public class ExtendedCamelContextConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer { - - @Override - public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { - org.apache.camel.ExtendedCamelContext target = (org.apache.camel.ExtendedCamelContext) obj; - switch (ignoreCase ? name.toLowerCase() : name) { - case "allowuseoriginalmessage": - case "AllowUseOriginalMessage": target.setAllowUseOriginalMessage(property(camelContext, java.lang.Boolean.class, value)); return true; - case "applicationcontextclassloader": - case "ApplicationContextClassLoader": target.setApplicationContextClassLoader(property(camelContext, java.lang.ClassLoader.class, value)); return true; - case "asyncprocessorawaitmanager": - case "AsyncProcessorAwaitManager": target.setAsyncProcessorAwaitManager(property(camelContext, org.apache.camel.spi.AsyncProcessorAwaitManager.class, value)); return true; - case "autostartup": - case "AutoStartup": target.setAutoStartup(property(camelContext, java.lang.Boolean.class, value)); return true; - case "backlogtracing": - case "BacklogTracing": target.setBacklogTracing(property(camelContext, java.lang.Boolean.class, value)); return true; - case "beanintrospection": - case "BeanIntrospection": target.setBeanIntrospection(property(camelContext, org.apache.camel.spi.BeanIntrospection.class, value)); return true; - case "caseinsensitiveheaders": - case "CaseInsensitiveHeaders": target.setCaseInsensitiveHeaders(property(camelContext, java.lang.Boolean.class, value)); return true; - case "classresolver": - case "ClassResolver": target.setClassResolver(property(camelContext, org.apache.camel.spi.ClassResolver.class, value)); return true; - case "componentnameresolver": - case "ComponentNameResolver": target.setComponentNameResolver(property(camelContext, org.apache.camel.spi.ComponentNameResolver.class, value)); return true; - case "componentresolver": - case "ComponentResolver": target.setComponentResolver(property(camelContext, org.apache.camel.spi.ComponentResolver.class, value)); return true; - case "configurerresolver": - case "ConfigurerResolver": target.setConfigurerResolver(property(camelContext, org.apache.camel.spi.ConfigurerResolver.class, value)); return true; - case "dataformatresolver": - case "DataFormatResolver": target.setDataFormatResolver(property(camelContext, org.apache.camel.spi.DataFormatResolver.class, value)); return true; - case "debugger": - case "Debugger": target.setDebugger(property(camelContext, org.apache.camel.spi.Debugger.class, value)); return true; - case "debugging": - case "Debugging": target.setDebugging(property(camelContext, java.lang.Boolean.class, value)); return true; - case "delayer": - case "Delayer": target.setDelayer(property(camelContext, java.lang.Long.class, value)); return true; - case "errorhandlerfactory": - case "ErrorHandlerFactory": target.setErrorHandlerFactory(property(camelContext, org.apache.camel.ErrorHandlerFactory.class, value)); return true; - case "eventnotificationapplicable": - case "EventNotificationApplicable": target.setEventNotificationApplicable(property(camelContext, boolean.class, value)); return true; - case "executorservicemanager": - case "ExecutorServiceManager": target.setExecutorServiceManager(property(camelContext, org.apache.camel.spi.ExecutorServiceManager.class, value)); return true; - case "factoryfinderresolver": - case "FactoryFinderResolver": target.setFactoryFinderResolver(property(camelContext, org.apache.camel.spi.FactoryFinderResolver.class, value)); return true; - case "globaloptions": - case "GlobalOptions": target.setGlobalOptions(property(camelContext, java.util.Map.class, value)); return true; - case "headersmapfactory": - case "HeadersMapFactory": target.setHeadersMapFactory(property(camelContext, org.apache.camel.spi.HeadersMapFactory.class, value)); return true; - case "inflightrepository": - case "InflightRepository": target.setInflightRepository(property(camelContext, org.apache.camel.spi.InflightRepository.class, value)); return true; - case "injector": - case "Injector": target.setInjector(property(camelContext, org.apache.camel.spi.Injector.class, value)); return true; - case "languageresolver": - case "LanguageResolver": target.setLanguageResolver(property(camelContext, org.apache.camel.spi.LanguageResolver.class, value)); return true; - case "loadtypeconverters": - case "LoadTypeConverters": target.setLoadTypeConverters(property(camelContext, java.lang.Boolean.class, value)); return true; - case "logexhaustedmessagebody": - case "LogExhaustedMessageBody": target.setLogExhaustedMessageBody(property(camelContext, java.lang.Boolean.class, value)); return true; - case "logmask": - case "LogMask": target.setLogMask(property(camelContext, java.lang.Boolean.class, value)); return true; - case "mdcloggingkeyspattern": - case "MDCLoggingKeysPattern": target.setMDCLoggingKeysPattern(property(camelContext, java.lang.String.class, value)); return true; - case "managementname": - case "ManagementName": target.setManagementName(property(camelContext, java.lang.String.class, value)); return true; - case "managementnamestrategy": - case "ManagementNameStrategy": target.setManagementNameStrategy(property(camelContext, org.apache.camel.spi.ManagementNameStrategy.class, value)); return true; - case "managementstrategy": - case "ManagementStrategy": target.setManagementStrategy(property(camelContext, org.apache.camel.spi.ManagementStrategy.class, value)); return true; - case "messagehistory": - case "MessageHistory": target.setMessageHistory(property(camelContext, java.lang.Boolean.class, value)); return true; - case "messagehistoryfactory": - case "MessageHistoryFactory": target.setMessageHistoryFactory(property(camelContext, org.apache.camel.spi.MessageHistoryFactory.class, value)); return true; - case "modeljaxbcontextfactory": - case "ModelJAXBContextFactory": target.setModelJAXBContextFactory(property(camelContext, org.apache.camel.spi.ModelJAXBContextFactory.class, value)); return true; - case "modeltoxmldumper": - case "ModelToXMLDumper": target.setModelToXMLDumper(property(camelContext, org.apache.camel.spi.ModelToXMLDumper.class, value)); return true; - case "name": - case "Name": target.setName(property(camelContext, java.lang.String.class, value)); return true; - case "namestrategy": - case "NameStrategy": target.setNameStrategy(property(camelContext, org.apache.camel.spi.CamelContextNameStrategy.class, value)); return true; - case "nodeidfactory": - case "NodeIdFactory": target.setNodeIdFactory(property(camelContext, org.apache.camel.spi.NodeIdFactory.class, value)); return true; - case "packagescanclassresolver": - case "PackageScanClassResolver": target.setPackageScanClassResolver(property(camelContext, org.apache.camel.spi.PackageScanClassResolver.class, value)); return true; - case "packagescanresourceresolver": - case "PackageScanResourceResolver": target.setPackageScanResourceResolver(property(camelContext, org.apache.camel.spi.PackageScanResourceResolver.class, value)); return true; - case "processorfactory": - case "ProcessorFactory": target.setProcessorFactory(property(camelContext, org.apache.camel.spi.ProcessorFactory.class, value)); return true; - case "propertiescomponent": - case "PropertiesComponent": target.setPropertiesComponent(property(camelContext, org.apache.camel.spi.PropertiesComponent.class, value)); return true; - case "reactiveexecutor": - case "ReactiveExecutor": target.setReactiveExecutor(property(camelContext, org.apache.camel.spi.ReactiveExecutor.class, value)); return true; - case "registry": - case "Registry": target.setRegistry(property(camelContext, org.apache.camel.spi.Registry.class, value)); return true; - case "restbindingjaxbdataformatfactory": - case "RestBindingJaxbDataFormatFactory": target.setRestBindingJaxbDataFormatFactory(property(camelContext, org.apache.camel.spi.RestBindingJaxbDataFormatFactory.class, value)); return true; - case "restconfiguration": - case "RestConfiguration": target.setRestConfiguration(property(camelContext, org.apache.camel.spi.RestConfiguration.class, value)); return true; - case "restregistry": - case "RestRegistry": target.setRestRegistry(property(camelContext, org.apache.camel.spi.RestRegistry.class, value)); return true; - case "routecontroller": - case "RouteController": target.setRouteController(property(camelContext, org.apache.camel.spi.RouteController.class, value)); return true; - case "runtimecamelcatalog": - case "RuntimeCamelCatalog": target.setRuntimeCamelCatalog(property(camelContext, org.apache.camel.catalog.RuntimeCamelCatalog.class, value)); return true; - case "runtimeendpointregistry": - case "RuntimeEndpointRegistry": target.setRuntimeEndpointRegistry(property(camelContext, org.apache.camel.spi.RuntimeEndpointRegistry.class, value)); return true; - case "sslcontextparameters": - case "SSLContextParameters": target.setSSLContextParameters(property(camelContext, org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true; - case "shutdownroute": - case "ShutdownRoute": target.setShutdownRoute(property(camelContext, org.apache.camel.ShutdownRoute.class, value)); return true; - case "shutdownrunningtask": - case "ShutdownRunningTask": target.setShutdownRunningTask(property(camelContext, org.apache.camel.ShutdownRunningTask.class, value)); return true; - case "shutdownstrategy": - case "ShutdownStrategy": target.setShutdownStrategy(property(camelContext, org.apache.camel.spi.ShutdownStrategy.class, value)); return true; - case "streamcaching": - case "StreamCaching": target.setStreamCaching(property(camelContext, java.lang.Boolean.class, value)); return true; - case "streamcachingstrategy": - case "StreamCachingStrategy": target.setStreamCachingStrategy(property(camelContext, org.apache.camel.spi.StreamCachingStrategy.class, value)); return true; - case "tracer": - case "Tracer": target.setTracer(property(camelContext, org.apache.camel.spi.Tracer.class, value)); return true; - case "tracing": - case "Tracing": target.setTracing(property(camelContext, java.lang.Boolean.class, value)); return true; - case "tracingpattern": - case "TracingPattern": target.setTracingPattern(property(camelContext, java.lang.String.class, value)); return true; - case "typeconverterregistry": - case "TypeConverterRegistry": target.setTypeConverterRegistry(property(camelContext, org.apache.camel.spi.TypeConverterRegistry.class, value)); return true; - case "typeconverterstatisticsenabled": - case "TypeConverterStatisticsEnabled": target.setTypeConverterStatisticsEnabled(property(camelContext, java.lang.Boolean.class, value)); return true; - case "unitofworkfactory": - case "UnitOfWorkFactory": target.setUnitOfWorkFactory(property(camelContext, org.apache.camel.spi.UnitOfWorkFactory.class, value)); return true; - case "usebreadcrumb": - case "UseBreadcrumb": target.setUseBreadcrumb(property(camelContext, java.lang.Boolean.class, value)); return true; - case "usedatatype": - case "UseDataType": target.setUseDataType(property(camelContext, java.lang.Boolean.class, value)); return true; - case "usemdclogging": - case "UseMDCLogging": target.setUseMDCLogging(property(camelContext, java.lang.Boolean.class, value)); return true; - case "uuidgenerator": - case "UuidGenerator": target.setUuidGenerator(property(camelContext, org.apache.camel.spi.UuidGenerator.class, value)); return true; - case "xmlroutesdefinitionloader": - case "XMLRoutesDefinitionLoader": target.setXMLRoutesDefinitionLoader(property(camelContext, org.apache.camel.spi.XMLRoutesDefinitionLoader.class, value)); return true; - default: return false; - } - } - -} - diff --git a/core/camel-main/src/generated/resources/META-INF/services/org/apache/camel/configurer/ExtendedCamelContext b/core/camel-main/src/generated/resources/META-INF/services/org/apache/camel/configurer/ExtendedCamelContext deleted file mode 100644 index dcc120a..0000000 --- a/core/camel-main/src/generated/resources/META-INF/services/org/apache/camel/configurer/ExtendedCamelContext +++ /dev/null @@ -1,2 +0,0 @@ -# Generated by camel build tools - do NOT edit this file! -class=org.apache.camel.main.ExtendedCamelContextConfigurer diff --git a/core/camel-main/src/main/java/org/apache/camel/main/HystrixConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/HystrixConfigurationProperties.java index a86e3df..c4ad458 100644 --- a/core/camel-main/src/main/java/org/apache/camel/main/HystrixConfigurationProperties.java +++ b/core/camel-main/src/main/java/org/apache/camel/main/HystrixConfigurationProperties.java @@ -21,9 +21,12 @@ import java.util.concurrent.Future; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import org.apache.camel.spi.Configurer; + /** * Global configuration for Hystrix EIP circuit breaker. */ +@Configurer public class HystrixConfigurationProperties { private final MainConfigurationProperties parent; diff --git a/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java index c5eca6d..eb7180f 100644 --- a/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java +++ b/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java @@ -16,9 +16,12 @@ */ package org.apache.camel.main; +import org.apache.camel.spi.Configurer; + /** * Global configuration for Camel Main to setup context name, stream caching and other global configurations. */ +@Configurer public class MainConfigurationProperties extends DefaultConfigurationProperties<MainConfigurationProperties> { private boolean autoConfigurationEnabled = true; diff --git a/core/camel-main/src/main/java/org/apache/camel/main/Resilience4jConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/Resilience4jConfigurationProperties.java index 35d5c95..cf5bc5d 100644 --- a/core/camel-main/src/main/java/org/apache/camel/main/Resilience4jConfigurationProperties.java +++ b/core/camel-main/src/main/java/org/apache/camel/main/Resilience4jConfigurationProperties.java @@ -18,9 +18,12 @@ package org.apache.camel.main; import java.util.concurrent.ForkJoinPool; +import org.apache.camel.spi.Configurer; + /** * Global configuration for Resilience EIP circuit breaker. */ +@Configurer public class Resilience4jConfigurationProperties { private final MainConfigurationProperties parent; diff --git a/core/camel-main/src/main/java/org/apache/camel/main/RestConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/RestConfigurationProperties.java index da64bb7..e582fca 100644 --- a/core/camel-main/src/main/java/org/apache/camel/main/RestConfigurationProperties.java +++ b/core/camel-main/src/main/java/org/apache/camel/main/RestConfigurationProperties.java @@ -18,12 +18,14 @@ package org.apache.camel.main; import java.util.HashMap; +import org.apache.camel.spi.Configurer; import org.apache.camel.spi.RestConfiguration; import org.apache.camel.support.PatternHelper; /** * Global configuration for Rest DSL. */ +@Configurer public class RestConfigurationProperties extends RestConfiguration { private final MainConfigurationProperties parent; diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateConfigurerMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateConfigurerMojo.java index 55f7265..1527855 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateConfigurerMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateConfigurerMojo.java @@ -79,6 +79,10 @@ public class GenerateConfigurerMojo extends AbstractGeneratorMojo { @Override public void execute() throws MojoExecutionException, MojoFailureException { + if ("pom".equals(project.getPackaging())) { + return; + } + if (sourcesOutputDir == null) { sourcesOutputDir = new File(project.getBasedir(), "src/generated/java"); } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MainConfigurerMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MainConfigurerMojo.java deleted file mode 100644 index 533b7d9..0000000 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MainConfigurerMojo.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * 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.camel.maven.packaging; - -import java.io.File; -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.List; - -import org.apache.camel.tooling.model.BaseOptionModel; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.LifecyclePhase; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.plugins.annotations.Parameter; -import org.springframework.util.ReflectionUtils; - -/** - * Generate configurer classes for camel-main. - */ -@Mojo(name = "generate-main-configurer", threadSafe = true, defaultPhase = LifecyclePhase.PROCESS_CLASSES) -@Deprecated -public class MainConfigurerMojo extends AbstractGeneratorMojo { - - private static final String[] CLASS_NAMES = new String[]{ - "org.apache.camel.main.MainConfigurationProperties", - "org.apache.camel.main.HystrixConfigurationProperties", - "org.apache.camel.main.Resilience4jConfigurationProperties", - "org.apache.camel.main.RestConfigurationProperties", - "org.apache.camel.ExtendedCamelContext"}; - - /** - * The output directory for generated java source code - */ - @Parameter(defaultValue = "${project.basedir}/src/generated/java") - protected File srcOutDir; - - @Parameter(defaultValue = "${project.basedir}/src/generated/resources") - protected File resourcesOutputDir; - - private DynamicClassLoader projectClassLoader; - - private static class Option extends BaseOptionModel { - - public Option(String name, Class type) { - // we just use name, type - setName(name); - setJavaType(type.getName()); - } - } - - @Override - public void execute() throws MojoExecutionException, MojoFailureException { - List<String> cp = new ArrayList<>(); - cp.add(0, project.getBuild().getOutputDirectory()); - project.getDependencyArtifacts().forEach(a -> { - if (a.isResolved() && a.getFile() != null) { - cp.add(a.getFile().getPath()); - } - }); - projectClassLoader = DynamicClassLoader.createDynamicClassLoader(cp); - - for (String fqn : CLASS_NAMES) { - try { - List<Option> options = processClass(fqn); - generateConfigurer(fqn, options); - generateMetaInfConfigurer(fqn); - } catch (Exception e) { - throw new MojoExecutionException("Error processing class: " + fqn, e); - } - } - } - - private List<Option> processClass(String name) throws ClassNotFoundException { - List<Option> answer = new ArrayList<>(); - - Class clazz = projectClassLoader.loadClass(name); - // find all public setters - ReflectionUtils.doWithMethods(clazz, m -> { - boolean setter = m.getName().length() >= 4 && m.getName().startsWith("set") && Character.isUpperCase(m.getName().charAt(3)); - setter &= Modifier.isPublic(m.getModifiers()) && m.getParameterCount() == 1; - setter &= filterSetter(m); - if (setter) { - String t = Character.toUpperCase(m.getName().charAt(3)) + m.getName().substring(3 + 1); - answer.add(new Option(t, m.getParameterTypes()[0])); - } - }); - - return answer; - } - - private boolean filterSetter(Method setter) { - // special for some - if ("setBindingMode".equals(setter.getName())) { - // we only want the string setter - return setter.getParameterTypes()[0] == String.class; - } else if ("setHostNameResolver".equals(setter.getName())) { - // we only want the string setter - return setter.getParameterTypes()[0] == String.class; - } - - return true; - } - - private void generateConfigurer(String name, List<Option> options) throws IOException { - String pn = "org.apache.camel.main"; - String cn = name.substring(name.lastIndexOf('.') + 1) + "Configurer"; - String en = name; - String pfqn = name; - String psn = "org.apache.camel.support.component.PropertyConfigurerSupport"; - - StringWriter sw = new StringWriter(); - PropertyMainConfigurerGenerator.generatePropertyConfigurer(pn, cn, en, pfqn, psn, options, sw); - - String source = sw.toString(); - - String fileName = pn.replace('.', '/') + "/" + cn + ".java"; - boolean updated = updateResource(srcOutDir.toPath(), fileName, source); - if (updated) { - getLog().info("Updated " + fileName); - } - } - - private void generateMetaInfConfigurer(String name) { - String pn = "org.apache.camel.main"; - String en = name.substring(name.lastIndexOf('.') + 1); - try (Writer w = new StringWriter()) { - w.append("# " + GENERATED_MSG + "\n"); - w.append("class=").append(pn).append(".").append(en).append("Configurer").append("\n"); - updateResource(resourcesOutputDir.toPath(), "META-INF/services/org/apache/camel/configurer/" + en, w.toString()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - -}