You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2016/09/20 14:08:16 UTC

tomee git commit: TOMEE-1935 Fixes #44 several resource closing, thanks Svetlin Zarev for the patch

Repository: tomee
Updated Branches:
  refs/heads/master a13eebd65 -> a3402b526


TOMEE-1935 Fixes #44 several resource closing, thanks Svetlin Zarev for the patch


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/a3402b52
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/a3402b52
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/a3402b52

Branch: refs/heads/master
Commit: a3402b52657b33c597b3eb9cb6f035e5bf35a6c0
Parents: a13eebd
Author: Romain manni-Bucau <rm...@gmail.com>
Authored: Tue Sep 20 16:08:14 2016 +0200
Committer: Romain manni-Bucau <rm...@gmail.com>
Committed: Tue Sep 20 16:08:14 2016 +0200

----------------------------------------------------------------------
 .../classic/ReloadableEntityManagerFactory.java |  4 +--
 .../openejb/config/sys/SaxAppCtxConfig.java     | 23 ++++++------
 .../openejb/core/managed/RAFPassivater.java     | 11 +++---
 .../openejb/core/managed/SimplePassivater.java  | 26 ++++++++------
 .../openejb/core/stateful/RAFPassivater.java    | 12 +++----
 .../openejb/core/stateful/SimplePassivater.java | 12 +++----
 .../core/webservices/ProviderWrapper.java       |  6 ++--
 .../apache/openejb/service/ScanJarService.java  | 18 +++++-----
 .../org/apache/openejb/util/JarCreator.java     | 37 +++++++++++---------
 .../org/apache/openejb/util/UpdateChecker.java  | 17 +++++----
 .../openejb/jpa/integration/MakeTxLookup.java   |  6 ++--
 11 files changed, 88 insertions(+), 84 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/a3402b52/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
index 8b4bb59..c61b207 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
@@ -616,13 +616,11 @@ public class ReloadableEntityManagerFactory implements EntityManagerFactory, Ser
             persistence.setVersion(info.getPersistenceXMLSchemaVersion());
             persistence.getPersistenceUnit().add(pu);
 
