o
    !wi                     @   s   d Z ddlZddlZddlmZ ddlmZ g dZdd Z	d	d
 Z
g Zdd Zdd ZG dd deZdd ZG dd dZeje  i ZdddZed ed ed ed ed ed ed dS )a  
JPype Imports Module
--------------------

Once imported this module will place the standard Top Level Domains (TLD) into
the Python scope. These TLDs are ``java``, ``com``, ``org``, ``gov``, ``mil``,
``net`` and ``edu``. Java symbols from these domains can be imported using the
standard Python syntax.

Forms supported:
   - **import <java_pkg> [ as <name> ]**
   - **import <java_pkg>.<java_class> [ as <name> ]**
   - **from <java_pkg> import <java_class>[,<java_class>*]**
   - **from <java_pkg> import <java_class> [ as <name> ]**
   - **from <java_pkg>.<java_class> import <java_static> [ as <name> ]**
   - **from <java_pkg>.<java_class> import <java_inner> [ as <name> ]**

For further information please read the :doc:`imports` guide.

Example:

.. code-block:: python

   import jpype
   import jpype.imports
   jpype.startJVM()

   # Import java packages as modules
   from java.lang import String

    N)
ModuleSpec   )_pykeywords)registerImportCustomizerregisterDomainJImportCustomizerc                 C   s0   |  ds| S | d d tjv r| d d S | S )N_)endswithr   	_KEYWORDSname r   J/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/jpype/imports.py_keywordUnwrap;   s
   
r   c                 C   s   | t jv r	| d S | S )Nr   )r   r   r   r   r   r   _keywordWrapC   s   
r   c                 C   s   t | d | }t|j}|  |dkrtd| ||dkr'td| ||dkr<t |dd}td||f |td	| |)
N.z%java.lang.ExceptionInInitializerErrorz.Unable to import '%s' due to initializer errorz&java.lang.UnsupportedClassVersionErrorz3Unable to import '%s' due to incorrect Java versionzjava.lang.NoClassDefFoundError/z4Unable to import '%s' due to missing dependency '%s'zUnable to import '%s')strtype__name___expandStacktraceImportErrorreplace)pkgr   exjavanameexnamemissingr   r   r   _JExceptionHandlerM   s.   
r   c                 C   s   t |  dS )zc Import customizers can be used to import python packages
    into java modules automatically.
    N)_CUSTOMIZERSappend)
customizerr   r   r   r   ^   s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   a   Base class for Import customizer.

    Import customizers should implement canCustomize and getSpec.

    Example:

    .. code-block:: python

       # Site packages for each java package are stored under $DEVEL/<java_pkg>/py
       class SiteCustomizer(jpype.imports.JImportCustomizer):
           def canCustomize(self, name):
               if name.startswith('org.mysite') and name.endswith('.py'):
                   return True
               return False
           def getSpec(self, name):
               pname = name[:-3]
               devel = os.environ.get('DEVEL')
               path = os.path.join(devel, pname,'py','__init__.py')
               return importlib.util.spec_from_file_location(name, path)
   c                 C   s   dS )z Determine if this path is to be treated differently

        Return:
            True if an alternative spec is required.
        Fr   selfr   r   r   r   canCustomize}   s   zJImportCustomizer.canCustomizec                 C   s   t )z. Get the module spec for this module.
        )NotImplementedErrorr#   r   r   r   getSpec   s   zJImportCustomizer.getSpecN)r   
__module____qualname____doc__r%   r'   r   r   r   r   r   g   s    r   c                 C   s&   d| vr| S d dd | dD S )Nr   r   c                 S   s   g | ]}t |qS r   )r   ).0ir   r   r   
<listcomp>   s    zunwrap.<locals>.<listcomp>)joinsplitr   r   r   r   unwrap   s   r0   c                   @   s,   e Zd ZdZd	ddZ	 dd Zdd ZdS )
_JImportLoaderz' (internal) Finder hook for importlib. Nc              
   C   s  t  s|dd }|tvrd S td| |tv r6t| }t |s,td||f t|| }||_|S |d}|d sPt |d rPt|| }||_|S |d s]t |d s]d S t	j
|d d }|rnt|t jspd S t|}tD ]}||r||  S qvt||d szt j|dt j}	|	 d@ dkrtd| td	|  ty }
 ztd
| |
d }
~
ww t|| S )Nr   r   z/Attempt to create Java package '%s' without jvmz4Java package '%s' not found, requested by alias '%s'r      TzClass `%s` is not publicz)Class `%s` was found but was not expectedzFailed to import '%s')_jpype	isStarted	partition	_JDOMAINSr   	isPackage_ModuleSpec_jname
rpartitionsysmodulesget
isinstance	_JPackager0   r    r%   r'   hasattr_java_lang_ClassforNameJPypeClassLoadergetModifiers	Exception)r$   r   pathtargetbasejnamemspartsr"   clsr   r   r   r   	find_spec   s\   






z_JImportLoader.find_specc                 C   sD   |j dkrt|jS |jdd}ttj|j  |d }t	|_
|S )N r   r   )parentr3   r?   r9   r   rsplitgetattrr;   r<   r   _handler)r$   specrK   rcr   r   r   create_module   s   
z_JImportLoader.create_modulec                 C   s   d S Nr   )r$   fullnamer   r   r   exec_module   s   z_JImportLoader.exec_modulerV   )r   r(   r)   r*   rM   rU   rX   r   r   r   r   r1      s    
?
r1   c                 C   s   |s| }|t | < dS )a   Add a Java domain to Python as a dynamic module.

    This can be used to bind a Java path to a Python path.

    Args:
        mod(str): Is the Python module to bind to Java.
        alias(str, optional): Is the name of the Java path if different
          than the Python name.
    N)r6   )modaliasr   r   r   r      s   
r   comgovjavaorgmiledunetrV   )r*   r;   r3   importlib.machineryr   r8   rN   r   __all__r   r   r    r   r   objectr   r0   r1   	meta_pathr!   r6   r   r   r   r   r   <module>   s0   	&S