-            try {
-                final FileWriter writer = new FileWriter(file);
+            try (final FileWriter writer = new FileWriter(file)) {
                 final JAXBContext jc = JAXBContextFactory.newInstance(Persistence.class);
                 final Marshaller marshaller = jc.createMarshaller();
                 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
                 marshaller.marshal(persistence, writer);
-                writer.close();
             } catch (final Exception e) {
                 LOGGER.error("can't dump pu " + reloadableEntityManagerFactory.getPUname() + " in file " + file, e);
             }

http://git-wip-us.apache.org/repos/asf/tomee/blob/a3402b52/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxAppCtxConfig.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxAppCtxConfig.java b/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxAppCtxConfig.java
index 98629c2..b0b9ecf 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxAppCtxConfig.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxAppCtxConfig.java
@@ -129,23 +129,26 @@ public class SaxAppCtxConfig {
             private void importFile(final String path) throws SAXException {
                 final File file = new File(path);
                 if (file.exists()) {
-                    try {
-                        parse(module, new InputSource(new FileInputStream(file)), envEntriesDeployer, beanPropertiesDeployer);
+                    try (final InputStream inputStream = new FileInputStream(file)) {
+                        parse(module, new InputSource(inputStream), envEntriesDeployer, beanPropertiesDeployer);
                     } catch (final ParserConfigurationException | IOException e) {
                         throw new SAXException(e);
                     }
                 } else { // try in the classpath
                     final ClassLoader cl = module.getClassLoader();
                     if (cl != null) {
-                        final InputStream is = cl.getResourceAsStream(path);
-                        if (is != null) {
-                            try {
-                                parse(module, new InputSource(is), envEntriesDeployer, beanPropertiesDeployer);
-                            } catch (final ParserConfigurationException | IOException e) {
-                                throw new SAXException(e);
+                        try (final InputStream is = cl.getResourceAsStream(path)) {
+                            if (is != null) {
+                                try {
+                                    parse(module, new InputSource(is), envEntriesDeployer, beanPropertiesDeployer);
+                                } catch (final ParserConfigurationException | IOException e) {
+                                    throw new SAXException(e);
+                                }
+                            } else {
+                                LOGGER.warning("Can't find " + path);
                             }
-                        } else {
-                            LOGGER.warning("Can't find " + path);
+                        } catch (final IOException e) {
+                            LOGGER.warning("Can't find " + path, e);
                         }
                     } else {
                         LOGGER.warning("Can't find " + path + ", no classloader for the module " + module);

http://git-wip-us.apache.org/repos/asf/tomee/blob/a3402b52/container/openejb-core/src/main/java/org/apache/openejb/core/managed/RAFPassivater.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/managed/RAFPassivater.java b/container/openejb-core/src/main/java/org/apache/openejb/core/managed/RAFPassivater.java
index 2b8348a..0827dcc 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/managed/RAFPassivater.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/managed/RAFPassivater.java
@@ -51,10 +51,10 @@ public class RAFPassivater implements PassivationStrategy {
 
     public synchronized void passivate(final Map stateTable)
         throws SystemException {
-        try {
+        try (final RandomAccessFile ras =
+                     new RandomAccessFile(System.getProperty("java.io.tmpdir", File.separator + "tmp") + File.separator + "passivation" + fileID + ".ser", "rw")) {
             fileID++;
 
-            final RandomAccessFile ras = new RandomAccessFile(System.getProperty("java.io.tmpdir", File.separator + "tmp") + File.separator + "passivation" + fileID + ".ser", "rw");
             final Iterator iterator = stateTable.keySet().iterator();
             Pointer lastPointer = null;
             while (iterator.hasNext()) {
@@ -72,7 +72,6 @@ public class RAFPassivater implements PassivationStrategy {
                 masterTable.put(id, lastPointer);
                 ras.write(bytes);
             }
-            ras.close();
         } catch (final Exception e) {
             throw new SystemException(e);
         }
@@ -86,9 +85,9 @@ public class RAFPassivater implements PassivationStrategy {
             return null;
         }
 
-        try {
-            final RandomAccessFile ras = new RandomAccessFile(System.getProperty("java.io.tmpdir", File.separator + "tmp") + File.separator + "passivation" + pointer.fileid + ".ser", "r");
-            final byte[] bytes = new byte[(int) pointer.bytesize];
+        try (final RandomAccessFile ras =
+                     new RandomAccessFile(System.getProperty("java.io.tmpdir", File.separator + "tmp") + File.separator + "passivation" + pointer.fileid + ".ser", "r")) {
+            final byte[] bytes = new byte[pointer.bytesize];
             ras.seek(pointer.filepointer);
             ras.readFully(bytes);
             ras.close();

http://git-wip-us.apache.org/repos/asf/tomee/blob/a3402b52/container/openejb-core/src/main/java/org/apache/openejb/core/managed/SimplePassivater.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/managed/SimplePassivater.java b/container/openejb-core/src/main/java/org/apache/openejb/core/managed/SimplePassivater.java
index 8360a16..40be8de 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/managed/SimplePassivater.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/managed/SimplePassivater.java
@@ -27,9 +27,11 @@ import org.apache.openejb.util.Logger;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.NotSerializableException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.io.OutputStream;
 import java.util.Map;
 import java.util.Properties;
 
@@ -77,11 +79,12 @@ public class SimplePassivater implements PassivationStrategy {
             }
 
             logger.info("Passivating to file " + sessionFile);
-            final ObjectOutputStream oos = new ObjectOutputStream(IO.write(sessionFile));
-
-            oos.writeObject(state);// passivate just the bean instance
-            oos.close();
-            sessionFile.deleteOnExit();
+            try (final OutputStream os = IO.write(sessionFile);
+                 final ObjectOutputStream oos = new ObjectOutputStream(os)) {
+                oos.writeObject(state);// passivate just the bean instance
+            } finally {
+                sessionFile.deleteOnExit();
+            }
         } catch (final NotSerializableException nse) {
             logger.error("Passivation failed ", nse);
             throw (SystemException) new SystemException("The type " + nse.getMessage() + " is not serializable as mandated by the EJB specification.").initCause(nse);
@@ -108,13 +111,14 @@ public class SimplePassivater implements PassivationStrategy {
             if (sessionFile.exists()) {
                 logger.info("Activating from file " + sessionFile);
 
-                final ObjectInputStream ois = new ObjectInputStreamFiltered(IO.read(sessionFile));
-                final Object state = ois.readObject();
-                ois.close();
-                if (!sessionFile.delete()) {
-                    sessionFile.deleteOnExit();
+                try (final InputStream source = IO.read(sessionFile);
+                     final ObjectInputStream ois = new ObjectInputStreamFiltered(source)) {
+                    final Object state = ois.readObject();
+                    if (!sessionFile.delete()) {
+                        sessionFile.deleteOnExit();
+                    }
+                    return state;
                 }
-                return state;
             } else {
                 logger.info("Activation failed: file not found " + sessionFile);
                 return null;

http://git-wip-us.apache.org/repos/asf/tomee/blob/a3402b52/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/RAFPassivater.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/RAFPassivater.java b/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/RAFPassivater.java
index becc747..601fc7c 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/RAFPassivater.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/RAFPassivater.java
@@ -52,10 +52,10 @@ public class RAFPassivater implements PassivationStrategy {
     @Override
     public synchronized void passivate(final Map stateTable)
         throws SystemException {
-        try {
+        try(final RandomAccessFile ras = new RandomAccessFile(
+                System.getProperty("java.io.tmpdir", File.separator + "tmp") + File.separator + "passivation" + fileID + ".ser", "rw")) {
             fileID++;
 
-            final RandomAccessFile ras = new RandomAccessFile(System.getProperty("java.io.tmpdir", File.separator + "tmp") + File.separator + "passivation" + fileID + ".ser", "rw");
             final Iterator iterator = stateTable.keySet().iterator();
             Pointer lastPointer = null;
             while (iterator.hasNext()) {
@@ -73,7 +73,6 @@ public class RAFPassivater implements PassivationStrategy {
                 masterTable.put(id, lastPointer);
                 ras.write(bytes);
             }
-            ras.close();
         } catch (final Exception e) {
             throw new SystemException(e);
         }
@@ -88,12 +87,11 @@ public class RAFPassivater implements PassivationStrategy {
             return null;
         }
 
-        try {
-            final RandomAccessFile ras = new RandomAccessFile(System.getProperty("java.io.tmpdir", File.separator + "tmp") + File.separator + "passivation" + pointer.fileid + ".ser", "r");
-            final byte[] bytes = new byte[(int) pointer.bytesize];
+        try (final RandomAccessFile ras =
+                     new RandomAccessFile(System.getProperty("java.io.tmpdir", File.separator + "tmp") + File.separator + "passivation" + pointer.fileid + ".ser", "r")) {
+            final byte[] bytes = new byte[pointer.bytesize];
             ras.seek(pointer.filepointer);
             ras.readFully(bytes);
-            ras.close();
             return Serializer.deserialize(bytes);
         } catch (final Exception e) {
             throw new SystemException(e);

http://git-wip-us.apache.org/repos/asf/tomee/blob/a3402b52/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/SimplePassivater.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/SimplePassivater.java b/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/SimplePassivater.java
index 3fba616..fdc7ebc 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/SimplePassivater.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/SimplePassivater.java
@@ -27,9 +27,11 @@ import org.apache.openejb.util.Logger;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.NotSerializableException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.io.OutputStream;
 import java.util.Map;
 import java.util.Properties;
 
@@ -80,12 +82,11 @@ public class SimplePassivater implements PassivationStrategy {
 
             logger.info("Passivating to file " + sessionFile);
 
-            final ObjectOutputStream oos = new ObjectOutputStream(IO.write(sessionFile));
-            try {
+            try (final OutputStream os = IO.write(sessionFile);
+                 final ObjectOutputStream oos = new ObjectOutputStream(os)) {
                 oos.writeObject(state);// passivate just the bean instance
             } finally {
                 sessionFile.deleteOnExit();
-                IO.close(oos);
             }
 
         } catch (final NotSerializableException nse) {
@@ -114,11 +115,10 @@ public class SimplePassivater implements PassivationStrategy {
             if (sessionFile.exists()) {
                 logger.info("Activating from file " + sessionFile);
 
-                final ObjectInputStream ois = new EjbObjectInputStream(IO.read(sessionFile));
-                try {
+                try (final InputStream source = IO.read(sessionFile);
+                     final ObjectInputStream ois = new EjbObjectInputStream(source)) {
                     return ois.readObject();
                 } finally {
-                    IO.close(ois);
                     if (!sessionFile.delete()) {
                         sessionFile.deleteOnExit();
                     }

http://git-wip-us.apache.org/repos/asf/tomee/blob/a3402b52/container/openejb-core/src/main/java/org/apache/openejb/core/webservices/ProviderWrapper.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/webservices/ProviderWrapper.java b/container/openejb-core/src/main/java/org/apache/openejb/core/webservices/ProviderWrapper.java
index 62edd00..b467092 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/webservices/ProviderWrapper.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/webservices/ProviderWrapper.java
@@ -464,9 +464,9 @@ public class ProviderWrapper extends Provider {
                     tempFile = File.createTempFile("openejb-jaxws-provider", "tmp", tmp);
                 }
                 tempFile.deleteOnExit();
-                final OutputStream out = IO.write(tempFile);
-                out.write(ProviderWrapper.class.getName().getBytes());
-                out.close();
+                try (final OutputStream out = IO.write(tempFile)) {
+                    out.write(ProviderWrapper.class.getName().getBytes());
+                }
                 PROVIDER_URL = tempFile.toURI().toURL();
             } catch (final IOException e) {
                 throw new OpenEJBRuntimeException("Cound not create openejb-jaxws-provider file");

http://git-wip-us.apache.org/repos/asf/tomee/blob/a3402b52/container/openejb-core/src/main/java/org/apache/openejb/service/ScanJarService.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/service/ScanJarService.java b/container/openejb-core/src/main/java/org/apache/openejb/service/ScanJarService.java
index 55bc62c..b175419 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/service/ScanJarService.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/service/ScanJarService.java
@@ -126,21 +126,21 @@ public class ScanJarService {
 
                     final File beansXml = new File(file, "META-INF/beans.xml");
                     if (beansXml.exists()) {
-                        final FileInputStream inputStream = new FileInputStream(beansXml);
-                        final Beans beansModel = ReadDescriptors.readBeans(inputStream);
-                        mergedModel.mergeClasses(url, beansModel);
-                        inputStream.close();
+                        try (final FileInputStream inputStream = new FileInputStream(beansXml)) {
+                            final Beans beansModel = ReadDescriptors.readBeans(inputStream);
+                            mergedModel.mergeClasses(url, beansModel);
+                        }
                     }
                 } else {
                     final FinderFactory.OpenEJBAnnotationFinder finder = new FinderFactory.OpenEJBAnnotationFinder(new JarArchive(loader, url));
                     mergedModel.getManagedClasses().put(url, finder.getAnnotatedClassNames());
 
                     try (final URLClassLoader cl = new URLClassLoader(new URL[]{ url })) {
-                        final InputStream is = cl.getResourceAsStream("META-INF/beans.xml");
-                        if (is != null) {
-                            final Beans beansModel = ReadDescriptors.readBeans(is);
-                            mergedModel.mergeClasses(url, beansModel);
-                            is.close();
+                        try (final InputStream is = cl.getResourceAsStream("META-INF/beans.xml")) {
+                            if (is != null) {
+                                final Beans beansModel = ReadDescriptors.readBeans(is);
+                                mergedModel.mergeClasses(url, beansModel);
+                            }
                         }
                     }
                 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/a3402b52/container/openejb-core/src/main/java/org/apache/openejb/util/JarCreator.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/util/JarCreator.java b/container/openejb-core/src/main/java/org/apache/openejb/util/JarCreator.java
index 45bd836..04a1523 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/util/JarCreator.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/util/JarCreator.java
@@ -37,16 +37,19 @@ public final class JarCreator {
         final String[] entries = dir.list();
         final JarOutputStream out = new JarOutputStream(new FileOutputStream(zipName));
 
-        String prefix = dir.getAbsolutePath();
-        if (!prefix.endsWith(File.separator)) {
-            prefix += File.separator;
-        }
+        try {
+            String prefix = dir.getAbsolutePath();
+            if (!prefix.endsWith(File.separator)) {
+                prefix += File.separator;
+            }
 
-        for (final String entry : entries) {
-            final File f = new File(dir, entry);
-            jarFile(out, f, prefix);
+            for (final String entry : entries) {
+                final File f = new File(dir, entry);
+                jarFile(out, f, prefix);
+            }
+        } finally {
+            IO.close(out);
         }
-        IO.close(out);
     }
 
     private static void jarFile(final JarOutputStream out, final File f, final String prefix) throws IOException {
@@ -58,18 +61,18 @@ public final class JarCreator {
                 }
             }
         } else {
-            final byte[] buffer = new byte[BUFFER_SIZE];
-            int bytesRead;
-
             final String path = f.getPath().replace(prefix, "");
 
-            final FileInputStream in = new FileInputStream(f);
-            final JarEntry entry = new JarEntry(path);
-            out.putNextEntry(entry);
-            while ((bytesRead = in.read(buffer)) != -1) {
-                out.write(buffer, 0, bytesRead);
+            try (final FileInputStream in = new FileInputStream(f)) {
+                final JarEntry entry = new JarEntry(path);
+                out.putNextEntry(entry);
+
+                final byte[] buffer = new byte[BUFFER_SIZE];
+                int bytesRead;
+                while ((bytesRead = in.read(buffer)) != -1) {
+                    out.write(buffer, 0, bytesRead);
+                }
             }
-            IO.close(in);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/a3402b52/container/openejb-core/src/main/java/org/apache/openejb/util/UpdateChecker.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/util/UpdateChecker.java b/container/openejb-core/src/main/java/org/apache/openejb/util/UpdateChecker.java
index e10a041..68e4339 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/util/UpdateChecker.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/util/UpdateChecker.java
@@ -149,15 +149,14 @@ public class UpdateChecker {
 
     public boolean usesLatest() {
         if (artifact().contains(TOMEE_ARTIFACT)) {
-            final InputStream is = getClass().getClassLoader().getResourceAsStream("META-INF/maven/org.apache.openejb/tomee-catalina/pom.properties");
-            if (is != null) {
-                final Properties prop = new Properties();
-                try {
+            try (final InputStream is = getClass().getClassLoader().getResourceAsStream("META-INF/maven/org.apache.openejb/tomee-catalina/pom.properties")) {
+                if (is != null) {
+                    final Properties prop = new Properties();
                     prop.load(is);
                     current = prop.getProperty("version");
-                } catch (final IOException e) {
-                    LOGGER.error("can't get tomee version, will use openejb one");
                 }
+            } catch (IOException e) {
+                LOGGER.error("can't get tomee version, will use openejb one");
             }
         }
 
@@ -177,9 +176,9 @@ public class UpdateChecker {
         if (current.equals(latest)) {
             return "running on the latest version";
         }
-        return new StringBuilder("you are using the version ").append(current)
-            .append(", our latest stable version ").append(latest)
-            .append(" is available on ").append(repoUrl).toString();
+        return "you are using the version " + current +
+                ", our latest stable version " + latest +
+                " is available on " + repoUrl;
     }
 
     public void setRepoUrl(final String repoUrl) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/a3402b52/container/openejb-jpa-integration/src/main/java/org/apache/openejb/jpa/integration/MakeTxLookup.java
----------------------------------------------------------------------
diff --git a/container/openejb-jpa-integration/src/main/java/org/apache/openejb/jpa/integration/MakeTxLookup.java b/container/openejb-jpa-integration/src/main/java/org/apache/openejb/jpa/integration/MakeTxLookup.java
index b03ec92..23a1951 100644
--- a/container/openejb-jpa-integration/src/main/java/org/apache/openejb/jpa/integration/MakeTxLookup.java
+++ b/container/openejb-jpa-integration/src/main/java/org/apache/openejb/jpa/integration/MakeTxLookup.java
@@ -198,9 +198,9 @@ public class MakeTxLookup implements Opcodes {
             file = new File(file, part);
         }
         file.getParentFile().mkdirs();
-        final FileOutputStream out = new FileOutputStream(file);
-        out.write(cw.toByteArray());
-        out.close();
+        try (final FileOutputStream out = new FileOutputStream(file)) {
+            out.write(cw.toByteArray());
+        }
     }
 
 }