java-bridge 0.99 → 0.20130606.3
raw patch · 46 files changed
Files
- dist/build/Foreign/Java.hs +1/−8
- dist/build/Foreign/Java/Bindings.hs +134/−342
- dist/build/Foreign/Java/Bindings/Haskell2Java.hs +7/−0
- dist/build/Foreign/Java/Bindings/Java2Haskell.hs +342/−0
- dist/build/Foreign/Java/Bindings/Support.hs +357/−0
- dist/build/Foreign/Java/JNI/Safe.hs +1/−45
- dist/build/Foreign/Java/JNI/Unsafe.hs +1/−45
- dist/build/h2js/h2js-tmp/Main.hs +97/−0
- dist/build/j2hs/j2hs-tmp/Java2Haskell.hs +238/−0
- dist/build/j2hs/j2hs-tmp/Main.hs +131/−0
- examples/calculator/calculator.cabal +22/−0
- examples/calculator/src/calculator.hs +60/−0
- examples/system-properties/Makefile +9/−0
- examples/system-properties/system-properties.hs +24/−0
- hs2j/Common.hs +7/−0
- hs2j/Haskell2Java.hs +12/−0
- hs2j/Main.hss +97/−0
- hs2j/Options.hs +23/−0
- j2hs/Common.hs +7/−0
- j2hs/Java2Haskell.hss +228/−0
- j2hs/Main.hss +128/−0
- j2hs/Options.hs +29/−0
- java-bridge.cabal +156/−5
- src/Foreign/Java.cpphs +1/−8
- src/Foreign/Java/Bindings.cpphs +0/−384
- src/Foreign/Java/Bindings.hss +221/−0
- src/Foreign/Java/Bindings/Haskell2Java.hss +7/−0
- src/Foreign/Java/Bindings/HaskellTypes.hs +43/−0
- src/Foreign/Java/Bindings/Java2Haskell.hss +284/−0
- src/Foreign/Java/Bindings/JavaSE6.hs +3800/−0
- src/Foreign/Java/Bindings/JavaTypes.hs +211/−0
- src/Foreign/Java/Bindings/ReflectHaskell.hs +6/−0
- src/Foreign/Java/Bindings/ReflectJava.hs +523/−0
- src/Foreign/Java/Bindings/Support.cpphs +356/−0
- src/Foreign/Java/Bindings/Typomatic.hs +400/−0
- src/Foreign/Java/Control.hs +51/−0
- src/Foreign/Java/IO.hs +44/−0
- src/Foreign/Java/JNI/Types.hs +0/−15
- src/Foreign/Java/JNI/core.hs +1/−45
- src/Foreign/Java/JavaMonad.hs +1/−1
- src/Foreign/Java/Maybe.hs +67/−0
- src/Foreign/Java/Tutorial.hs +52/−0
- src/Foreign/Java/Types.hs +14/−0
- src/Foreign/Java/Value.hs +4/−6
- src/ffijni.c +20/−97
- src/ffijni.h +0/−27
dist/build/Foreign/Java.hs view
@@ -213,10 +213,7 @@ asObject :: a -> Java JObject -- | Returns a reference to the Class of the given object.- classOf :: a -> Java JClass-- -- | Returns a string representation of the type.- jtypeOf :: a -> Java String+ classOf :: a -> Java JClass -- | Checks two objects for equality using their @equals@ methods. equals :: JavaObject b => a -> b -> Java Bool@@ -224,10 +221,6 @@ toString obj = asObject obj >>= toString hashCode obj = asObject obj >>= hashCode classOf obj = asObject obj >>= classOf- jtypeOf obj = do- (Just clazz) <- getClass "java.lang.Class"- getName <- clazz `bindMethod` "getName" ::= string- classOf obj >>= asObject >>= getName >>= return . maybe "" id equals this obj = do this' <- asObject this
dist/build/Foreign/Java/Bindings.hs view
@@ -1,385 +1,177 @@-#line 1 "src/Foreign/Java/Bindings.cpphs"-{-# LANGUAGE Haskell2010- , TypeFamilies- , FlexibleContexts- , FlexibleInstances- , TypeSynonymInstances- , MultiParamTypeClasses- , ScopedTypeVariables- , NoImplicitPrelude- #-}-{-# OPTIONS- -Wall- #-}---- |--- Module : Foreign.Java.Bindings.Support--- Copyright : (c) Julian Fleischer 2013--- License : MIT (See LICENSE file in cabal package)------ Maintainer : julian.fleischer@fu-berlin.de--- Stability : experimental--- Portability : non-portable (TypeFamilies)------ This module provides type classes and instances for--- supporting the high level bindings. This module should--- not be imported directly.-module Foreign.Java.Bindings where--import Haskell.X.Prelude hiding (toList, arr)--import Control.Monad.State hiding (void)--import Foreign-import Foreign.C--import Foreign.Java-import Foreign.Java.JavaMonad-import Foreign.Java.Types as T-import qualified Foreign.Java.JNI.Safe as JNI-import qualified Foreign.Java.JNI.Types as Core--------------------- Utilities ---------------------object' :: [Char] -> Q-object' = T.object'------------------------------------ Primitive argument types -----------------------------------class JBoolean a where toBoolean :: a -> Java Bool-class JChar a where toChar :: a -> Java Word16-class JByte a where toByte :: a -> Java Int8-class JShort a where toShort :: a -> Java Int16-class JInt a where toInt :: a -> Java Int32-class JLong a where toLong :: a -> Java Int64-class JFloat a where toFloat :: a -> Java Float-class JDouble a where toDouble :: a -> Java Double---instance JBoolean Bool where toBoolean = return--instance JChar Char where toChar = return . fromIntegral . fromEnum-instance JChar Int8 where toChar = return . fromIntegral-instance JChar Word16 where toChar = return--instance JByte Int8 where toByte = return--instance JShort Int8 where toShort = return . fromIntegral-instance JShort Word8 where toShort = return . fromIntegral-instance JShort Int16 where toShort = return--instance JInt Int where toInt = return . fromIntegral-instance JInt Int8 where toInt = return . fromIntegral-instance JInt Word8 where toInt = return . fromIntegral-instance JInt Int16 where toInt = return . fromIntegral-instance JInt Word16 where toInt = return . fromIntegral-instance JInt Int32 where toInt = return--instance JLong Int where toLong = return . fromIntegral-instance JLong Int8 where toLong = return . fromIntegral-instance JLong Word8 where toLong = return . fromIntegral-instance JLong Int16 where toLong = return . fromIntegral-instance JLong Word16 where toLong = return . fromIntegral-instance JLong Int32 where toLong = return . fromIntegral-instance JLong Word32 where toLong = return . fromIntegral-instance JLong Int64 where toLong = return--instance JFloat CFloat where toFloat = return . realToFrac-instance JFloat Float where toFloat = return--instance JDouble CDouble where toDouble = return . realToFrac-instance JDouble Double where toDouble = return-------------------------------- Array argument types -------------------------------class Array a where- asMaybeArrayObject :: a -> Java (Maybe JObject)---------------------------------- Primitive result types ----------------------------------+{-# LANGUAGE Haskell2010 #-}+{-# OPTIONS -Wall #-} +-- | Functions for generating glue code between Haskell and Java.+module Foreign.Java.Bindings ( + -- * Create Haskell glue code from Java definitions+ printJavaPackageModule,+ printJavaClassModule,+ printJavaClassBootfile,+ printJavaClassModule',+ printJavaClassBootfile', + -- * Reflect Java classes+ reflectJavaClasses,+ findJavaClasses, + -- ** A priori known information about Java+ javaClassesSE6 + ) where +import Foreign.Java+import Foreign.Java.Utils+import qualified Foreign.Java.Bindings.JavaSE6 +import Foreign.Java.Bindings.JavaTypes+import qualified Foreign.Java.Bindings.Java2Haskell as Java2Haskell+import qualified Foreign.Java.Bindings.ReflectJava as ReflectJava --- | The result of a function call that is of type @boolean@.-class BooleanResult m where { toBooleanResult :: Either JThrowable Bool -> Java m } ; instance BooleanResult Bool where { toBooleanResult = either (\exc -> toString exc >>= fail) return } ; instance BooleanResult (Either JThrowable Bool) where { toBooleanResult = return }--- | The result of a function call that is of type @char@.-class CharResult m where { toCharResult :: Either JThrowable Word16 -> Java m } ; instance CharResult Word16 where { toCharResult = either (\exc -> toString exc >>= fail) return } ; instance CharResult (Either JThrowable Word16) where { toCharResult = return }--- | The result of a function call that is of type @byte@.-class ByteResult m where { toByteResult :: Either JThrowable Int8 -> Java m } ; instance ByteResult Int8 where { toByteResult = either (\exc -> toString exc >>= fail) return } ; instance ByteResult (Either JThrowable Int8) where { toByteResult = return }--- | The result of a function call that is of type @short@.-class ShortResult m where { toShortResult :: Either JThrowable Int16 -> Java m } ; instance ShortResult Int16 where { toShortResult = either (\exc -> toString exc >>= fail) return } ; instance ShortResult (Either JThrowable Int16) where { toShortResult = return }--- | The result of a function call that is of type @int@.-class IntResult m where { toIntResult :: Either JThrowable Int32 -> Java m } ; instance IntResult Int32 where { toIntResult = either (\exc -> toString exc >>= fail) return } ; instance IntResult (Either JThrowable Int32) where { toIntResult = return }--- | The result of a function call that is of type @long@.-class LongResult m where { toLongResult :: Either JThrowable Int64 -> Java m } ; instance LongResult Int64 where { toLongResult = either (\exc -> toString exc >>= fail) return } ; instance LongResult (Either JThrowable Int64) where { toLongResult = return }--- | The result of a function call that is of type @float@.-class FloatResult m where { toFloatResult :: Either JThrowable Float -> Java m } ; instance FloatResult Float where { toFloatResult = either (\exc -> toString exc >>= fail) return } ; instance FloatResult (Either JThrowable Float) where { toFloatResult = return }--- | The result of a function call that is of type @double@.-class DoubleResult m where { toDoubleResult :: Either JThrowable Double -> Java m } ; instance DoubleResult Double where { toDoubleResult = either (\exc -> toString exc >>= fail) return } ; instance DoubleResult (Either JThrowable Double) where { toDoubleResult = return }+import Foreign.Java.Bindings.HaskellTypes+import qualified Foreign.Java.Bindings.Haskell2Java as Haskell2Java+import qualified Foreign.Java.Bindings.ReflectHaskell as ReflectHaskell --- | The result of a function call that is of type @void@.-class VoidResult m where- toVoidResult :: Either JThrowable () -> Java m- -instance VoidResult () where- toVoidResult = either (\exc -> toString exc >>= fail) return+import Data.Word -instance VoidResult (Either JThrowable ()) where- toVoidResult = return- -instance VoidResult (Maybe JThrowable) where- toVoidResult = return . either Just (const Nothing)+import Data.Map (Map)+import qualified Data.List as List+import qualified Data.Map as Map ---------------------------- Array result types ------------------------------- | An array result of a function call.-class JavaArray (ArrayResultType m) (ArrayResultComponent m) => ArrayResult m where- -- | The JVM machine type of the components of the array.- type ArrayResultType m-- -- | The type of the component of the array as returned by- -- the low level JNI call.- type ArrayResultComponent m-- -- | Convert the array to a sophisticated type.- toArrayResult :: Either JThrowable (Maybe (JArray (ArrayResultType m))) -> Java m--instance ArrayResult a => ArrayResult (Either JThrowable a) where- type ArrayResultType (Either JThrowable a) = ArrayResultType a- type ArrayResultComponent (Either JThrowable a) = ArrayResultComponent a-- toArrayResult = either (return . Left) (toArrayResult . Right)+javaClassesSE6 :: [String]+-- ^ The names of all Java Classes part of Java SE 6.+javaClassesSE6 = Foreign.Java.Bindings.JavaSE6.javaClassesSE6 +imports :: String+-- ^ Imports of all auto generated java code files.+imports = ((\_ -> let { __ = +{-# LINE 48 "Foreign/Java/Bindings.hss" #-}+concat ["import qualified Foreign.Java as JNI\nimport Foreign.Java ((-->))\nimport qualified Prelude as Prelude\nimport Prelude ((.), ($), (>>=), (>>), return)\nimport qualified Foreign.Java.Bindings.Support as JNIS\nimport Data.Functor ((<$>))\n"]+{-# LINE 55 "Foreign/Java/Bindings.hss" #-}+} in __) undefined) +classInfoSignature :: String+-- ^ +classInfoSignature = "Prelude.String" +classInfo' :: JavaClass -> String+-- ^ +classInfo' clazz = className clazz +packageInfo' packageName classes = packageName +printJavaPackageModule :: String -- The Java package name+ -> String -- The Haskell module name of the Java package+ -> Map String JavaClass -- Info about all other classes+ -> [JavaClass] -- The Java classes contained in the Java package+ -> String+-- ^ +printJavaPackageModule packageName modName classInfo classes = ((\_ -> let { __ = +{-# LINE 73 "Foreign/Java/Bindings.hss" #-}+concat ["{-# LANGUAGE Haskell2010 #-}\n-- | Package @", (packageName), "@\nmodule ", (modName), " (\n", (moduleExports), " info'\n) where\n", (imports), "\n", (moduleImports), "\n-- Information about this package.\ninfo' = ", (show $ packageInfo' packageName classes), "\n", (moduleDeclarations), "\n"]+{-# LINE 85 "Foreign/Java/Bindings.hss" #-}+} in __) undefined)+ where moduleDeclarations = Java2Haskell.pkgModDecl classInfo classes+ moduleImports = Java2Haskell.pkgModImports classInfo classes+ moduleExports = Java2Haskell.pkgModExports classInfo classes +printJavaClassModule :: JavaClass -- The Java class+ -> String -- The Haskell module name of the Java class+ -> Map String JavaClass -- Info about all classes+ -> String+-- ^ +printJavaClassModule clazz modName classInfo = ((\_ -> let { __ = +{-# LINE 96 "Foreign/Java/Bindings.hss" #-}+concat ["{-# LANGUAGE Haskell2010 #-}\n-- | ", (show $ classType clazz), " @", (classFullName clazz), "@\nmodule ", (modName), " (\n", (moduleExports), " -- * Information about this class.\n info'\n) where\n", (imports), "\n", (bootfileImports), "\n", (moduleImports), "\ninfo' = ", (show $ classInfo' clazz), "\n", (bootfileDeclarations), "\n", (moduleDeclarations), "\n"]+{-# LINE 110 "Foreign/Java/Bindings.hss" #-}+} in __) undefined)+ where bootfileDeclarations = Java2Haskell.classBootDecl classInfo clazz+ bootfileImports = Java2Haskell.classBootImports classInfo clazz+ moduleDeclarations = Java2Haskell.classModDecl classInfo clazz+ moduleImports = Java2Haskell.classModImports classInfo clazz+ moduleExports = Java2Haskell.classModExports classInfo clazz -instance ArrayResult [Bool] where { type ArrayResultType [Bool] = T.Z ; type ArrayResultComponent [Bool] = Bool ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }-instance ArrayResult [Word16] where { type ArrayResultType [Word16] = T.C ; type ArrayResultComponent [Word16] = Word16 ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }-instance ArrayResult [Int8] where { type ArrayResultType [Int8] = T.B ; type ArrayResultComponent [Int8] = Int8 ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }-instance ArrayResult [Int16] where { type ArrayResultType [Int16] = T.S ; type ArrayResultComponent [Int16] = Int16 ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }-instance ArrayResult [Int32] where { type ArrayResultType [Int32] = T.I ; type ArrayResultComponent [Int32] = Int32 ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }-instance ArrayResult [Int64] where { type ArrayResultType [Int64] = T.J ; type ArrayResultComponent [Int64] = Int64 ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }-instance ArrayResult [Float] where { type ArrayResultType [Float] = T.F ; type ArrayResultComponent [Float] = Float ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }-instance ArrayResult [Double] where { type ArrayResultType [Double] = T.D ; type ArrayResultComponent [Double] = Double ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }+printJavaClassBootfile :: JavaClass -- The Java class+ -> String -- The Haskell module name of the Java class+ -> Map String JavaClass -- Info about all classes+ -> String+-- ^ +printJavaClassBootfile clazz modName classInfo = ((\_ -> let { __ = +{-# LINE 123 "Foreign/Java/Bindings.hss" #-}+concat ["{-# LANGUAGE Haskell2010 #-}\n-- Bootfile for class ", (className clazz), "\nmodule ", (modName), " (\n", (bootfileExports), " info'\n) where\n", (imports), "\n", (bootfileImports), "\ninfo' :: ", (classInfoSignature), "\n", (bootfileDeclarations), "\n"]+{-# LINE 134 "Foreign/Java/Bindings.hss" #-}+} in __) undefined)+ where bootfileDeclarations = Java2Haskell.classBootDecl classInfo clazz+ bootfileImports = Java2Haskell.classBootImports classInfo clazz+ bootfileExports = Java2Haskell.classBootExports classInfo clazz -instance ArrayResult [Char] where- type ArrayResultType [Char] = T.C- type ArrayResultComponent [Char] = Word16-- toArrayResult = either (\exc -> toString exc >>= fail)- (maybe (return [])- (fmap (map (toEnum . fromIntegral)) . toList))--instance ArrayResult [[Char]] where- type ArrayResultType [[Char]] = T.L- type ArrayResultComponent [[Char]] = Maybe JObject-- toArrayResult =- either (\exc -> toString exc >>= fail)- (maybe (return [])- (\arr -> toList arr >>= mapM (maybe (return "") toString)))-+printJavaClassModule' :: JavaClass -- The Java class+ -> String -- The Haskell module name of the Java class+ -> Map String JavaClass -- Info about all classes+ -> String+-- ^ +printJavaClassModule' clazz modName classInfo = ((\_ -> let { __ = +{-# LINE 145 "Foreign/Java/Bindings.hss" #-}+concat ["{-# LANGUAGE Haskell2010, TypeFamilies #-}\n-- hidden @", (className clazz), "@\nmodule ", (modName), "__ (\n", (moduleExports), " info'\n) where\n", (imports), "\n", (bootfileImports), "\n", (moduleImports), "\ninfo' = ", (show $ classInfo' clazz), "\n", (bootfileDeclarations), "\n", (moduleDeclarations), "\n"]+{-# LINE 158 "Foreign/Java/Bindings.hss" #-}+} in __) undefined)+ where bootfileDeclarations = Java2Haskell.classBootDecl' classInfo clazz+ bootfileImports = Java2Haskell.classBootImports' classInfo clazz+ moduleDeclarations = Java2Haskell.classModDecl' classInfo clazz+ moduleImports = Java2Haskell.classModImports' classInfo clazz+ moduleExports = Java2Haskell.classModExports' classInfo clazz --------------------------- All other objects ----------------------------newtype AsString o = AsString [Char]- deriving (Eq, Show, Ord)--newtype AsList a o = AsList [a]- deriving (Eq, Show, Ord)--class ObjectToList o e where- objectToList :: o -> JObject -> Java [e]---- | The result of a function call that is of type @object@.-class ObjectResult m where- -- | - toObjectResult :: Either JThrowable (Maybe JObject) -> Java m--instance ObjectResult (AsString a) where- toObjectResult = fmap AsString . either (\exc -> toString exc >>= fail)- (maybe (return "null") toString)--instance ObjectToList o e => ObjectResult (AsList e o) where- toObjectResult = fmap AsList . either (\exc -> toString exc >>= fail)- (maybe (return []) (objectToList (undefined :: o)))--instance UnsafeCast a => ObjectResult (Value a) where- toObjectResult = either (return . Fail)- (maybe (return NoValue)- (fmap Value . unsafeFromJObject))--instance UnsafeCast a => ObjectResult (Either JThrowable a) where- toObjectResult = either (return . Left)- (maybe (fmap Left nullPointer)- (fmap Right . unsafeFromJObject))- where- nullPointer :: Java JThrowable- nullPointer = do- (Just clazz) <- getClass "java.lang.NullPointerException"- (Just (Core.JObject obj)) <- newObject clazz- return $ Core.JThrowable (castForeignPtr obj)--instance UnsafeCast a => ObjectResult (Either (Maybe JThrowable) a) where- toObjectResult = either (return . Left . Just)- (maybe (return (Left Nothing))- (fmap Right . unsafeFromJObject))--instance UnsafeCast a => ObjectResult (Maybe a) where- toObjectResult = either (\exc -> toString exc >>= fail)- (maybe (return Nothing)- (fmap Just . unsafeFromJObject))+printJavaClassBootfile' :: JavaClass -- The Java class+ -> String -- The Haskell module name of the Java class+ -> Map String JavaClass -- Info about all classes+ -> String+-- ^ +printJavaClassBootfile' clazz modName classInfo = ((\_ -> let { __ = +{-# LINE 171 "Foreign/Java/Bindings.hss" #-}+concat ["{-# LANGUAGE Haskell2010 #-}\n-- hidden Bootfile for class ", (className clazz), "\nmodule ", (modName), "__ (\n", (bootfileExports), " info'\n) where\n", (imports), "\n", (bootfileImports), "\ninfo' :: ", (classInfoSignature), "\n", (bootfileDeclarations), "\n"]+{-# LINE 182 "Foreign/Java/Bindings.hss" #-}+} in __) undefined)+ where bootfileDeclarations = Java2Haskell.classBootDecl' classInfo clazz+ bootfileImports = Java2Haskell.classBootImports' classInfo clazz+ bootfileExports = Java2Haskell.classBootExports' classInfo clazz ------------------------------------------------------- Advanced features (Callbacks, Subtyping, ...) ------------------------------------------------------+reflectJavaClasses :: [String]+ -> Java [JavaClass]+-- ^ Retrieve information about the given Java classes+-- from the Java Virtual Machine.+reflectJavaClasses = ReflectJava.reflectClasses --- | A convenient alternative to 'isInstanceOf'.+findJavaClasses :: Word32 -- Maximum depth for following dependencies.+ -> [String]+ -> Java [String]+-- ^ Find all classes that the given classes depend on. ----- Minimal complete definition: 'coerce' or 'whenInstanceOf'.-class InstanceOf a where- type CoercedType a+-- In order to provide proper bindings for a class, bindings+-- for all classes which a class depends on need to exist too.+-- A class depends on all classes which it inherits from or+-- which are used as arguments, return types, or parameters.+--+-- This functions returns all the class names of the classes+-- on which the given classes depend on. No duplicates are+-- reported and the resulting list is sorted.+findJavaClasses = ReflectJava.findClasses - -- | Check if the object of type @a@ is an instance- -- of the type represented by @b@. - instanceOf :: JavaObject o => o -> a -> Java Bool - -- | Check if the object of type @a@ is an instance- -- of the type @c@, represented by @b@. If so, it will coerce- -- the object of type @a@ and pass it to the given action.- --- -- If @a@ was an instance of @c@ (where @c@ is represented- -- by @b@) this function will return @'Just' d@, where @d@ is- -- the result of the optional computation. If not, 'Nothing'- -- is returned.- whenInstanceOf :: JavaObject o => o -> a -> (CoercedType a -> Java d) -> Java (Maybe d) - -- | Coerces the given object of type @a@ to an object of- -- @c@, where @c@ is represented by a value of type @b@.- -- Returns @'Nothing'@ if this is not possible.- coerce :: JavaObject o => o -> a -> Java (Maybe (CoercedType a)) - instanceOf o t =- whenInstanceOf o t (return . const ())- >>= return . maybe False (const True) - whenInstanceOf o t a =- coerce o t >>= maybe (return Nothing) (fmap Just . a) - coerce o t = whenInstanceOf o t return --- | For INTERNAL use only. Is however not in a hidden module,--- so that other libraries can link against it.-class UnsafeCast a where- -- | For INTERNAL use only. Do not use yourself.- unsafeFromJObject :: JObject -> Java a ------------------- Callbacks ---------------------registerCallbacks :: Core.JClass -> Java Bool--- ^ Yepp. Register callbacks. Do it.-registerCallbacks (Core.JClass ptr) = do- vm <- getVM- io $ withForeignPtr ptr $ \clazz -> JNI.registerCallbacks vm clazz----- | A wrapped function can be used as a callback from the--- JVM into the Haskell runtime environment.-type WrappedFunc = Ptr Core.JVM -- Ptr to JEnv- -> Ptr Core.JObjectRef -- Ptr to this, a proxy- -> Ptr Core.JObjectRef -- Ptr to method, the requested method- -> Ptr Core.JObjectRef -- Ptr to a JObject-Array (Object[]), the arguments- -> IO (Ptr Core.JObjectRef) -- Returns a pointer to the result--type InterfaceFunc = JObject -> JObject -> JObject -> Java (Maybe JObject)--runJava_ :: Ptr Core.JVM -> Java a -> IO a-runJava_ vm f = runStateT (_runJava f) (newJVMState vm) >>= return . fst--foreign import ccall safe "wrapper"- wrap_ :: WrappedFunc -> IO (FunPtr WrappedFunc)--foreign export ccall freeFunPtr :: FunPtr WrappedFunc -> IO ()---freeFunPtr :: FunPtr WrappedFunc -> IO ()-freeFunPtr ptr = freeHaskellFunPtr ptr---implementInterfaceBy :: [Char] -> InterfaceFunc -> Java JObject-implementInterfaceBy ifaceName func = do- iface <- getClass ifaceName >>= asObject . fromJust- (Just clazz) <- getClass "HFunction"- _success <- registerCallbacks clazz- makeFunction <- clazz `bindStaticMethod` "makeFunction"- ::= object "java.lang.Class" --> long --> object "java.lang.Object"- (Just impl) <- io (intify func) >>= makeFunction (Just iface)- return impl- where- wrap :: InterfaceFunc -> IO (FunPtr WrappedFunc)- wrap f = do-- let proxyFunc vm self method args = do- self' <- Core.JObject <$> newForeignPtr JNI.release self- method' <- Core.JObject <$> newForeignPtr JNI.release method- args' <- Core.JObject <$> newForeignPtr JNI.release args-- jobj <- runJava_ vm (f self' method' args')-- case jobj of- Nothing -> return nullPtr- Just (Core.JObject ptr) -> withForeignPtr ptr return-- wrappedFunc <- wrap_ proxyFunc-- return wrappedFunc-- intify :: InterfaceFunc -> IO Int64- intify = fmap (fromIntegral . ptrToIntPtr . castFunPtrToPtr) . wrap---delete :: Core.JObject -> Java ()-delete (Core.JObject ptr) = io $ do- finalizeForeignPtr ptr
+ dist/build/Foreign/Java/Bindings/Haskell2Java.hs view
@@ -0,0 +1,7 @@+{-# LANGUAGE Haskell2010+ #-}++module Foreign.Java.Bindings.Haskell2Java where+++
+ dist/build/Foreign/Java/Bindings/Java2Haskell.hs view
@@ -0,0 +1,342 @@+{-# LANGUAGE Haskell2010 #-}++module Foreign.Java.Bindings.Java2Haskell where++import Foreign.Java.Util+import Foreign.Java.Utils+import Foreign.Java.Bindings.JavaTypes+import Foreign.Java.Bindings.Typomatic+import Data.Map (Map)++import Data.Function++import qualified Data.Char as Char+import qualified Data.List as List+import qualified Data.Set as Set+import qualified Data.Map as Map++import qualified Data.List.HIUtils as HI++import Control.Arrow++pkgModExports :: Map String JavaClass -> [JavaClass] -> String+pkgModExports info classes = concatMap (\(t, b) -> ((\_ -> let { __ = +{-# LINE 23 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat [" -- * ", (show t), "s\n", (b), ""]+{-# LINE 23 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined))+ $ map (second $ concatMap format)+ $ HI.aggregateAL+ $ zip (map classType classes) classes+ where+ format clazz =+ let haskName = takeClassName $ classModName clazz+ javaName = className clazz+ dataDecl = if classIface clazz then "" else+ ((\_ -> let { __ = +{-# LINE 32 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat [" ", (dataTName haskName), " (..),\n"]+{-# LINE 32 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ in ((\_ -> let { __ = +{-# LINE 33 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat [" -- ** ", (show $ classType clazz), " ", (javaName), "\n -- | For constructors, methods, and so on, see: \"", (classModName clazz), "\".\n ", (tyclTName haskName), ",\n", (dataDecl), " ", (newtTName haskName), " ", (if classEnum clazz then "(..)" else ""), ",\n"]+{-# LINE 39 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+++pkgModImports :: Map String JavaClass -> [JavaClass] -> String+pkgModImports info classes = concatMap (format . classModName) classes+ where format modName = ((\_ -> let { __ = +{-# LINE 44 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["import ", (modName), "__ hiding (info')\n"]+{-# LINE 44 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+++pkgModDecl :: Map String JavaClass -> [JavaClass] -> String+pkgModDecl info classes = ""+++-- Modules and Boot files+ +classBootExports :: Map String JavaClass -> JavaClass -> String+classBootExports info clazz = ""+++classBootImports :: Map String JavaClass -> JavaClass -> String+classBootImports info clazz = ""+++classModImports :: Map String JavaClass -> JavaClass -> String+classModImports info clazz = concatMap format references+ where+ format package = ((\_ -> let { __ = +{-# LINE 64 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["import qualified ", (package), "\n"]+{-# LINE 64 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ references = Set.toList+ $ Set.map (fst . splitClassName . classModName . check . flip Map.lookup info)+ $ Set.fromList (classFullName clazz : dependencies)+ dependencies = classDependencies clazz+ check = maybe (error ((\_ -> let { __ = +{-# LINE 69 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["classModImports in Foreign.Java.Bindings.Java2Haskell - class definition not found"]+{-# LINE 71 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)) id+++classBootDecl :: Map String JavaClass -> JavaClass -> String+classBootDecl info clazz = ((\_ -> let { __ = +{-# LINE 75 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat [""]+{-# LINE 76 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)++classModExports :: Map String JavaClass -> JavaClass -> String+classModExports info clazz = " -- * Methods\n" ++ concatMap methodExport methodNames+ where+ methods = List.sortBy (compare `on` methodName) (classMethods clazz)+ methodNames = mkMethodNames methods+ methodExport name = name ++ ", \n"+++classModDecl :: Map String JavaClass -> JavaClass -> String+classModDecl info clazz = concatMap methodDecl $ zip methodNames methods+ where+ methods = List.sortBy (compare `on` methodName) (classMethods clazz)+ methodNames = mkMethodNames methods+ methodDecl (name, method)+ | arrayTypes = ((\_ -> let { __ = +{-# LINE 92 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["", (name), " :: ", (signature), "\n", (name), " = Prelude.undefined\n"]+{-# LINE 95 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ | otherwise = ((\_ -> let { __ = +{-# LINE 96 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["", (haddock), "\n", (name), " :: ", (signature), "\n", (name), "", (argsDecl), " = do\n (Prelude.Just clazz) <- JNI.getClass \"", (classFullName clazz), "\"\n (Prelude.Just method) <- clazz `JNI.", (getMethod), "` ", (jniSignature), "\n", (thisArg), "", (readArgs), " result <- JNI.", (callMethod), " method ", (argsRefs), "\n ", (convertResult), " result\n"]+{-# LINE 106 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ where+ arrayTypes+-- | any isArrayType (methodParams method) = True+ | (Just ret) <- methodReturnType method = isArrayType ret+ | otherwise = False+ isArrayType x = case x of JArr _ -> True ; _ -> False+ isStatic = methodStatic method+ javaSignature = fJavaSignature argsInfo+ javaReturnType = fJavaReturnType argsInfo+ jniSignature = fJniSignature argsInfo+ signature = fSignature argsInfo+ getMethod = if isStatic then "getStaticMethod" else "getMethod"+ callMethod = if isStatic then "callStaticMethodE" else "callMethodE"+ args = fArgNames argsInfo+ argsNotThis = (if isStatic then id else tail) args+ argsInfo = runTypomatic info (typomatic clazz method)+ argsDecl = concatMap (' ':) args+ argsRefs = concatMap (++ "' ") args+ haddock = ((\_ -> let { __ = +{-# LINE 125 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["-- | @", (if isStatic then "static " else "virtual "), "", (if methodSynchronized method then "synchronized " else ""), "", (if methodNative method then "native " else ""), "", (if methodFinal method then "final " else ""), "", (javaSignature), " -> ", (javaReturnType), "@"]+{-# LINE 130 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ thisArg = if isStatic then "" else ((\_ -> let { __ = +{-# LINE 131 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat [" ", (head args), "' <- JNI.asObject ", (head args), "\n"]+{-# LINE 131 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ readArgs = concatMap ((" " ++). uncurry readArg) (zip argsNotThis (methodParams method))+ readArg name jtype = case jtype of+ JBoolean -> ((\_ -> let { __ = +{-# LINE 134 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["", (name), "' <- JNIS.toBoolean ", (name), "\n"]+{-# LINE 134 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ JChar -> ((\_ -> let { __ = +{-# LINE 135 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["", (name), "' <- JNIS.toChar ", (name), "\n"]+{-# LINE 135 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ JByte -> ((\_ -> let { __ = +{-# LINE 136 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["", (name), "' <- JNIS.toByte ", (name), "\n"]+{-# LINE 136 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ JShort -> ((\_ -> let { __ = +{-# LINE 137 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["", (name), "' <- JNIS.toShort ", (name), "\n"]+{-# LINE 137 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ JInt -> ((\_ -> let { __ = +{-# LINE 138 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["", (name), "' <- JNIS.toInt ", (name), "\n"]+{-# LINE 138 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ JLong -> ((\_ -> let { __ = +{-# LINE 139 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["", (name), "' <- JNIS.toLong ", (name), "\n"]+{-# LINE 139 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ JFloat -> ((\_ -> let { __ = +{-# LINE 140 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["", (name), "' <- JNIS.toFloat ", (name), "\n"]+{-# LINE 140 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ JDouble -> ((\_ -> let { __ = +{-# LINE 141 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["", (name), "' <- JNIS.toDouble ", (name), "\n"]+{-# LINE 141 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ JObj _ -> ((\_ -> let { __ = +{-# LINE 142 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["", (name), "' <- Prelude.Just <$> JNI.asObject ", (name), "\n"]+{-# LINE 142 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ JArr _ -> ((\_ -> let { __ = +{-# LINE 143 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["", (name), "' <- JNIS.asMaybeArrayObject ", (name), "\n"]+{-# LINE 143 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ convertResult = ("JNIS." ++) $ case methodReturnType method of+ Nothing -> "toVoidResult"+ Just t -> case t of+ JBoolean -> "toBooleanResult"+ JChar -> "toCharResult"+ JByte -> "toByteResult"+ JShort -> "toShortResult"+ JInt -> "toIntResult"+ JLong -> "toLongResult"+ JFloat -> "toFloatResult"+ JDouble -> "toDoubleResult"+ JObj n -> "toObjectResult"+ JArr c -> "toArrayResult"++ ++mkMethodNames :: [JavaMethod] -> [String]+mkMethodNames = concatMap (zipWith (flip (++)) (iterate (++"'") ""))+ . List.group . map sanitize . map methodName+ where+ sanitize name+ | Char.isUpper (head name) = '_' : name+ | name `elem` haskellKeywords = name ++ "'"+ | otherwise = name+++-- Hidden Modules and Boot files+++classModExports' :: Map String JavaClass -> JavaClass -> String+classModExports' info clazz = ((\_ -> let { __ = +{-# LINE 174 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat [" ", (tyclTName haskName), ",\n ", (dataTName haskName), " (..),\n ", (newtTName haskName), " ", (if classEnum clazz then "(..)" else ""), ",\n"]+{-# LINE 178 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ where+ haskName = takeClassName $ classModName clazz+ javaName = className clazz+++classBootExports' :: Map String JavaClass -> JavaClass -> String+classBootExports' info clazz = ((\_ -> let { __ = +{-# LINE 185 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat [" ", (tyclTName haskName), ",\n ", (dataTName haskName), " (..),\n ", (newtTName haskName), ",\n"]+{-# LINE 189 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ where+ haskName = takeClassName $ classModName clazz+ javaName = className clazz+++classBootImports' :: Map String JavaClass -> JavaClass -> String+classBootImports' info clazz+ = concatMap (format . classModName) supertypes+ where+ format modName = ((\_ -> let { __ = +{-# LINE 199 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["import qualified ", (modName), "__\n"]+{-# LINE 199 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ supertypes = map (check . flip Map.lookup info)+ $ Set.toList+ $ Set.fromList (classParents clazz ++ classIfaces clazz)+ check = maybe (error ((\_ -> let { __ = +{-# LINE 203 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["classBootImports' in Foreign.Java.Bindings.Java2Haskell - class definition not found"]+{-# LINE 205 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)) id+++classModImports' :: Map String JavaClass -> JavaClass -> String+classModImports' info clazz = ""+++classBootDecl' :: Map String JavaClass -> JavaClass -> String+classBootDecl' info clazz+ | classEnum clazz = ((\_ -> let { __ = +{-# LINE 214 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["class ", (tyclTDecl), "\ndata ", (newtTDecl), " = ", (enumConstants), "\ndata ", (dataTDecl), " = ", (dataCDecl), "\n"]+{-# LINE 218 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ | otherwise = ((\_ -> let { __ = +{-# LINE 219 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["class ", (tyclTDecl), "\nnewtype ", (newtTDecl), " = ", (newtCDecl), " JNI.JObject\ndata ", (dataTDecl), " = ", (dataCDecl), "\n"]+{-# LINE 223 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ where baseName = takeClassName $ classModName clazz+ params = concatMap (\(p:ps) -> ' ' : Char.toLower p : ps)+ $ map (tyVarName . paramName) $ classTypeParams clazz+ newtTDecl = newtTName baseName ++ params+ newtCDecl = newtCName baseName+ dataTDecl = dataTName baseName ++ params+ dataCDecl = dataCName baseName ++ params+ tyclTDecl = ((\_ -> let { __ = +{-# LINE 231 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["(JNI.JavaObject this", (context), ") => ", (tyclTName baseName), " this"]+{-# LINE 231 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ context = concatMap parentContext (classParents clazz)+ parentContext parent = ((\_ -> let { __ = +{-# LINE 233 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat [", ", (qualifiedName), " this"]+{-# LINE 233 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ where parentClass = info Map.! parent+ modName = classModName parentClass+ qualifiedName = modName ++ "__." ++ (tyclTName $ takeClassName modName)+ enumConstants = concat $ List.intersperse " | " $ map sanitize $ map snd $ classEnumConstants clazz+ where sanitize (x:xs) = Char.toUpper x : xs+++classModDecl' :: Map String JavaClass -> JavaClass -> String+classModDecl' info clazz+ | classEnum clazz = ((\_ -> let { __ = +{-# LINE 243 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["instance JNI.JavaObject (", (newtTDecl), ") where\n asObject = Prelude.undefined\ninstance ", (tyclTName baseName), " (", (newtTDecl), ")\ninstance JNIS.InstanceOf (", (dataTDecl), ") where\n type CoercedType (", (dataTDecl), ") = (", (newtTDecl), ")\n", (instances), "\n"]+{-# LINE 250 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ | otherwise = ((\_ -> let { __ = +{-# LINE 251 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["instance JNI.JavaObject (", (newtTDecl), ") where\n asObject (", (newtCName baseName), " obj) = return obj\ninstance JNIS.UnsafeCast (", (newtTDecl), ") where\n unsafeFromJObject obj = return (", (newtCDecl), " obj)\ninstance ", (tyclTName baseName), " (", (newtTDecl), ")\ninstance JNIS.InstanceOf (", (dataTDecl), ") where\n type CoercedType (", (dataTDecl), ") = (", (newtTDecl), ")\n coerce o t = do\n obj <- JNI.asObject o\n (Prelude.Just clazz) <- JNI.getClass \"", (fullClassName), "\"\n isInstanceOf <- obj `JNI.isInstanceOf` clazz\n if isInstanceOf\n then Prelude.Just <$> (JNIS.unsafeFromJObject obj)\n else return Prelude.Nothing\n", (instances), "\n"]+{-# LINE 267 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ where fullClassName = classFullName clazz+ baseName = takeClassName $ classModName clazz+ params = concatMap (\(p:ps) -> ' ' : Char.toLower p : ps)+ $ map (tyVarName . paramName) $ classTypeParams clazz+ newtTDecl = newtTName baseName ++ params+ newtCDecl = newtCName baseName+ dataTDecl = dataTName baseName ++ params+ dataCDecl = dataCName baseName ++ params+ instances = concatMap parentInstance (classParents clazz)+ parentInstance parent = ((\_ -> let { __ = +{-# LINE 277 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+concat ["instance ", (qualifiedName), " (", (newtTDecl), ")\n"]+{-# LINE 279 "Foreign/Java/Bindings/Java2Haskell.hss" #-}+} in __) undefined)+ where parentClass = info Map.! parent+ modName = classModName parentClass+ qualifiedName = modName ++ "__." ++ (tyclTName $ takeClassName modName)++
+ dist/build/Foreign/Java/Bindings/Support.hs view
@@ -0,0 +1,357 @@+#line 1 "src/Foreign/Java/Bindings/Support.cpphs"+{-# LANGUAGE Haskell2010+ , TypeFamilies+ , FlexibleContexts+ , FlexibleInstances+ , TypeSynonymInstances+ #-}+{-# OPTIONS+ -Wall+ #-}++-- |+-- Module : Foreign.Java.Bindings.Support+-- Copyright : (c) Julian Fleischer 2013+-- License : MIT (See LICENSE file in cabal package)+--+-- Maintainer : julian.fleischer@fu-berlin.de+-- Stability : experimental+-- Portability : non-portable (TypeFamilies)+--+-- This module provides type classes and instances for+-- supporting the high level bindings. This module should+-- not be imported directly.+module Foreign.Java.Bindings.Support where++import Control.Monad.State hiding (void)++import Data.Int+import Data.Word+import Data.Maybe++import Foreign.Ptr+import Foreign.ForeignPtr+import Foreign.C.Types++import Foreign.Java+import Foreign.Java.JavaMonad+import Foreign.Java.Types as T+import qualified Foreign.Java.JNI.Safe as JNI+import qualified Foreign.Java.JNI.Types as Core+++---------------+-- Utilities --+---------------+++object' :: String -> Q+object' = T.object'+++------------------------------+-- Primitive argument types --+------------------------------++class JBoolean a where toBoolean :: a -> Java Bool+class JChar a where toChar :: a -> Java Word16+class JByte a where toByte :: a -> Java Int8+class JShort a where toShort :: a -> Java Int16+class JInt a where toInt :: a -> Java Int32+class JLong a where toLong :: a -> Java Int64+class JFloat a where toFloat :: a -> Java Float+class JDouble a where toDouble :: a -> Java Double+++instance JBoolean Bool where toBoolean = return++instance JChar Char where toChar = return . fromIntegral . fromEnum+instance JChar Int8 where toChar = return . fromIntegral+instance JChar Word16 where toChar = return++instance JByte Int8 where toByte = return++instance JShort Int8 where toShort = return . fromIntegral+instance JShort Word8 where toShort = return . fromIntegral+instance JShort Int16 where toShort = return++instance JInt Int where toInt = return . fromIntegral+instance JInt Int8 where toInt = return . fromIntegral+instance JInt Word8 where toInt = return . fromIntegral+instance JInt Int16 where toInt = return . fromIntegral+instance JInt Word16 where toInt = return . fromIntegral+instance JInt Int32 where toInt = return++instance JLong Int where toLong = return . fromIntegral+instance JLong Int8 where toLong = return . fromIntegral+instance JLong Word8 where toLong = return . fromIntegral+instance JLong Int16 where toLong = return . fromIntegral+instance JLong Word16 where toLong = return . fromIntegral+instance JLong Int32 where toLong = return . fromIntegral+instance JLong Word32 where toLong = return . fromIntegral+instance JLong Int64 where toLong = return++instance JFloat CFloat where toFloat = return . realToFrac+instance JFloat Float where toFloat = return++instance JDouble CDouble where toDouble = return . realToFrac+instance JDouble Double where toDouble = return+++--------------------------+-- Array argument types --+--------------------------++class Array a where+ asMaybeArrayObject :: a -> Java (Maybe JObject)+++----------------------------+-- Primitive result types --+----------------------------++++++++++++-- | The result of a function call that is of type @boolean@.+class BooleanResult m where { toBooleanResult :: Either JThrowable Bool -> Java m } ; instance BooleanResult Bool where { toBooleanResult = either (\exc -> toString exc >>= fail) return } ; instance BooleanResult (Either JThrowable Bool) where { toBooleanResult = return }+-- | The result of a function call that is of type @char@.+class CharResult m where { toCharResult :: Either JThrowable Word16 -> Java m } ; instance CharResult Word16 where { toCharResult = either (\exc -> toString exc >>= fail) return } ; instance CharResult (Either JThrowable Word16) where { toCharResult = return }+-- | The result of a function call that is of type @byte@.+class ByteResult m where { toByteResult :: Either JThrowable Int8 -> Java m } ; instance ByteResult Int8 where { toByteResult = either (\exc -> toString exc >>= fail) return } ; instance ByteResult (Either JThrowable Int8) where { toByteResult = return }+-- | The result of a function call that is of type @short@.+class ShortResult m where { toShortResult :: Either JThrowable Int16 -> Java m } ; instance ShortResult Int16 where { toShortResult = either (\exc -> toString exc >>= fail) return } ; instance ShortResult (Either JThrowable Int16) where { toShortResult = return }+-- | The result of a function call that is of type @int@.+class IntResult m where { toIntResult :: Either JThrowable Int32 -> Java m } ; instance IntResult Int32 where { toIntResult = either (\exc -> toString exc >>= fail) return } ; instance IntResult (Either JThrowable Int32) where { toIntResult = return }+-- | The result of a function call that is of type @long@.+class LongResult m where { toLongResult :: Either JThrowable Int64 -> Java m } ; instance LongResult Int64 where { toLongResult = either (\exc -> toString exc >>= fail) return } ; instance LongResult (Either JThrowable Int64) where { toLongResult = return }+-- | The result of a function call that is of type @float@.+class FloatResult m where { toFloatResult :: Either JThrowable Float -> Java m } ; instance FloatResult Float where { toFloatResult = either (\exc -> toString exc >>= fail) return } ; instance FloatResult (Either JThrowable Float) where { toFloatResult = return }+-- | The result of a function call that is of type @double@.+class DoubleResult m where { toDoubleResult :: Either JThrowable Double -> Java m } ; instance DoubleResult Double where { toDoubleResult = either (\exc -> toString exc >>= fail) return } ; instance DoubleResult (Either JThrowable Double) where { toDoubleResult = return }++-- | The result of a function call that is of type @void@.+class VoidResult m where+ toVoidResult :: Either JThrowable () -> Java m+ +instance VoidResult () where+ toVoidResult = either (\exc -> toString exc >>= fail) return++instance VoidResult (Either JThrowable ()) where+ toVoidResult = return+ +instance VoidResult (Maybe JThrowable) where+ toVoidResult = return . either Just (const Nothing)+++------------------------+-- Array result types --+------------------------++-- | An array result of a function call.+class JavaArray (ArrayResultType m) (ArrayResultComponent m) => ArrayResult m where+ -- | The JVM machine type of the components of the array.+ type ArrayResultType m++ -- | The type of the component of the array as returned by+ -- the low level JNI call.+ type ArrayResultComponent m++ -- | Convert the array to a sophisticated type.+ toArrayResult :: Either JThrowable (Maybe (JArray (ArrayResultType m))) -> Java m++instance ArrayResult a => ArrayResult (Either JThrowable a) where+ type ArrayResultType (Either JThrowable a) = ArrayResultType a+ type ArrayResultComponent (Either JThrowable a) = ArrayResultComponent a++ toArrayResult = either (return . Left) (toArrayResult . Right)++++++++++instance ArrayResult [Bool] where { type ArrayResultType [Bool] = T.Z ; type ArrayResultComponent [Bool] = Bool ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }+instance ArrayResult [Word16] where { type ArrayResultType [Word16] = T.C ; type ArrayResultComponent [Word16] = Word16 ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }+instance ArrayResult [Int8] where { type ArrayResultType [Int8] = T.B ; type ArrayResultComponent [Int8] = Int8 ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }+instance ArrayResult [Int16] where { type ArrayResultType [Int16] = T.S ; type ArrayResultComponent [Int16] = Int16 ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }+instance ArrayResult [Int32] where { type ArrayResultType [Int32] = T.I ; type ArrayResultComponent [Int32] = Int32 ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }+instance ArrayResult [Int64] where { type ArrayResultType [Int64] = T.J ; type ArrayResultComponent [Int64] = Int64 ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }+instance ArrayResult [Float] where { type ArrayResultType [Float] = T.F ; type ArrayResultComponent [Float] = Float ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }+instance ArrayResult [Double] where { type ArrayResultType [Double] = T.D ; type ArrayResultComponent [Double] = Double ; toArrayResult = either (\exc -> toString exc >>= fail) (maybe (return []) toList) }+++instance ArrayResult [Char] where+ type ArrayResultType [Char] = T.C+ type ArrayResultComponent [Char] = Word16++ toArrayResult = either (\exc -> toString exc >>= fail)+ (maybe (return [])+ (fmap (map (toEnum . fromIntegral)) . toList))++instance ArrayResult [String] where+ type ArrayResultType [String] = T.L+ type ArrayResultComponent [String] = Maybe JObject++ toArrayResult =+ either (\exc -> toString exc >>= fail)+ (maybe (return [])+ (\arr -> toList arr >>= mapM (maybe (return "") toString)))++++-----------------------+-- All other objects --+-----------------------+++-- | The result of a function call that is of type @object@.+class ObjectResult m where+ -- | + toObjectResult :: Either JThrowable (Maybe JObject) -> Java m++instance UnsafeCast a => ObjectResult (Value JThrowable a) where+ toObjectResult = either (return . Fail)+ (maybe (return NoValue)+ (fmap Value . unsafeFromJObject))++instance UnsafeCast a => ObjectResult (Either (Maybe JThrowable) a) where+ toObjectResult = either (return . Left . Just)+ (maybe (return (Left Nothing))+ (fmap Right . unsafeFromJObject))++instance UnsafeCast a => ObjectResult (Either JThrowable (Maybe a)) where+ toObjectResult = either (return . Left)+ (fmap Right . maybe (return Nothing)+ (fmap Just . unsafeFromJObject))++instance UnsafeCast a => ObjectResult (Maybe a) where+ toObjectResult = either (\exc -> toString exc >>= fail)+ (maybe (return Nothing)+ (fmap Just . unsafeFromJObject))++instance ObjectResult [Char] where+ toObjectResult = either (\exc -> toString exc >>= fail)+ (maybe (return "null") toString)+++---------------------------------------------------+-- Advanced features (Callbacks, Subtyping, ...) --+---------------------------------------------------+++-- | A convenient alternative to 'isInstanceOf'.+--+-- Minimal complete definition: 'coerce' or 'whenInstanceOf'.+class InstanceOf a where+ type CoercedType a++ -- | Check if the object of type @a@ is an instance+ -- of the type represented by @b@. + instanceOf :: JavaObject o => o -> a -> Java Bool++ -- | Check if the object of type @a@ is an instance+ -- of the type @c@, represented by @b@. If so, it will coerce+ -- the object of type @a@ and pass it to the given action.+ --+ -- If @a@ was an instance of @c@ (where @c@ is represented+ -- by @b@) this function will return @'Just' d@, where @d@ is+ -- the result of the optional computation. If not, 'Nothing'+ -- is returned.+ whenInstanceOf :: JavaObject o => o -> a -> (CoercedType a -> Java d) -> Java (Maybe d)++ -- | Coerces the given object of type @a@ to an object of+ -- @c@, where @c@ is represented by a value of type @b@.+ -- Returns @'Nothing'@ if this is not possible.+ coerce :: JavaObject o => o -> a -> Java (Maybe (CoercedType a))++ instanceOf o t =+ whenInstanceOf o t (return . const ())+ >>= return . maybe False (const True)++ whenInstanceOf o t a =+ coerce o t >>= maybe (return Nothing) (fmap Just . a)++ coerce o t = whenInstanceOf o t return++-- | For INTERNAL use only. Is however not in a hidden module,+-- so that other libraries can link against it.+class UnsafeCast a where+ -- | For INTERNAL use only. Do not use yourself.+ unsafeFromJObject :: JObject -> Java a++++---------------+-- Callbacks --+---------------+++registerCallbacks :: Core.JClass -> Java Bool+-- ^ Yepp. Register callbacks. Do it.+registerCallbacks (Core.JClass ptr) = do+ vm <- getVM+ io $ withForeignPtr ptr $ \clazz -> JNI.registerCallbacks vm clazz+++type WrappedFun = Ptr Core.JVM+ -> Ptr Core.JObjectRef+ -> Ptr Core.JObjectRef+ -> Ptr Core.JObjectRef+ -> IO (Ptr Core.JObjectRef)+++runJava_ :: Ptr Core.JVM -> Java a -> IO a+runJava_ vm f = runStateT (_runJava f) (newJVMState vm) >>= return . fst++foreign import ccall safe "wrapper"+ wrap_ :: WrappedFun -> IO (FunPtr WrappedFun)++foreign export ccall freeFunPtr :: FunPtr WrappedFun -> IO ()++freeFunPtr :: FunPtr WrappedFun -> IO ()+freeFunPtr ptr = freeHaskellFunPtr ptr+++wrap :: Java () -> IO (FunPtr WrappedFun)+wrap f = do++ let func vm _self _method _args = do+ runJava_ vm f+ return nullPtr+ + func' <- wrap_ func++ return func'++intify :: Java () -> IO Int64+intify = fmap (fromIntegral . ptrToIntPtr . castFunPtrToPtr) . wrap+++sushimaki :: String -> Java () -> Java JObject+sushimaki ifaceName func = do+ iface <- getClass ifaceName >>= asObject . fromJust+ (Just clazz) <- getClass "HFunction"+ _success <- registerCallbacks clazz+ makeFunction <- clazz `bindStaticMethod` "makeFunction"+ ::= object "java.lang.Class" --> long --> object "java.lang.Object"+ (Just impl) <- io (intify func) >>= makeFunction (Just iface)+ return impl+++delete :: Core.JObject -> Java ()+delete (Core.JObject ptr) = io $ do+ finalizeForeignPtr ptr+++
dist/build/Foreign/Java/JNI/Safe.hs view
@@ -47,18 +47,6 @@ getConstructorID, newObject, --- ** Array creation--newBooleanArray,-newCharArray,-newLongArray,-newIntArray,-newShortArray,-newByteArray,-newFloatArray,-newDoubleArray,-newObjectArray,- -- * Method access JStaticMethodID,@@ -224,11 +212,6 @@ setLibjvmPath, registerCallbacks, --- * Primitive types--Z (Z), C (C), B (B), S (S), I (I), J (J),-D (D), F (F), L (L), V (V), A (A), X (X),- -- * Workarounds for certain platforms runCocoaMain@@ -534,33 +517,6 @@ foreign import ccall safe "ffijni.h setJValueString" setJValueString :: Ptr JVM -> Ptr JValues -> CInt -> CString -> IO () -foreign import ccall safe "ffijni.h newBooleanArray"- newBooleanArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall safe "ffijni.h newCharArray"- newCharArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall safe "ffijni.h newLongArray"- newLongArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall safe "ffijni.h newIntArray"- newIntArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall safe "ffijni.h newShortArray"- newShortArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall safe "ffijni.h newByteArray"- newByteArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall safe "ffijni.h newFloatArray"- newFloatArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall safe "ffijni.h newDoubleArray"- newDoubleArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall safe "ffijni.h newObjectArray"- newObjectArray :: Ptr JVM -> Int32 -> Ptr JClass -> Ptr JObjectRef- foreign import ccall safe "ffijni.h newJString" newJString :: Ptr JVM -> CString -> IO (Ptr JObjectRef) @@ -675,7 +631,7 @@ foreign import ccall safe "ffijni.h getDebugStatus" getDebugStatus :: IO Bool -foreign import ccall safe "ffijni.h setDebugStatus"+foreign import ccall safe "ffijni.g setDebugStatus" setDebugStatus :: Bool -> IO () foreign import ccall safe "ffijni.h runCocoaMain"
dist/build/Foreign/Java/JNI/Unsafe.hs view
@@ -47,18 +47,6 @@ getConstructorID, newObject, --- ** Array creation--newBooleanArray,-newCharArray,-newLongArray,-newIntArray,-newShortArray,-newByteArray,-newFloatArray,-newDoubleArray,-newObjectArray,- -- * Method access JStaticMethodID,@@ -224,11 +212,6 @@ setLibjvmPath, registerCallbacks, --- * Primitive types--Z (Z), C (C), B (B), S (S), I (I), J (J),-D (D), F (F), L (L), V (V), A (A), X (X),- -- * Workarounds for certain platforms runCocoaMain@@ -534,33 +517,6 @@ foreign import ccall unsafe "ffijni.h setJValueString" setJValueString :: Ptr JVM -> Ptr JValues -> CInt -> CString -> IO () -foreign import ccall unsafe "ffijni.h newBooleanArray"- newBooleanArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall unsafe "ffijni.h newCharArray"- newCharArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall unsafe "ffijni.h newLongArray"- newLongArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall unsafe "ffijni.h newIntArray"- newIntArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall unsafe "ffijni.h newShortArray"- newShortArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall unsafe "ffijni.h newByteArray"- newByteArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall unsafe "ffijni.h newFloatArray"- newFloatArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall unsafe "ffijni.h newDoubleArray"- newDoubleArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall unsafe "ffijni.h newObjectArray"- newObjectArray :: Ptr JVM -> Int32 -> Ptr JClass -> Ptr JObjectRef- foreign import ccall unsafe "ffijni.h newJString" newJString :: Ptr JVM -> CString -> IO (Ptr JObjectRef) @@ -675,7 +631,7 @@ foreign import ccall unsafe "ffijni.h getDebugStatus" getDebugStatus :: IO Bool -foreign import ccall unsafe "ffijni.h setDebugStatus"+foreign import ccall unsafe "ffijni.g setDebugStatus" setDebugStatus :: Bool -> IO () foreign import ccall unsafe "ffijni.h runCocoaMain"
+ dist/build/h2js/h2js-tmp/Main.hs view
@@ -0,0 +1,97 @@+{-# LANGUAGE Haskell2010+ #-}++module Main where++import Options+import Haskell2Java++import Foreign.Java.Bindings++import System.Console.GetOpt+import System.Environment (getArgs, getProgName)++import Data.Maybe+import Data.NamedRecord+import Data.List+import Data.List.Split+import Data.Word++import Text.Printf++versionInfo = "Java <-> Haskell Bindings Generator"++-- | The flags (needed for the options list / GetOpt).+data Flag = Help+ | Version+ | Classpath [String]+ | SearchDepth Word32+ | TargetDirectory String+ | CompleteSE6+ | Verbose++-- | The Command line options as fed to the GetOpt parser.+options = [+ Option "h" ["help"] (NoArg Help)+ "Print this help text.",++ Option "V" ["version"] (NoArg Version)+ "Print version information.",++ Option "c" ["classpath"] (ReqArg readClasspath "")+ "The Java classpath to be used.",++ Option "d" ["search-depth"] (ReqArg readSearchDepth "")+ "The maximum search depth for dependent Java classes.",++ Option "v" ["--verbose"] (NoArg Verbose)+ "Verbose output, prints extra diagnostic information.",++ Option "X" [] (NoArg CompleteSE6)+ "Completely translate Java SE 6"++ ] where+ readClasspath = Classpath . splitOneOf ":;,"+ readSearchDepth = SearchDepth . read++parseArgs :: IO (Either (Options, [String]) [String])+-- ^ Parse command line arguments with the help of the GetOpt library.+parseArgs = do+ (opts, args, errs) <- getArgs >>= return . getOpt Permute options+ if null errs+ then return $ Left (parseOpts newOptions opts, args)+ else return $ Right errs+ where+ parseOpts opts [] = opts+ parseOpts opts (x:xs) = flip parseOpts xs $+ case x of+ Help -> opts `set` optShowHelp := True+ Version -> opts `set` optShowVersion := True+ Verbose -> opts `set` optVerbose := True+ CompleteSE6 -> opts `set` optCompleteSE6 := True+ Classpath cp -> opts `set` optClasspath := cp+ SearchDepth d -> opts `set` optSearchDepth := d++main :: IO ()+-- ^ main: parseArgs and either 'run' or show errors.+main = parseArgs >>= either (uncurry run) (mapM_ putStr)++run :: Options -> [String] -> IO ()+-- ^ The actual main function.+run opts args+ | opts `get` optShowHelp = do+ progName <- getProgName+ putStrLn (usageInfo ((\_ -> let { __ = +{-# LINE 84 "Main.hss" #-}+concat ["", (versionInfo), "\n\nUsage: ", (progName), " [options] command [files...]\n\nUse `", (progName), " help' for information about commands.\n"]+{-# LINE 90 "Main.hss" #-}+} in __) undefined) options)++ | opts `get` optShowVersion = putStrLn versionInfo++ | otherwise = getProgName >>= \progName -> putStr ((\_ -> let { __ = +{-# LINE 94 "Main.hss" #-}+concat ["No command given. Use `", (progName), " help' for help.\n"]+{-# LINE 96 "Main.hss" #-}+} in __) undefined)+
+ dist/build/j2hs/j2hs-tmp/Java2Haskell.hs view
@@ -0,0 +1,238 @@+{-# LANGUAGE Haskell2010+ #-}+{-# OPTIONS+ -Wall+ -fno-warn-missing-signatures+ -fno-warn-name-shadowing+ #-}++{- | The @j2hs@ command - create Haskell bindings for Java classes.+ +-}+module Java2Haskell where++import Prelude hiding (print)++import Options+--import Common++import Foreign.Java+import Foreign.Java.Bindings+import Foreign.Java.Bindings.JavaTypes+import Foreign.Java.Utils+import Foreign.Java.IO++import Data.NamedRecord+import qualified Data.List as L+import Data.Strings++import Data.Generics++import qualified Data.Map as Map+import qualified Data.Set as Set+import qualified Data.MultiMap as MultiMap+import qualified Data.Bimap as Bimap++import Control.Monad++import System.Directory+import System.FilePath+import System.IO hiding (print)+import System.Exit+++-- Following 20 lines: Functions for managing a Bimap+-- such that it works with case insensitive string.+--+-- TODO: Factor this out `plus` use the case-insensitive package.+-- Those functions x... should be made into their own+-- datatype (Something like CISBimap or+-- BimapWithGenericComparisonFunction or ...)++newtype CaseInsensitiveString = CIS String++instance Eq CaseInsensitiveString where+ (CIS a) == (CIS b) = strToLower a == strToLower b++instance Ord CaseInsensitiveString where+ (CIS a) <= (CIS b) = strToLower a <= strToLower b++xToString (CIS s) = s++xEmpty = Bimap.empty+xInsert k v = Bimap.insert (CIS k) (CIS v)+xMemberR k = Bimap.memberR (CIS k)+xGet m = xToString . (Bimap.!) m . CIS+xFromList = Bimap.fromList . map (\(a, b) -> (CIS a, CIS b))+xToList = map (\(a, b) -> (xToString a, xToString b)) . Bimap.toList+xKeysR = map xToString . Bimap.keysR+xKeys = map xToString . Bimap.keys+xSize = Bimap.size++-- end todo+++ifVerbose opts = when (opts `get` optVerbose) . liftIO . putStr++j2hs :: Options -> [String] -> IO ()+j2hs opts args = do++ classpath <- mapM canonicalizePath $ opts `get` optClasspath+ targetDir <- return (opts `get` optTargetDirectory)++ let classpath' = concat $ L.intersperse ":" classpath+ indent = (" " ++)++ ifVerbose opts ((\_ -> let { __ = +{-# LINE 86 "Java2Haskell.hss" #-}+concat ["Classpath:\n", (concatMap (\x -> " " ++ x ++ "\n") (classpath)), ""]+{-# LINE 88 "Java2Haskell.hss" #-}+} in __) undefined)+ print "Initializing JVM..."+ initJava [((\_ -> let { __ = +{-# LINE 90 "Java2Haskell.hss" #-}+concat ["-Djava.class.path=", (classpath'), ""]+{-# LINE 90 "Java2Haskell.hss" #-}+} in __) undefined)]+ println " Done."+ + unless (null args) $ runJava $ do+ io $ do+ ifVerbose opts ((\_ -> let { __ = +{-# LINE 95 "Java2Haskell.hss" #-}+concat ["Target Directory:\n ", (targetDir), "\n"]+{-# LINE 98 "Java2Haskell.hss" #-}+} in __) undefined)+ createDirectoryIfMissing True targetDir+ setCurrentDirectory targetDir+ + ifVerbose opts ((\_ -> let { __ = +{-# LINE 102 "Java2Haskell.hss" #-}+concat ["Looking for Java classes:\n", (concatMap (\x -> " " ++ x ++ "\n") args), ""]+{-# LINE 104 "Java2Haskell.hss" #-}+} in __) undefined)++ -- Gather all classes that need to be translated+ print "Looking up classes..."+ classes <- findJavaClasses (opts `get` optSearchDepth) args++ println ((\_ -> let { __ = +{-# LINE 110 "Java2Haskell.hss" #-}+concat [" ", (show $ length classes), " found."]+{-# LINE 110 "Java2Haskell.hss" #-}+} in __) undefined)+ ifVerbose opts $+ unlines (map indent classes)++ -- Calculate the Haskell module names for packages and classes+ let packages = Set.toList $ Set.fromList+ $ map (maybe "" id . takePackageName) classes++ -- temporary class names+ classModules_ = foldr (uncurry g) xEmpty $ map f classes+ where f x = (x, makeClassModuleName x)+ g clazzName modName all = xInsert clazzName newName all+ where newName = head $ dropWhile (`xMemberR` all)+ $ iterate (++ "_") modName++ -- package names.+ -- This func keeps in mind that package names must not clash with class names.+ packageModules = foldr (uncurry g) xEmpty $ map f packages+ where f x = (x, makePackageModuleName x)+ g pkgName modName all = xInsert pkgName newName all+ where newName = head $ dropWhile (\n -> n `xMemberR` classModules_+ || n `xMemberR` all)+ $ iterate (++ "Package") modName++ -- finally the class names.+ -- This func keeps in mind that the package names might have been augmented+ -- before. i.e. the package java.awt.image will be Java.Awt.ImagePackage now,+ -- thus all classes inside the package have their full name changed too.+ classModules = Map.fromList $ map f $ xToList classModules_+ where f (clazzName, moduleName)+ = (clazzName, joinClassName (newPackageName, classModuleName))+ where classModuleName = takeClassName moduleName+ packageName = maybe "" id $ takePackageName clazzName+ newPackageName = packageModules `xGet` packageName++ -- A mapping form packages to classes+ classesByPackage = MultiMap.fromList+ $ map (\clazz -> (fst $ splitClassName clazz, clazz)) classes++ -- A list of all modules+ allModules = xKeysR packageModules ++ Map.elems classModules++ -- The list of hidden modules+ hiddenModules = map (++ "__") $ Map.elems classModules++ -- Gather information about classes via Reflection+ print ((\_ -> let { __ = +{-# LINE 156 "Java2Haskell.hss" #-}+concat ["Gathering refection information..."]+{-# LINE 156 "Java2Haskell.hss" #-}+} in __) undefined)+ let classNames = Map.keys classModules+ updName name clazz = (name, clazz { classModName = classModules Map.! name })+ classInfo <- Map.fromList `fmap` map (uncurry updName)+ `fmap` zip classNames+ `fmap` everywhere (mkT (\(TyVar v) -> TyVar ('_':v)))+ `fmap` reflectJavaClasses classNames+ println " Done."++ when (opts `get` optOnlyReflect) $ io $ do+ mapM_ println $ Map.elems classInfo+ exitSuccess++ println ((\_ -> let { __ = +{-# LINE 169 "Java2Haskell.hss" #-}+concat ["Generating modules for ", (show $ Map.size classModules), " classes in ", (show $ xSize packageModules), " packages..."]+{-# LINE 170 "Java2Haskell.hss" #-}+} in __) undefined)++ -- Create all the package files.+ -- These contain the Java classes as Haskell types.+ forM_ (xToList packageModules) $ \(packageName, packageMod) -> do+ let dirName = strJoin [pathSeparator] (strSplitAll "." packageMod)++ -- Create the directory for the package+ io $ do + createDirectoryIfMissing True dirName++ let classes = map (classInfo Map.!)+ (MultiMap.lookup packageName classesByPackage)++ -- Create the Haskell module file for the Java package+ file <- openFile (dirName ++ ".hs") WriteMode+ hPutStrLn file+ $ printJavaPackageModule packageName packageMod classInfo classes+ hClose file++ -- Create all the class files.+ -- These contain the java methods as Haskell functions.+ forM_ (Map.toList classModules) $ \(clazzName, clazzMod) -> do+ let fileName = strJoin [pathSeparator] (strSplitAll "." clazzMod)+ clazz = classInfo Map.! clazzName++ io $ do+ -- Create the Haskell module file for the Java class.+ file <- openFile (fileName ++ ".hs") WriteMode+ hPutStrLn file $ printJavaClassModule clazz clazzMod classInfo+ hClose file++ -- Create the *hidden* Haskell module file for the Java class.+ file <- openFile (fileName ++ "__.hs") WriteMode+ hPutStrLn file $ printJavaClassModule' clazz clazzMod classInfo+ hClose file++ -- write Cabal file+ when (opts `get` optCabalProject) $ io $ do+ cabalFile <- openFile ((opts `get` optProjectName) ++ ".cabal") WriteMode+ hPutStrLn cabalFile ((\_ -> let { __ = +{-# LINE 210 "Java2Haskell.hss" #-}+concat ["name: ", (opts `get` optProjectName), "\nversion: ", (opts `get` optProjectVersion), "\ncabal-version: >= 1.8\nbuild-type: Simple\n\nLibrary {\n build-depends:\n base >= 4 && < 5,\n java-bridge\n exposed-modules:\n ", (strJoin ",\n " allModules), "\n other-modules:\n ", (strJoin ",\n " hiddenModules), " }\n"]+{-# LINE 224 "Java2Haskell.hss" #-}+} in __) undefined)+ hClose cabalFile++ return ()+
+ dist/build/j2hs/j2hs-tmp/Main.hs view
@@ -0,0 +1,131 @@+{-# LANGUAGE Haskell2010+ #-}++module Main where++import Options+import Java2Haskell++import Foreign.Java.Bindings+import Foreign.Java.Utils+import Foreign.Java.JNI (javaBridgeVersion)++import System.Console.GetOpt+import System.Environment (getArgs, getProgName)++import Data.Maybe+import Data.NamedRecord+import Data.List+import Data.List.Split+import Data.Word++import Text.Printf++versionInfo = ((\_ -> let { __ = +{-# LINE 24 "Main.hss" #-}+concat ["Java <-> Haskell Bindings Generator (using java-bridge ", (javaBridgeVersion), ")"]+{-# LINE 25 "Main.hss" #-}+} in __) undefined)++-- | The flags (needed for the options list / GetOpt).+data Flag = Help+ | Version+ | Packages [String]+ | Classpath [String]+ | SearchDepth Word32+ | TargetDirectory String+ | CompleteSE6+ | OnlyReflect+ | Filtered+ | Verbose++-- | The Command line options as fed to the GetOpt parser.+options = [+ Option "h" ["help"] (NoArg Help)+ "Print this help text.",++ Option "V" ["version"] (NoArg Version)+ "Print version information.",++ Option "c" ["classpath"] (ReqArg readClasspath "")+ "The Java classpath to be used.",++ Option "P" ["packages"] (ReqArg readPackages "")+ "The packages to translate.",++ Option "d" ["search-depth"] (ReqArg readSearchDepth "")+ "The maximum search depth for dependent Java classes.",++ Option "v" ["verbose"] (NoArg Verbose)+ "Verbose output, prints extra diagnostic information.",++ Option "R" ["reflect"] (NoArg OnlyReflect)+ "Only reflect the given java files (mainly for debugging purposes).",++ Option "X" [] (NoArg CompleteSE6)+ "Completely translate Java SE.",++ Option "F" [] (NoArg Filtered)+ "Only translate a subset of the Java SE.",++ Option "t" ["target-directory"] (ReqArg TargetDirectory "")+ "The target directory for generated source files."++ ] where+ readPackages = Packages . splitOneOf ":;,"+ readClasspath = Classpath . splitOneOf ":;,"+ readSearchDepth = SearchDepth . read++parseArgs :: IO (Either (Options, [String]) [String])+-- ^ Parse command line arguments with the help of the GetOpt library.+parseArgs = do+ (opts, args, errs) <- getArgs >>= return . getOpt Permute options+ if null errs+ then return $ Left (parseOpts newOptions opts, args)+ else return $ Right errs+ where+ parseOpts opts [] = opts+ parseOpts opts (x:xs) = flip parseOpts xs $+ case x of+ Help -> opts `set` optShowHelp := True+ Version -> opts `set` optShowVersion := True+ Verbose -> opts `set` optVerbose := True+ Filtered -> opts `set` optFiltered := True+ CompleteSE6 -> opts `set` optCompleteSE6 := True+ OnlyReflect -> opts `set` optOnlyReflect := True+ Classpath cp -> opts `set` optClasspath := cp+ Packages pkgs -> opts `set` optPackages := pkgs+ SearchDepth d -> opts `set` optSearchDepth := d+ TargetDirectory t -> opts `set` optTargetDirectory := t++main :: IO ()+-- ^ main: parseArgs and either 'run' or show errors.+main = parseArgs >>= either (uncurry run) (mapM_ putStr)++run :: Options -> [String] -> IO ()+-- ^ The actual main function.+run opts args+ | opts `get` optShowHelp = do+ progName <- getProgName+ putStrLn (usageInfo ((\_ -> let { __ = +{-# LINE 107 "Main.hss" #-}+concat ["", (versionInfo), "\n\nUsage: ", (progName), " [options] command [files...]\n\nUse `", (progName), " help' for information about commands.\n"]+{-# LINE 113 "Main.hss" #-}+} in __) undefined) options)++ | opts `get` optShowVersion = putStrLn versionInfo+ | opts `get` optCompleteSE6 =+ if opts `get` optFiltered then j2hs opts (filter minimal javaClassesSE6)+ else j2hs opts (filter justJava javaClassesSE6)++ | otherwise = getProgName >>= \progName -> putStr ((\_ -> let { __ = +{-# LINE 120 "Main.hss" #-}+concat ["No command given. Use `", (progName), " help' for help.\n"]+{-# LINE 122 "Main.hss" #-}+} in __) undefined)+ where+ justJava = ("java" `isPrefixOf`)+ minimal name = pkg `elem` (opts `get` optPackages)+ where (pkg, _) = splitClassName name++
+ examples/calculator/calculator.cabal view
@@ -0,0 +1,22 @@+Name: calculator+Version: 1.0+Synopsis: A simple calculator demoing the usage of Java/Swing from within Haskell+Description: A simple calculator demoing the usage of Java/Swing from within Haskell++Category: LaTeX+Stability: provisional+License: MIT+License-File: LICENSE+Author: Julian Fleischer <julian.fleischer@fu-berlin.de>+Maintainer: Julian Fleischer <julian.fleischer@fu-berlin.de>+Build-Type: Simple+Cabal-Version: >= 1.8++Executable calculator+ Hs-Source-Dirs: src+ Main-is: calculator.hs++ Build-Depends: base >= 4.5 && < 5.0+ , java-bridge >= 0.20130507++ Ghc-Options: -threaded
+ examples/calculator/src/calculator.hs view
@@ -0,0 +1,60 @@+import Foreign.Java+import Data.Maybe++import Foreign.Java.Bindings.Support+++main :: IO ()+main = runJavaGui $ do+ + (Just jFrameClass) <- getClass "javax.swing.JFrame"+ (Just jButtonClass) <- getClass "javax.swing.JButton"+ (Just jGridLayoutClass) <- getClass "java.awt.GridLayout"++ setVisible <- jFrameClass `bindMethod` "setVisible" ::= boolean --> void+ addComponent <- jFrameClass `bindMethod` "add" ::= object "java.awt.Component"+ --> object "java.awt.Component"+ setLocation <- jFrameClass `bindMethod` "setLocationRelativeTo" ::= object "java.awt.Component"+ --> void+ setSize' <- jFrameClass `bindMethod` "setSize" ::= int --> int --> void+ let setSize obj (a, b) = setSize' obj a b+ setLayout <- jFrameClass `bindMethod` "setLayout" ::= object "java.awt.LayoutManager"+ --> void++ addActionListener <- jButtonClass+ `bindMethod` "addActionListener" ::= object "java.awt.event.ActionListener" --> void++ (Just jButtonConstr) <- getConstructor jButtonClass $ string+ (Just jGridLayoutConstr) <- getConstructor jGridLayoutClass $ int --> int+ + (Just jFrame) <- newObject jFrameClass+ + newObjectFrom jGridLayoutConstr 4 4 >>= setLayout jFrame++ buttons <- mapM (newObjectFrom jButtonConstr)+ [ "1", "2", "3", "*"+ , "4", "5", "6", "-"+ , "7", "8", "9", "·"+ , "C", "0", "=", "÷" ]+ + mapM_ (addComponent jFrame) buttons++ let action = do+ io $ putStrLn "Let's have some fun!"++ listener <- sushimaki "java.awt.event.ActionListener" action++ mapM_ (flip addActionListener (Just listener) . fromJust) buttons++ jFrame `setSize` (400, 300)+ jFrame `setLocation` Nothing+ jFrame `setVisible` True+++++++++
+ examples/system-properties/Makefile view
@@ -0,0 +1,9 @@+all:+ mkdir -p build+ ghc --make system-properties.hs -odir build -hidir build -o system-properties++clean:+ rm -rf build system-properties++.PHONY: clean all+
+ examples/system-properties/system-properties.hs view
@@ -0,0 +1,24 @@+import Foreign.Java+import Foreign.Java.Maybe+import qualified Foreign.Java.JNI.Safe as JNI+import Data.Maybe++main = do+ JNI.setDebugStatus True+ runJava $ do+ (Just system) <- getClass "java.lang.System"+ getProperties <- system `bindStaticMethod` "getProperties" ::= object "java.util.Properties"++ (Just hashtableClass) <- getClass "java.util.Hashtable" + getEntrySet <- hashtableClass `bindMethod` "entrySet" ::= object "java.util.Set"++ (Just setClass) <- getClass "java.util.Set"+ toArray <- setClass `bindMethod` "toArray" ::= array (object "java.lang.Object")++ (Just properties) <- getProperties+ (Just entrySet) <- getEntrySet properties+ toArray entrySet+ >>= toList . fromJust+ >>= mapM toString+ >>= mapM (io . putStrLn)+
+ hs2j/Common.hs view
@@ -0,0 +1,7 @@+{-# LANGUAGE Haskell2010 #-}++module Common where++import Options++
+ hs2j/Haskell2Java.hs view
@@ -0,0 +1,12 @@+{-# LANGUAGE Haskell2010+ #-}++module Haskell2Java where++import Options+import Common++hs2j :: Options -> [String] -> IO ()+hs2j opts args = putStrLn "hs2j"++
+ hs2j/Main.hss view
@@ -0,0 +1,97 @@+{-# LANGUAGE Haskell2010+ #-}++module Main where++import Options+import Haskell2Java++import Foreign.Java.Bindings++import System.Console.GetOpt+import System.Environment (getArgs, getProgName)++import Data.Maybe+import Data.NamedRecord+import Data.List+import Data.List.Split+import Data.Word++import Text.Printf++versionInfo = "Java <-> Haskell Bindings Generator"++-- | The flags (needed for the options list / GetOpt).+data Flag = Help+ | Version+ | Classpath [String]+ | SearchDepth Word32+ | TargetDirectory String+ | CompleteSE6+ | Verbose++-- | The Command line options as fed to the GetOpt parser.+options = [+ Option "h" ["help"] (NoArg Help)+ "Print this help text.",++ Option "V" ["version"] (NoArg Version)+ "Print version information.",++ Option "c" ["classpath"] (ReqArg readClasspath "")+ "The Java classpath to be used.",++ Option "d" ["search-depth"] (ReqArg readSearchDepth "")+ "The maximum search depth for dependent Java classes.",++ Option "v" ["--verbose"] (NoArg Verbose)+ "Verbose output, prints extra diagnostic information.",++ Option "X" [] (NoArg CompleteSE6)+ "Completely translate Java SE 6"++ ] where+ readClasspath = Classpath . splitOneOf ":;,"+ readSearchDepth = SearchDepth . read++parseArgs :: IO (Either (Options, [String]) [String])+-- ^ Parse command line arguments with the help of the GetOpt library.+parseArgs = do+ (opts, args, errs) <- getArgs >>= return . getOpt Permute options+ if null errs+ then return $ Left (parseOpts newOptions opts, args)+ else return $ Right errs+ where+ parseOpts opts [] = opts+ parseOpts opts (x:xs) = flip parseOpts xs $+ case x of+ Help -> opts `set` optShowHelp := True+ Version -> opts `set` optShowVersion := True+ Verbose -> opts `set` optVerbose := True+ CompleteSE6 -> opts `set` optCompleteSE6 := True+ Classpath cp -> opts `set` optClasspath := cp+ SearchDepth d -> opts `set` optSearchDepth := d++main :: IO ()+-- ^ main: parseArgs and either 'run' or show errors.+main = parseArgs >>= either (uncurry run) (mapM_ putStr)++run :: Options -> [String] -> IO ()+-- ^ The actual main function.+run opts args+ | opts `get` optShowHelp = do+ progName <- getProgName+ putStrLn (usageInfo """+ #{versionInfo}+ + Usage: #{progName} [options] command [files...]+ + Use `#{progName} help' for information about commands.+ """ options)++ | opts `get` optShowVersion = putStrLn versionInfo++ | otherwise = getProgName >>= \progName -> putStr """+ No command given. Use `#{progName} help' for help.+ """+
+ hs2j/Options.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE Haskell2010+ , TemplateHaskell+ #-}++module Options where++import Data.Name+import Data.NamedRecord+import Data.Word++-- The options as used in the application later on.+-- This is a named record, see Data.NamedRecord for+-- more information.+record' "Options"+ `has` "optShowHelp" := False+ `has` "optShowVersion" := False+ `has` "optClasspath" := ["."]+ `has` "optSearchDepth" := (100 :: Word32)+ `has` "optTargetDirectory" := "bindings"+ `has` "optVerbose" := False+ `has` "optCompleteSE6" := False++
+ j2hs/Common.hs view
@@ -0,0 +1,7 @@+{-# LANGUAGE Haskell2010 #-}++module Common where++import Options++
+ j2hs/Java2Haskell.hss view
@@ -0,0 +1,228 @@+{-# LANGUAGE Haskell2010+ #-}+{-# OPTIONS+ -Wall+ -fno-warn-missing-signatures+ -fno-warn-name-shadowing+ #-}++{- | The @j2hs@ command - create Haskell bindings for Java classes.+ +-}+module Java2Haskell where++import Prelude hiding (print)++import Options+--import Common++import Foreign.Java+import Foreign.Java.Bindings+import Foreign.Java.Bindings.JavaTypes+import Foreign.Java.Utils+import Foreign.Java.IO++import Data.NamedRecord+import qualified Data.List as L+import Data.Strings++import Data.Generics++import qualified Data.Map as Map+import qualified Data.Set as Set+import qualified Data.MultiMap as MultiMap+import qualified Data.Bimap as Bimap++import Control.Monad++import System.Directory+import System.FilePath+import System.IO hiding (print)+import System.Exit+++-- Following 20 lines: Functions for managing a Bimap+-- such that it works with case insensitive string.+--+-- TODO: Factor this out `plus` use the case-insensitive package.+-- Those functions x... should be made into their own+-- datatype (Something like CISBimap or+-- BimapWithGenericComparisonFunction or ...)++newtype CaseInsensitiveString = CIS String++instance Eq CaseInsensitiveString where+ (CIS a) == (CIS b) = strToLower a == strToLower b++instance Ord CaseInsensitiveString where+ (CIS a) <= (CIS b) = strToLower a <= strToLower b++xToString (CIS s) = s++xEmpty = Bimap.empty+xInsert k v = Bimap.insert (CIS k) (CIS v)+xMemberR k = Bimap.memberR (CIS k)+xGet m = xToString . (Bimap.!) m . CIS+xFromList = Bimap.fromList . map (\(a, b) -> (CIS a, CIS b))+xToList = map (\(a, b) -> (xToString a, xToString b)) . Bimap.toList+xKeysR = map xToString . Bimap.keysR+xKeys = map xToString . Bimap.keys+xSize = Bimap.size++-- end todo+++ifVerbose opts = when (opts `get` optVerbose) . liftIO . putStr++j2hs :: Options -> [String] -> IO ()+j2hs opts args = do++ classpath <- mapM canonicalizePath $ opts `get` optClasspath+ targetDir <- return (opts `get` optTargetDirectory)++ let classpath' = concat $ L.intersperse ":" classpath+ indent = (" " ++)++ ifVerbose opts """+ Classpath:+ #{concatMap (\x -> " " ++ x ++ "\n") (classpath)}"""+ print "Initializing JVM..."+ initJava ["""-Djava.class.path=#{classpath'}"""]+ println " Done."+ + unless (null args) $ runJava $ do+ io $ do+ ifVerbose opts """+ Target Directory:+ #{targetDir}+ """+ createDirectoryIfMissing True targetDir+ setCurrentDirectory targetDir+ + ifVerbose opts """+ Looking for Java classes:+ #{concatMap (\x -> " " ++ x ++ "\n") args}"""++ -- Gather all classes that need to be translated+ print "Looking up classes..."+ classes <- findJavaClasses (opts `get` optSearchDepth) args++ println """ #{show $ length classes} found."""+ ifVerbose opts $+ unlines (map indent classes)++ -- Calculate the Haskell module names for packages and classes+ let packages = Set.toList $ Set.fromList+ $ map (maybe "" id . takePackageName) classes++ -- temporary class names+ classModules_ = foldr (uncurry g) xEmpty $ map f classes+ where f x = (x, makeClassModuleName x)+ g clazzName modName all = xInsert clazzName newName all+ where newName = head $ dropWhile (`xMemberR` all)+ $ iterate (++ "_") modName++ -- package names.+ -- This func keeps in mind that package names must not clash with class names.+ packageModules = foldr (uncurry g) xEmpty $ map f packages+ where f x = (x, makePackageModuleName x)+ g pkgName modName all = xInsert pkgName newName all+ where newName = head $ dropWhile (\n -> n `xMemberR` classModules_+ || n `xMemberR` all)+ $ iterate (++ "Package") modName++ -- finally the class names.+ -- This func keeps in mind that the package names might have been augmented+ -- before. i.e. the package java.awt.image will be Java.Awt.ImagePackage now,+ -- thus all classes inside the package have their full name changed too.+ classModules = Map.fromList $ map f $ xToList classModules_+ where f (clazzName, moduleName)+ = (clazzName, joinClassName (newPackageName, classModuleName))+ where classModuleName = takeClassName moduleName+ packageName = maybe "" id $ takePackageName clazzName+ newPackageName = packageModules `xGet` packageName++ -- A mapping form packages to classes+ classesByPackage = MultiMap.fromList+ $ map (\clazz -> (fst $ splitClassName clazz, clazz)) classes++ -- A list of all modules+ allModules = xKeysR packageModules ++ Map.elems classModules++ -- The list of hidden modules+ hiddenModules = map (++ "__") $ Map.elems classModules++ -- Gather information about classes via Reflection+ print """Gathering refection information..."""+ let classNames = Map.keys classModules+ updName name clazz = (name, clazz { classModName = classModules Map.! name })+ classInfo <- Map.fromList `fmap` map (uncurry updName)+ `fmap` zip classNames+ `fmap` everywhere (mkT (\(TyVar v) -> TyVar ('_':v)))+ `fmap` reflectJavaClasses classNames+ println " Done."++ when (opts `get` optOnlyReflect) $ io $ do+ mapM_ println $ Map.elems classInfo+ exitSuccess++ println """Generating modules for #{show $ Map.size classModules} classes in \+ #{show $ xSize packageModules} packages..."""++ -- Create all the package files.+ -- These contain the Java classes as Haskell types.+ forM_ (xToList packageModules) $ \(packageName, packageMod) -> do+ let dirName = strJoin [pathSeparator] (strSplitAll "." packageMod)++ -- Create the directory for the package+ io $ do + createDirectoryIfMissing True dirName++ let classes = map (classInfo Map.!)+ (MultiMap.lookup packageName classesByPackage)++ -- Create the Haskell module file for the Java package+ file <- openFile (dirName ++ ".hs") WriteMode+ hPutStrLn file+ $ printJavaPackageModule packageName packageMod classInfo classes+ hClose file++ -- Create all the class files.+ -- These contain the java methods as Haskell functions.+ forM_ (Map.toList classModules) $ \(clazzName, clazzMod) -> do+ let fileName = strJoin [pathSeparator] (strSplitAll "." clazzMod)+ clazz = classInfo Map.! clazzName++ io $ do+ -- Create the Haskell module file for the Java class.+ file <- openFile (fileName ++ ".hs") WriteMode+ hPutStrLn file $ printJavaClassModule clazz clazzMod classInfo+ hClose file++ -- Create the *hidden* Haskell module file for the Java class.+ file <- openFile (fileName ++ "__.hs") WriteMode+ hPutStrLn file $ printJavaClassModule' clazz clazzMod classInfo+ hClose file++ -- write Cabal file+ when (opts `get` optCabalProject) $ io $ do+ cabalFile <- openFile ((opts `get` optProjectName) ++ ".cabal") WriteMode+ hPutStrLn cabalFile """+ name: #{opts `get` optProjectName}+ version: #{opts `get` optProjectVersion}+ cabal-version: >= 1.8+ build-type: Simple+ + Library {+ build-depends:+ base >= 4 && < 5,+ java-bridge+ exposed-modules:+ #{strJoin ",\n " allModules}+ other-modules:+ #{strJoin ",\n " hiddenModules} }+ """+ hClose cabalFile++ return ()+
+ j2hs/Main.hss view
@@ -0,0 +1,128 @@+{-# LANGUAGE Haskell2010+ #-}++module Main where++import Options+import Java2Haskell++import Foreign.Java.Bindings+import Foreign.Java.Utils+import Foreign.Java.JNI (javaBridgeVersion)++import System.Console.GetOpt+import System.Environment (getArgs, getProgName)++import Data.Maybe+import Data.NamedRecord+import Data.List+import Data.List.Split+import Data.Word++import Text.Printf++versionInfo = """+ Java <-> Haskell Bindings Generator (using java-bridge #{javaBridgeVersion})"""++-- | The flags (needed for the options list / GetOpt).+data Flag = Help+ | Version+ | Packages [String]+ | Classpath [String]+ | SearchDepth Word32+ | TargetDirectory String+ | CompleteSE6+ | OnlyReflect+ | Filtered+ | Verbose++-- | The Command line options as fed to the GetOpt parser.+options = [+ Option "h" ["help"] (NoArg Help)+ "Print this help text.",++ Option "V" ["version"] (NoArg Version)+ "Print version information.",++ Option "c" ["classpath"] (ReqArg readClasspath "")+ "The Java classpath to be used.",++ Option "P" ["packages"] (ReqArg readPackages "")+ "The packages to translate.",++ Option "d" ["search-depth"] (ReqArg readSearchDepth "")+ "The maximum search depth for dependent Java classes.",++ Option "v" ["verbose"] (NoArg Verbose)+ "Verbose output, prints extra diagnostic information.",++ Option "R" ["reflect"] (NoArg OnlyReflect)+ "Only reflect the given java files (mainly for debugging purposes).",++ Option "X" [] (NoArg CompleteSE6)+ "Completely translate Java SE.",++ Option "F" [] (NoArg Filtered)+ "Only translate a subset of the Java SE.",++ Option "t" ["target-directory"] (ReqArg TargetDirectory "")+ "The target directory for generated source files."++ ] where+ readPackages = Packages . splitOneOf ":;,"+ readClasspath = Classpath . splitOneOf ":;,"+ readSearchDepth = SearchDepth . read++parseArgs :: IO (Either (Options, [String]) [String])+-- ^ Parse command line arguments with the help of the GetOpt library.+parseArgs = do+ (opts, args, errs) <- getArgs >>= return . getOpt Permute options+ if null errs+ then return $ Left (parseOpts newOptions opts, args)+ else return $ Right errs+ where+ parseOpts opts [] = opts+ parseOpts opts (x:xs) = flip parseOpts xs $+ case x of+ Help -> opts `set` optShowHelp := True+ Version -> opts `set` optShowVersion := True+ Verbose -> opts `set` optVerbose := True+ Filtered -> opts `set` optFiltered := True+ CompleteSE6 -> opts `set` optCompleteSE6 := True+ OnlyReflect -> opts `set` optOnlyReflect := True+ Classpath cp -> opts `set` optClasspath := cp+ Packages pkgs -> opts `set` optPackages := pkgs+ SearchDepth d -> opts `set` optSearchDepth := d+ TargetDirectory t -> opts `set` optTargetDirectory := t++main :: IO ()+-- ^ main: parseArgs and either 'run' or show errors.+main = parseArgs >>= either (uncurry run) (mapM_ putStr)++run :: Options -> [String] -> IO ()+-- ^ The actual main function.+run opts args+ | opts `get` optShowHelp = do+ progName <- getProgName+ putStrLn (usageInfo """+ #{versionInfo}+ + Usage: #{progName} [options] command [files...]+ + Use `#{progName} help' for information about commands.+ """ options)++ | opts `get` optShowVersion = putStrLn versionInfo+ | opts `get` optCompleteSE6 =+ if opts `get` optFiltered then j2hs opts (filter minimal javaClassesSE6)+ else j2hs opts (filter justJava javaClassesSE6)++ | otherwise = getProgName >>= \progName -> putStr """+ No command given. Use `#{progName} help' for help.+ """+ where+ justJava = ("java" `isPrefixOf`)+ minimal name = pkg `elem` (opts `get` optPackages)+ where (pkg, _) = splitClassName name++
+ j2hs/Options.hs view
@@ -0,0 +1,29 @@+{-# LANGUAGE Haskell2010+ , TemplateHaskell+ #-}++module Options where++import Data.Name+import Data.NamedRecord+import Data.Word++-- The options as used in the application later on.+-- This is a named record, see Data.NamedRecord for+-- more information.+record' "Options"+ `has` "optShowHelp" := False+ `has` "optShowVersion" := False+ `has` "optPackages" := ["java.lang"]+ `has` "optClasspath" := ["."]+ `has` "optSearchDepth" := (100 :: Word32)+ `has` "optVerbose" := False+ `has` "optCompleteSE6" := False+ `has` "optFiltered" := False+ `has` "optOnlyReflect" := False+ `has` "optTargetDirectory" := "bindings"+ `has` "optProjectName" := "java-bindings"+ `has` "optProjectVersion" := "1.0"+ `has` "optCabalProject" := True++
java-bridge.cabal view
@@ -1,5 +1,5 @@ name: java-bridge-version: 0.99+version: 0.20130606.3 license: MIT license-file: LICENSE@@ -34,7 +34,16 @@ still need to manually lookup classes and methods in order to use them. .+ [@high level bindings generator@]+ You can also generate high level bindings using the+ tools @j2hs@ and @hs2j@ that come along with this+ package. The tools works in both directions, i.e. you+ can generate glue code to use existing Java libraries+ from within Haskell as well as to use Haskell from+ within Java. This is the most convenient way to deal+ with a Java library. .+ . >>> INSTALLATION / USAGE . It should suffice to do @cabal install@ (or@@ -72,6 +81,10 @@ This implies @NO_TOOLS@. Defaults to @False@. .+ [@NO_TOOLS@]+ Do not build the @j2hs@ and @hs2j@ executables.+ Defaults to @False@.+ . [@DEBUG@] Enable a debug build. Defaults to @False@. .@@ -87,9 +100,19 @@ @False@. Enable this flag if building on your OS X machine fails. Defaults to @False@. .+ [@EXAMPLES@]+ Build a set of examples. They are prefixed+ with @java-@ and located along your haskell+ executables. Defaults to @False@.+ . Use for example @cabal install -f OSX_FRAMEWORK -f EXAMPLES@ or @cabal configure -f DEBUG@.+ .+ .+ >>> HACKING+ .+ See @HACKING.txt@ and @ISSUES.txt@ in the tar.gz-package. build-type: Custom @@ -100,6 +123,8 @@ GetProperty.java, HFunction.java, ReadClass.java,+ examples/calculator/calculator.cabal,+ examples/system-properties/Makefile, HACKING.txt, ISSUES.txt, README.md@@ -109,6 +134,10 @@ direct binding to the Java Native Interface. Default: False +flag NO_TOOLS+ Description: Do not build the `j2hs' and `hs2j' executables.+ Default: False+ flag DEBUG Description: Enable a debug build. Default: False@@ -123,10 +152,14 @@ of loading the dynamic library. Default: False +flag EXAMPLES+ Description: Build a set of sample executables.+ Default: False + Library- cc-options: -DFFIJNI_BRIDGE_VERSION="1.0"- cpp-options: -DFFIJNI_BRIDGE_VERSION="1.0"+ cc-options: -DFFIJNI_BRIDGE_VERSION="0.20130606.3"+ cpp-options: -DFFIJNI_BRIDGE_VERSION="0.20130606.3" build-depends: base >= 4.5 && < 5 , directory >= 1.1.0.2@@ -147,18 +180,35 @@ else exposed-modules: Foreign.Java , Foreign.Java.Bindings+ , Foreign.Java.Bindings.JavaTypes+ , Foreign.Java.Bindings.HaskellTypes+ , Foreign.Java.Bindings.Support+ , Foreign.Java.Control+ , Foreign.Java.IO+ , Foreign.Java.Maybe , Foreign.Java.Utils , Foreign.Java.Value+ , Foreign.Java.Tutorial - build-depends: cpphs >= 1.16+ build-depends: hinduce-missingh+ , cpphs >= 1.16 , strings >= 1.1+ , multimap >= 1.2+ -- the following are part of the Haskell Platform , mtl >= 2.1.1+ , syb >= 0.3.6.1 , transformers >= 0.3- , hx >= 0.4+ , containers >= 0.4.2.1 other-modules: Foreign.Java.Types , Foreign.Java.JavaMonad , Foreign.Java.Util+ , Foreign.Java.Bindings.ReflectJava+ , Foreign.Java.Bindings.ReflectHaskell+ , Foreign.Java.Bindings.Java2Haskell+ , Foreign.Java.Bindings.Haskell2Java+ , Foreign.Java.Bindings.JavaSE6+ , Foreign.Java.Bindings.Typomatic if flag(DEBUG) cc-options: -DFFIJNI_DEBUG@@ -194,4 +244,105 @@ cpp-options: -DFFIJNI_WINDOWS else buildable: False+++Executable j2hs+ hs-source-dirs: j2hs+ main-is: Main.hs++ other-modules: Common+ , Options+ , Java2Haskell++ build-depends: base >= 4.5 && < 5+ , java-bridge++ if flag(ONLY_CORE)+ buildable: False+ else+ if flag(NO_TOOLS)+ buildable: False+ else+ buildable: True+ build-depends: containers >= 0.4.2.1+ , directory >= 1.1.0.2+ , filepath >= 1.3+ -- These are part of the Haskell Platform:+ , syb >= 0.3.6.1+ , split >= 0.2.1.1+ -- These are available from HackageDB:+ , strings >= 1.1+ , multimap >= 1.2+ , names >= 0.3.1 && < 0.4+ , named-records >= 0.5+ , bimap >= 0.2.4+ , hint >= 0.3.3.4+++Executable h2js+ hs-source-dirs: hs2j+ main-is: Main.hs++ other-modules: Common+ , Options+ , Haskell2Java++ build-depends: base >= 4.5 && < 5+ , java-bridge++ if flag(ONLY_CORE)+ buildable: False+ else+ if flag(NO_TOOLS)+ buildable: False+ else+ buildable: True+ build-depends: containers >= 0.4.2.1+ , directory >= 1.1.0.2+ , filepath >= 1.3+ -- These are part of the Haskell Platform:+ , syb >= 0.3.6.1+ , split >= 0.2.1.1+ -- These are available from HackageDB:+ , strings >= 1.1+ , multimap >= 1.1+ , names >= 0.3.1 && < 0.4+ , named-records >= 0.5+ , bimap >= 0.2.4+ , hint >= 0.3.3.4+++Executable java-calculator+ if flag(EXAMPLES)+ if os(darwin)+ if flag(OSX_GUI)+ buildable: True+ else+ buildable: False+ else+ buildable: True+ else+ buildable: False++ build-depends: base >= 4 && < 5+ , java-bridge++ hs-source-dirs: examples/calculator/src+ main-is: calculator.hs++ ghc-options: -threaded+++Executable java-system-properties+ if flag(EXAMPLES)+ buildable: True+ else+ buildable: False++ build-depends: base >= 4 && < 5+ , java-bridge++ hs-source-dirs: examples/system-properties+ main-is: system-properties.hs+
src/Foreign/Java.cpphs view
@@ -212,10 +212,7 @@ asObject :: a -> Java JObject -- | Returns a reference to the Class of the given object.- classOf :: a -> Java JClass-- -- | Returns a string representation of the type.- jtypeOf :: a -> Java String+ classOf :: a -> Java JClass -- | Checks two objects for equality using their @equals@ methods. equals :: JavaObject b => a -> b -> Java Bool@@ -223,10 +220,6 @@ toString obj = asObject obj >>= toString hashCode obj = asObject obj >>= hashCode classOf obj = asObject obj >>= classOf- jtypeOf obj = do- (Just clazz) <- getClass "java.lang.Class"- getName <- clazz `bindMethod` "getName" ::= string- classOf obj >>= asObject >>= getName >>= return . maybe "" id equals this obj = do this' <- asObject this
− src/Foreign/Java/Bindings.cpphs
@@ -1,384 +0,0 @@-{-# LANGUAGE Haskell2010- , TypeFamilies- , FlexibleContexts- , FlexibleInstances- , TypeSynonymInstances- , MultiParamTypeClasses- , ScopedTypeVariables- , NoImplicitPrelude- #-}-{-# OPTIONS- -Wall- #-}---- |--- Module : Foreign.Java.Bindings.Support--- Copyright : (c) Julian Fleischer 2013--- License : MIT (See LICENSE file in cabal package)------ Maintainer : julian.fleischer@fu-berlin.de--- Stability : experimental--- Portability : non-portable (TypeFamilies)------ This module provides type classes and instances for--- supporting the high level bindings. This module should--- not be imported directly.-module Foreign.Java.Bindings where--import Haskell.X.Prelude hiding (toList, arr)--import Control.Monad.State hiding (void)--import Foreign-import Foreign.C--import Foreign.Java-import Foreign.Java.JavaMonad-import Foreign.Java.Types as T-import qualified Foreign.Java.JNI.Safe as JNI-import qualified Foreign.Java.JNI.Types as Core--------------------- Utilities ---------------------object' :: [Char] -> Q-object' = T.object'------------------------------------ Primitive argument types -----------------------------------class JBoolean a where toBoolean :: a -> Java Bool-class JChar a where toChar :: a -> Java Word16-class JByte a where toByte :: a -> Java Int8-class JShort a where toShort :: a -> Java Int16-class JInt a where toInt :: a -> Java Int32-class JLong a where toLong :: a -> Java Int64-class JFloat a where toFloat :: a -> Java Float-class JDouble a where toDouble :: a -> Java Double---instance JBoolean Bool where toBoolean = return--instance JChar Char where toChar = return . fromIntegral . fromEnum-instance JChar Int8 where toChar = return . fromIntegral-instance JChar Word16 where toChar = return--instance JByte Int8 where toByte = return--instance JShort Int8 where toShort = return . fromIntegral-instance JShort Word8 where toShort = return . fromIntegral-instance JShort Int16 where toShort = return--instance JInt Int where toInt = return . fromIntegral-instance JInt Int8 where toInt = return . fromIntegral-instance JInt Word8 where toInt = return . fromIntegral-instance JInt Int16 where toInt = return . fromIntegral-instance JInt Word16 where toInt = return . fromIntegral-instance JInt Int32 where toInt = return--instance JLong Int where toLong = return . fromIntegral-instance JLong Int8 where toLong = return . fromIntegral-instance JLong Word8 where toLong = return . fromIntegral-instance JLong Int16 where toLong = return . fromIntegral-instance JLong Word16 where toLong = return . fromIntegral-instance JLong Int32 where toLong = return . fromIntegral-instance JLong Word32 where toLong = return . fromIntegral-instance JLong Int64 where toLong = return--instance JFloat CFloat where toFloat = return . realToFrac-instance JFloat Float where toFloat = return--instance JDouble CDouble where toDouble = return . realToFrac-instance JDouble Double where toDouble = return-------------------------------- Array argument types -------------------------------class Array a where- asMaybeArrayObject :: a -> Java (Maybe JObject)---------------------------------- Primitive result types ---------------------------------#define PRIMITIVE_RESULT(NAME, TYPE) \- class NAME ## Result m where {\- to ## NAME ## Result :: Either JThrowable TYPE -> Java m }\- ;\- instance NAME ## Result TYPE where {\- to ## NAME ## Result = either (\exc -> toString exc >>= fail) return }\- ;\- instance NAME ## Result (Either JThrowable TYPE) where {\- to ## NAME ## Result = return }---- | The result of a function call that is of type @boolean@.-PRIMITIVE_RESULT(Boolean, Bool)--- | The result of a function call that is of type @char@.-PRIMITIVE_RESULT(Char, Word16)--- | The result of a function call that is of type @byte@.-PRIMITIVE_RESULT(Byte, Int8)--- | The result of a function call that is of type @short@.-PRIMITIVE_RESULT(Short, Int16)--- | The result of a function call that is of type @int@.-PRIMITIVE_RESULT(Int, Int32)--- | The result of a function call that is of type @long@.-PRIMITIVE_RESULT(Long, Int64)--- | The result of a function call that is of type @float@.-PRIMITIVE_RESULT(Float, Float)--- | The result of a function call that is of type @double@.-PRIMITIVE_RESULT(Double, Double)---- | The result of a function call that is of type @void@.-class VoidResult m where- toVoidResult :: Either JThrowable () -> Java m- -instance VoidResult () where- toVoidResult = either (\exc -> toString exc >>= fail) return--instance VoidResult (Either JThrowable ()) where- toVoidResult = return- -instance VoidResult (Maybe JThrowable) where- toVoidResult = return . either Just (const Nothing)------------------------------ Array result types ------------------------------- | An array result of a function call.-class JavaArray (ArrayResultType m) (ArrayResultComponent m) => ArrayResult m where- -- | The JVM machine type of the components of the array.- type ArrayResultType m-- -- | The type of the component of the array as returned by- -- the low level JNI call.- type ArrayResultComponent m-- -- | Convert the array to a sophisticated type.- toArrayResult :: Either JThrowable (Maybe (JArray (ArrayResultType m))) -> Java m--instance ArrayResult a => ArrayResult (Either JThrowable a) where- type ArrayResultType (Either JThrowable a) = ArrayResultType a- type ArrayResultComponent (Either JThrowable a) = ArrayResultComponent a-- toArrayResult = either (return . Left) (toArrayResult . Right)--#define ARRAY_RESULT(TYPE, PRIM) \- instance ArrayResult [TYPE] where {\- type ArrayResultType [TYPE] = T.PRIM ;\- type ArrayResultComponent [TYPE] = TYPE ;\- \- toArrayResult = either (\exc -> toString exc >>= fail) \- (maybe (return []) toList) }--ARRAY_RESULT(Bool, Z)-ARRAY_RESULT(Word16, C)-ARRAY_RESULT(Int8, B)-ARRAY_RESULT(Int16, S)-ARRAY_RESULT(Int32, I)-ARRAY_RESULT(Int64, J)-ARRAY_RESULT(Float, F)-ARRAY_RESULT(Double, D)---instance ArrayResult [Char] where- type ArrayResultType [Char] = T.C- type ArrayResultComponent [Char] = Word16-- toArrayResult = either (\exc -> toString exc >>= fail)- (maybe (return [])- (fmap (map (toEnum . fromIntegral)) . toList))--instance ArrayResult [[Char]] where- type ArrayResultType [[Char]] = T.L- type ArrayResultComponent [[Char]] = Maybe JObject-- toArrayResult =- either (\exc -> toString exc >>= fail)- (maybe (return [])- (\arr -> toList arr >>= mapM (maybe (return "") toString)))------------------------------ All other objects ----------------------------newtype AsString o = AsString [Char]- deriving (Eq, Show, Ord)--newtype AsList a o = AsList [a]- deriving (Eq, Show, Ord)--class ObjectToList o e where- objectToList :: o -> JObject -> Java [e]---- | The result of a function call that is of type @object@.-class ObjectResult m where- -- | - toObjectResult :: Either JThrowable (Maybe JObject) -> Java m--instance ObjectResult (AsString a) where- toObjectResult = fmap AsString . either (\exc -> toString exc >>= fail)- (maybe (return "null") toString)--instance ObjectToList o e => ObjectResult (AsList e o) where- toObjectResult = fmap AsList . either (\exc -> toString exc >>= fail)- (maybe (return []) (objectToList (undefined :: o)))--instance UnsafeCast a => ObjectResult (Value a) where- toObjectResult = either (return . Fail)- (maybe (return NoValue)- (fmap Value . unsafeFromJObject))--instance UnsafeCast a => ObjectResult (Either JThrowable a) where- toObjectResult = either (return . Left)- (maybe (fmap Left nullPointer)- (fmap Right . unsafeFromJObject))- where- nullPointer :: Java JThrowable- nullPointer = do- (Just clazz) <- getClass "java.lang.NullPointerException"- (Just (Core.JObject obj)) <- newObject clazz- return $ Core.JThrowable (castForeignPtr obj)--instance UnsafeCast a => ObjectResult (Either (Maybe JThrowable) a) where- toObjectResult = either (return . Left . Just)- (maybe (return (Left Nothing))- (fmap Right . unsafeFromJObject))--instance UnsafeCast a => ObjectResult (Maybe a) where- toObjectResult = either (\exc -> toString exc >>= fail)- (maybe (return Nothing)- (fmap Just . unsafeFromJObject))--------------------------------------------------------- Advanced features (Callbacks, Subtyping, ...) ----------------------------------------------------------- | A convenient alternative to 'isInstanceOf'.------ Minimal complete definition: 'coerce' or 'whenInstanceOf'.-class InstanceOf a where- type CoercedType a-- -- | Check if the object of type @a@ is an instance- -- of the type represented by @b@. - instanceOf :: JavaObject o => o -> a -> Java Bool-- -- | Check if the object of type @a@ is an instance- -- of the type @c@, represented by @b@. If so, it will coerce- -- the object of type @a@ and pass it to the given action.- --- -- If @a@ was an instance of @c@ (where @c@ is represented- -- by @b@) this function will return @'Just' d@, where @d@ is- -- the result of the optional computation. If not, 'Nothing'- -- is returned.- whenInstanceOf :: JavaObject o => o -> a -> (CoercedType a -> Java d) -> Java (Maybe d)-- -- | Coerces the given object of type @a@ to an object of- -- @c@, where @c@ is represented by a value of type @b@.- -- Returns @'Nothing'@ if this is not possible.- coerce :: JavaObject o => o -> a -> Java (Maybe (CoercedType a))-- instanceOf o t =- whenInstanceOf o t (return . const ())- >>= return . maybe False (const True)-- whenInstanceOf o t a =- coerce o t >>= maybe (return Nothing) (fmap Just . a)-- coerce o t = whenInstanceOf o t return---- | For INTERNAL use only. Is however not in a hidden module,--- so that other libraries can link against it.-class UnsafeCast a where- -- | For INTERNAL use only. Do not use yourself.- unsafeFromJObject :: JObject -> Java a---------------------- Callbacks ---------------------registerCallbacks :: Core.JClass -> Java Bool--- ^ Yepp. Register callbacks. Do it.-registerCallbacks (Core.JClass ptr) = do- vm <- getVM- io $ withForeignPtr ptr $ \clazz -> JNI.registerCallbacks vm clazz----- | A wrapped function can be used as a callback from the--- JVM into the Haskell runtime environment.-type WrappedFunc = Ptr Core.JVM -- Ptr to JEnv- -> Ptr Core.JObjectRef -- Ptr to this, a proxy- -> Ptr Core.JObjectRef -- Ptr to method, the requested method- -> Ptr Core.JObjectRef -- Ptr to a JObject-Array (Object[]), the arguments- -> IO (Ptr Core.JObjectRef) -- Returns a pointer to the result--type InterfaceFunc = JObject -> JObject -> JObject -> Java (Maybe JObject)--runJava_ :: Ptr Core.JVM -> Java a -> IO a-runJava_ vm f = runStateT (_runJava f) (newJVMState vm) >>= return . fst--foreign import ccall safe "wrapper"- wrap_ :: WrappedFunc -> IO (FunPtr WrappedFunc)--foreign export ccall freeFunPtr :: FunPtr WrappedFunc -> IO ()---freeFunPtr :: FunPtr WrappedFunc -> IO ()-freeFunPtr ptr = freeHaskellFunPtr ptr---implementInterfaceBy :: [Char] -> InterfaceFunc -> Java JObject-implementInterfaceBy ifaceName func = do- iface <- getClass ifaceName >>= asObject . fromJust- (Just clazz) <- getClass "HFunction"- _success <- registerCallbacks clazz- makeFunction <- clazz `bindStaticMethod` "makeFunction"- ::= object "java.lang.Class" --> long --> object "java.lang.Object"- (Just impl) <- io (intify func) >>= makeFunction (Just iface)- return impl- where- wrap :: InterfaceFunc -> IO (FunPtr WrappedFunc)- wrap f = do-- let proxyFunc vm self method args = do- self' <- Core.JObject <$> newForeignPtr JNI.release self- method' <- Core.JObject <$> newForeignPtr JNI.release method- args' <- Core.JObject <$> newForeignPtr JNI.release args-- jobj <- runJava_ vm (f self' method' args')-- case jobj of- Nothing -> return nullPtr- Just (Core.JObject ptr) -> withForeignPtr ptr return-- wrappedFunc <- wrap_ proxyFunc-- return wrappedFunc-- intify :: InterfaceFunc -> IO Int64- intify = fmap (fromIntegral . ptrToIntPtr . castFunPtrToPtr) . wrap---delete :: Core.JObject -> Java ()-delete (Core.JObject ptr) = io $ do- finalizeForeignPtr ptr---
+ src/Foreign/Java/Bindings.hss view
@@ -0,0 +1,221 @@+{-# LANGUAGE Haskell2010 #-}+{-# OPTIONS -Wall #-}++-- | Functions for generating glue code between Haskell and Java.+module Foreign.Java.Bindings (++ -- * Create Haskell glue code from Java definitions+ printJavaPackageModule,+ printJavaClassModule,+ printJavaClassBootfile,+ printJavaClassModule',+ printJavaClassBootfile',++ -- * Reflect Java classes+ reflectJavaClasses,+ findJavaClasses,++ -- ** A priori known information about Java+ javaClassesSE6++ ) where++import Foreign.Java+import Foreign.Java.Utils+import qualified Foreign.Java.Bindings.JavaSE6++import Foreign.Java.Bindings.JavaTypes+import qualified Foreign.Java.Bindings.Java2Haskell as Java2Haskell+import qualified Foreign.Java.Bindings.ReflectJava as ReflectJava++import Foreign.Java.Bindings.HaskellTypes+import qualified Foreign.Java.Bindings.Haskell2Java as Haskell2Java+import qualified Foreign.Java.Bindings.ReflectHaskell as ReflectHaskell++import Data.Word++import Data.Map (Map)+import qualified Data.List as List+import qualified Data.Map as Map+++javaClassesSE6 :: [String]+-- ^ The names of all Java Classes part of Java SE 6.+javaClassesSE6 = Foreign.Java.Bindings.JavaSE6.javaClassesSE6++imports :: String+-- ^ Imports of all auto generated java code files.+imports = """+ import qualified Foreign.Java as JNI+ import Foreign.Java ((-->))+ import qualified Prelude as Prelude+ import Prelude ((.), ($), (>>=), (>>), return)+ import qualified Foreign.Java.Bindings.Support as JNIS+ import Data.Functor ((<$>))+ """++classInfoSignature :: String+-- ^ +classInfoSignature = "Prelude.String"++classInfo' :: JavaClass -> String+-- ^ +classInfo' clazz = className clazz++packageInfo' packageName classes = packageName++printJavaPackageModule :: String -- The Java package name+ -> String -- The Haskell module name of the Java package+ -> Map String JavaClass -- Info about all other classes+ -> [JavaClass] -- The Java classes contained in the Java package+ -> String+-- ^ +printJavaPackageModule packageName modName classInfo classes = """+ {-# LANGUAGE Haskell2010 #-}+ -- | Package @#{packageName}@+ module #{modName} (+ #{moduleExports}\+ info'+ ) where+ #{imports}+ #{moduleImports}+ -- Information about this package.+ info' = #{show $ packageInfo' packageName classes}+ #{moduleDeclarations}+ """+ where moduleDeclarations = Java2Haskell.pkgModDecl classInfo classes+ moduleImports = Java2Haskell.pkgModImports classInfo classes+ moduleExports = Java2Haskell.pkgModExports classInfo classes+++printJavaClassModule :: JavaClass -- The Java class+ -> String -- The Haskell module name of the Java class+ -> Map String JavaClass -- Info about all classes+ -> String+-- ^ +printJavaClassModule clazz modName classInfo = """+ {-# LANGUAGE Haskell2010 #-}+ -- | #{show $ classType clazz} @#{classFullName clazz}@+ module #{modName} (+ #{moduleExports}\+ -- * Information about this class.+ info'+ ) where+ #{imports}+ #{bootfileImports}+ #{moduleImports}+ info' = #{show $ classInfo' clazz}+ #{bootfileDeclarations}+ #{moduleDeclarations}+ """+ where bootfileDeclarations = Java2Haskell.classBootDecl classInfo clazz+ bootfileImports = Java2Haskell.classBootImports classInfo clazz+ moduleDeclarations = Java2Haskell.classModDecl classInfo clazz+ moduleImports = Java2Haskell.classModImports classInfo clazz+ moduleExports = Java2Haskell.classModExports classInfo clazz+++printJavaClassBootfile :: JavaClass -- The Java class+ -> String -- The Haskell module name of the Java class+ -> Map String JavaClass -- Info about all classes+ -> String+-- ^ +printJavaClassBootfile clazz modName classInfo = """+ {-# LANGUAGE Haskell2010 #-}+ -- Bootfile for class #{className clazz}+ module #{modName} (+ #{bootfileExports}\+ info'+ ) where+ #{imports}+ #{bootfileImports}+ info' :: #{classInfoSignature}+ #{bootfileDeclarations}+ """+ where bootfileDeclarations = Java2Haskell.classBootDecl classInfo clazz+ bootfileImports = Java2Haskell.classBootImports classInfo clazz+ bootfileExports = Java2Haskell.classBootExports classInfo clazz+++printJavaClassModule' :: JavaClass -- The Java class+ -> String -- The Haskell module name of the Java class+ -> Map String JavaClass -- Info about all classes+ -> String+-- ^ +printJavaClassModule' clazz modName classInfo = """+ {-# LANGUAGE Haskell2010, TypeFamilies #-}+ -- hidden @#{className clazz}@+ module #{modName}__ (+ #{moduleExports}\+ info'+ ) where+ #{imports}+ #{bootfileImports}+ #{moduleImports}+ info' = #{show $ classInfo' clazz}+ #{bootfileDeclarations}+ #{moduleDeclarations}+ """+ where bootfileDeclarations = Java2Haskell.classBootDecl' classInfo clazz+ bootfileImports = Java2Haskell.classBootImports' classInfo clazz+ moduleDeclarations = Java2Haskell.classModDecl' classInfo clazz+ moduleImports = Java2Haskell.classModImports' classInfo clazz+ moduleExports = Java2Haskell.classModExports' classInfo clazz+++printJavaClassBootfile' :: JavaClass -- The Java class+ -> String -- The Haskell module name of the Java class+ -> Map String JavaClass -- Info about all classes+ -> String+-- ^ +printJavaClassBootfile' clazz modName classInfo = """+ {-# LANGUAGE Haskell2010 #-}+ -- hidden Bootfile for class #{className clazz}+ module #{modName}__ (+ #{bootfileExports}\+ info'+ ) where+ #{imports}+ #{bootfileImports}+ info' :: #{classInfoSignature}+ #{bootfileDeclarations}+ """+ where bootfileDeclarations = Java2Haskell.classBootDecl' classInfo clazz+ bootfileImports = Java2Haskell.classBootImports' classInfo clazz+ bootfileExports = Java2Haskell.classBootExports' classInfo clazz+++reflectJavaClasses :: [String]+ -> Java [JavaClass]+-- ^ Retrieve information about the given Java classes+-- from the Java Virtual Machine.+reflectJavaClasses = ReflectJava.reflectClasses+++findJavaClasses :: Word32 -- Maximum depth for following dependencies.+ -> [String]+ -> Java [String]+-- ^ Find all classes that the given classes depend on.+--+-- In order to provide proper bindings for a class, bindings+-- for all classes which a class depends on need to exist too.+-- A class depends on all classes which it inherits from or+-- which are used as arguments, return types, or parameters.+--+-- This functions returns all the class names of the classes+-- on which the given classes depend on. No duplicates are+-- reported and the resulting list is sorted.+findJavaClasses = ReflectJava.findClasses+++++++++++++
+ src/Foreign/Java/Bindings/Haskell2Java.hss view
@@ -0,0 +1,7 @@+{-# LANGUAGE Haskell2010+ #-}++module Foreign.Java.Bindings.Haskell2Java where+++
+ src/Foreign/Java/Bindings/HaskellTypes.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE Haskell2010 #-}+++module Foreign.Java.Bindings.HaskellTypes where+++data HaskellModule = HaskellModule {+ moduleName :: String,+ moduleFunctions :: [HaskellFunction],+ moduleData :: [HaskellData]+ + } deriving (Show, Eq)+++data HaskellData = HaskellData {+ dataName :: String,+ dataConstructors :: [HaskellConstructor]+ + + } deriving (Show, Eq)+++data HaskellFunction = HaskellFunction {+ functionName :: String,+ functionArgs :: [HaskellType],+ functionReturn :: HaskellType+ + } deriving (Show, Eq)+++data HaskellConstructor = HaskellConstructor {+ constructorName :: String,+ constructorField :: (String, HaskellType)+ + } deriving (Show, Eq)+++data HaskellType = HaskellType {++ } deriving (Show, Eq)+++
+ src/Foreign/Java/Bindings/Java2Haskell.hss view
@@ -0,0 +1,284 @@+{-# LANGUAGE Haskell2010 #-}++module Foreign.Java.Bindings.Java2Haskell where++import Foreign.Java.Util+import Foreign.Java.Utils+import Foreign.Java.Bindings.JavaTypes+import Foreign.Java.Bindings.Typomatic+import Data.Map (Map)++import Data.Function++import qualified Data.Char as Char+import qualified Data.List as List+import qualified Data.Set as Set+import qualified Data.Map as Map++import qualified Data.List.HIUtils as HI++import Control.Arrow++pkgModExports :: Map String JavaClass -> [JavaClass] -> String+pkgModExports info classes = concatMap (\(t, b) -> """ -- * #{show t}s\n#{b}""")+ $ map (second $ concatMap format)+ $ HI.aggregateAL+ $ zip (map classType classes) classes+ where+ format clazz =+ let haskName = takeClassName $ classModName clazz+ javaName = className clazz+ dataDecl = if classIface clazz then "" else+ """ #{dataTName haskName} (..),\n"""+ in """+ -- ** #{show $ classType clazz} #{javaName}+ -- | For constructors, methods, and so on, see: "#{classModName clazz}".+ #{tyclTName haskName},+ #{dataDecl}\+ #{newtTName haskName} #{if classEnum clazz then "(..)" else ""},+ """+++pkgModImports :: Map String JavaClass -> [JavaClass] -> String+pkgModImports info classes = concatMap (format . classModName) classes+ where format modName = """import #{modName}__ hiding (info')\n"""+++pkgModDecl :: Map String JavaClass -> [JavaClass] -> String+pkgModDecl info classes = ""+++-- Modules and Boot files+ +classBootExports :: Map String JavaClass -> JavaClass -> String+classBootExports info clazz = ""+++classBootImports :: Map String JavaClass -> JavaClass -> String+classBootImports info clazz = ""+++classModImports :: Map String JavaClass -> JavaClass -> String+classModImports info clazz = concatMap format references+ where+ format package = """import qualified #{package}\n"""+ references = Set.toList+ $ Set.map (fst . splitClassName . classModName . check . flip Map.lookup info)+ $ Set.fromList (classFullName clazz : dependencies)+ dependencies = classDependencies clazz+ check = maybe (error """+ classModImports in Foreign.Java.Bindings.Java2Haskell \+ - class definition not found""") id+++classBootDecl :: Map String JavaClass -> JavaClass -> String+classBootDecl info clazz = """+ """++classModExports :: Map String JavaClass -> JavaClass -> String+classModExports info clazz = " -- * Methods\n" ++ concatMap methodExport methodNames+ where+ methods = List.sortBy (compare `on` methodName) (classMethods clazz)+ methodNames = mkMethodNames methods+ methodExport name = name ++ ", \n"+++classModDecl :: Map String JavaClass -> JavaClass -> String+classModDecl info clazz = concatMap methodDecl $ zip methodNames methods+ where+ methods = List.sortBy (compare `on` methodName) (classMethods clazz)+ methodNames = mkMethodNames methods+ methodDecl (name, method)+ | arrayTypes = """+ #{name} :: #{signature}+ #{name} = Prelude.undefined+ """+ | otherwise = """+ #{haddock}+ #{name} :: #{signature}+ #{name}#{argsDecl} = do+ (Prelude.Just clazz) <- JNI.getClass "#{classFullName clazz}"+ (Prelude.Just method) <- clazz `JNI.#{getMethod}` #{jniSignature}+ #{thisArg}\+ #{readArgs}\+ result <- JNI.#{callMethod} method #{argsRefs}+ #{convertResult} result+ """+ where+ arrayTypes+-- | any isArrayType (methodParams method) = True+ | (Just ret) <- methodReturnType method = isArrayType ret+ | otherwise = False+ isArrayType x = case x of JArr _ -> True ; _ -> False+ isStatic = methodStatic method+ javaSignature = fJavaSignature argsInfo+ javaReturnType = fJavaReturnType argsInfo+ jniSignature = fJniSignature argsInfo+ signature = fSignature argsInfo+ getMethod = if isStatic then "getStaticMethod" else "getMethod"+ callMethod = if isStatic then "callStaticMethodE" else "callMethodE"+ args = fArgNames argsInfo+ argsNotThis = (if isStatic then id else tail) args+ argsInfo = runTypomatic info (typomatic clazz method)+ argsDecl = concatMap (' ':) args+ argsRefs = concatMap (++ "' ") args+ haddock = """+ -- | @#{if isStatic then "static " else "virtual "}\+ #{if methodSynchronized method then "synchronized " else ""}\+ #{if methodNative method then "native " else ""}\+ #{if methodFinal method then "final " else ""}\+ #{javaSignature} -> #{javaReturnType}@"""+ thisArg = if isStatic then "" else """ #{head args}' <- JNI.asObject #{head args}\n"""+ readArgs = concatMap ((" " ++). uncurry readArg) (zip argsNotThis (methodParams method))+ readArg name jtype = case jtype of+ JBoolean -> """#{name}' <- JNIS.toBoolean #{name}\n"""+ JChar -> """#{name}' <- JNIS.toChar #{name}\n"""+ JByte -> """#{name}' <- JNIS.toByte #{name}\n"""+ JShort -> """#{name}' <- JNIS.toShort #{name}\n"""+ JInt -> """#{name}' <- JNIS.toInt #{name}\n"""+ JLong -> """#{name}' <- JNIS.toLong #{name}\n"""+ JFloat -> """#{name}' <- JNIS.toFloat #{name}\n"""+ JDouble -> """#{name}' <- JNIS.toDouble #{name}\n"""+ JObj _ -> """#{name}' <- Prelude.Just <$> JNI.asObject #{name}\n"""+ JArr _ -> """#{name}' <- JNIS.asMaybeArrayObject #{name}\n"""+ convertResult = ("JNIS." ++) $ case methodReturnType method of+ Nothing -> "toVoidResult"+ Just t -> case t of+ JBoolean -> "toBooleanResult"+ JChar -> "toCharResult"+ JByte -> "toByteResult"+ JShort -> "toShortResult"+ JInt -> "toIntResult"+ JLong -> "toLongResult"+ JFloat -> "toFloatResult"+ JDouble -> "toDoubleResult"+ JObj n -> "toObjectResult"+ JArr c -> "toArrayResult"++ ++mkMethodNames :: [JavaMethod] -> [String]+mkMethodNames = concatMap (zipWith (flip (++)) (iterate (++"'") ""))+ . List.group . map sanitize . map methodName+ where+ sanitize name+ | Char.isUpper (head name) = '_' : name+ | name `elem` haskellKeywords = name ++ "'"+ | otherwise = name+++-- Hidden Modules and Boot files+++classModExports' :: Map String JavaClass -> JavaClass -> String+classModExports' info clazz = """+ #{tyclTName haskName},+ #{dataTName haskName} (..),+ #{newtTName haskName} #{if classEnum clazz then "(..)" else ""},+ """+ where+ haskName = takeClassName $ classModName clazz+ javaName = className clazz+++classBootExports' :: Map String JavaClass -> JavaClass -> String+classBootExports' info clazz = """+ #{tyclTName haskName},+ #{dataTName haskName} (..),+ #{newtTName haskName},+ """+ where+ haskName = takeClassName $ classModName clazz+ javaName = className clazz+++classBootImports' :: Map String JavaClass -> JavaClass -> String+classBootImports' info clazz+ = concatMap (format . classModName) supertypes+ where+ format modName = """import qualified #{modName}__\n"""+ supertypes = map (check . flip Map.lookup info)+ $ Set.toList+ $ Set.fromList (classParents clazz ++ classIfaces clazz)+ check = maybe (error """+ classBootImports' in Foreign.Java.Bindings.Java2Haskell \+ - class definition not found""") id+++classModImports' :: Map String JavaClass -> JavaClass -> String+classModImports' info clazz = ""+++classBootDecl' :: Map String JavaClass -> JavaClass -> String+classBootDecl' info clazz+ | classEnum clazz = """+ class #{tyclTDecl}+ data #{newtTDecl} = #{enumConstants}+ data #{dataTDecl} = #{dataCDecl}+ """+ | otherwise = """+ class #{tyclTDecl}+ newtype #{newtTDecl} = #{newtCDecl} JNI.JObject+ data #{dataTDecl} = #{dataCDecl}+ """+ where baseName = takeClassName $ classModName clazz+ params = concatMap (\(p:ps) -> ' ' : Char.toLower p : ps)+ $ map (tyVarName . paramName) $ classTypeParams clazz+ newtTDecl = newtTName baseName ++ params+ newtCDecl = newtCName baseName+ dataTDecl = dataTName baseName ++ params+ dataCDecl = dataCName baseName ++ params+ tyclTDecl = """(JNI.JavaObject this#{context}) => #{tyclTName baseName} this"""+ context = concatMap parentContext (classParents clazz)+ parentContext parent = """, #{qualifiedName} this"""+ where parentClass = info Map.! parent+ modName = classModName parentClass+ qualifiedName = modName ++ "__." ++ (tyclTName $ takeClassName modName)+ enumConstants = concat $ List.intersperse " | " $ map sanitize $ map snd $ classEnumConstants clazz+ where sanitize (x:xs) = Char.toUpper x : xs+++classModDecl' :: Map String JavaClass -> JavaClass -> String+classModDecl' info clazz+ | classEnum clazz = """+ instance JNI.JavaObject (#{newtTDecl}) where+ asObject = Prelude.undefined+ instance #{tyclTName baseName} (#{newtTDecl})+ instance JNIS.InstanceOf (#{dataTDecl}) where+ type CoercedType (#{dataTDecl}) = (#{newtTDecl})+ #{instances}+ """+ | otherwise = """+ instance JNI.JavaObject (#{newtTDecl}) where+ asObject (#{newtCName baseName} obj) = return obj+ instance JNIS.UnsafeCast (#{newtTDecl}) where+ unsafeFromJObject obj = return (#{newtCDecl} obj)+ instance #{tyclTName baseName} (#{newtTDecl})+ instance JNIS.InstanceOf (#{dataTDecl}) where+ type CoercedType (#{dataTDecl}) = (#{newtTDecl})+ coerce o t = do+ obj <- JNI.asObject o+ (Prelude.Just clazz) <- JNI.getClass "#{fullClassName}"+ isInstanceOf <- obj `JNI.isInstanceOf` clazz+ if isInstanceOf+ then Prelude.Just <$> (JNIS.unsafeFromJObject obj)+ else return Prelude.Nothing+ #{instances}+ """+ where fullClassName = classFullName clazz+ baseName = takeClassName $ classModName clazz+ params = concatMap (\(p:ps) -> ' ' : Char.toLower p : ps)+ $ map (tyVarName . paramName) $ classTypeParams clazz+ newtTDecl = newtTName baseName ++ params+ newtCDecl = newtCName baseName+ dataTDecl = dataTName baseName ++ params+ dataCDecl = dataCName baseName ++ params+ instances = concatMap parentInstance (classParents clazz)+ parentInstance parent = """+ instance #{qualifiedName} (#{newtTDecl})+ """+ where parentClass = info Map.! parent+ modName = classModName parentClass+ qualifiedName = modName ++ "__." ++ (tyclTName $ takeClassName modName)++
+ src/Foreign/Java/Bindings/JavaSE6.hs view
@@ -0,0 +1,3800 @@+{-# LANGUAGE Haskell2010 #-}++module Foreign.Java.Bindings.JavaSE6 where++javaClassesSE6+ = [ "java.applet.Applet"+ , "java.applet.AppletContext"+ , "java.applet.AppletStub"+ , "java.applet.AudioClip"+ , "java.awt.AWTError"+ , "java.awt.AWTEvent"+ , "java.awt.AWTEventMulticaster"+ , "java.awt.AWTException"+ , "java.awt.AWTKeyStroke"+ , "java.awt.AWTPermission"+ , "java.awt.ActiveEvent"+ , "java.awt.Adjustable"+ , "java.awt.AlphaComposite"+ , "java.awt.BasicStroke"+ , "java.awt.BorderLayout"+ , "java.awt.BufferCapabilities"+ , "java.awt.BufferCapabilities$FlipContents"+ , "java.awt.Button"+ , "java.awt.Canvas"+ , "java.awt.CardLayout"+ , "java.awt.Checkbox"+ , "java.awt.CheckboxGroup"+ , "java.awt.CheckboxMenuItem"+ , "java.awt.Choice"+ , "java.awt.Color"+ , "java.awt.Component"+ , "java.awt.Component$BaselineResizeBehavior"+ , "java.awt.ComponentOrientation"+ , "java.awt.Composite"+ , "java.awt.CompositeContext"+ , "java.awt.Container"+ , "java.awt.ContainerOrderFocusTraversalPolicy"+ , "java.awt.Cursor"+ , "java.awt.DefaultFocusTraversalPolicy"+ , "java.awt.DefaultKeyboardFocusManager"+ , "java.awt.Desktop"+ , "java.awt.Desktop$Action"+ , "java.awt.Dialog"+ , "java.awt.Dialog$ModalExclusionType"+ , "java.awt.Dialog$ModalityType"+ , "java.awt.Dimension"+ , "java.awt.DisplayMode"+ , "java.awt.Event"+ , "java.awt.EventQueue"+ , "java.awt.FileDialog"+ , "java.awt.FlowLayout"+ , "java.awt.FocusTraversalPolicy"+ , "java.awt.Font"+ , "java.awt.FontFormatException"+ , "java.awt.FontMetrics"+ , "java.awt.Frame"+ , "java.awt.GradientPaint"+ , "java.awt.Graphics"+ , "java.awt.Graphics2D"+ , "java.awt.GraphicsConfigTemplate"+ , "java.awt.GraphicsConfiguration"+ , "java.awt.GraphicsDevice"+ , "java.awt.GraphicsEnvironment"+ , "java.awt.GridBagConstraints"+ , "java.awt.GridBagLayout"+ , "java.awt.GridBagLayoutInfo"+ , "java.awt.GridLayout"+ , "java.awt.HeadlessException"+ , "java.awt.IllegalComponentStateException"+ , "java.awt.Image"+ , "java.awt.ImageCapabilities"+ , "java.awt.Insets"+ , "java.awt.ItemSelectable"+ , "java.awt.JobAttributes"+ , "java.awt.JobAttributes$DefaultSelectionType"+ , "java.awt.JobAttributes$DestinationType"+ , "java.awt.JobAttributes$DialogType"+ , "java.awt.JobAttributes$MultipleDocumentHandlingType"+ , "java.awt.JobAttributes$SidesType"+ , "java.awt.KeyEventDispatcher"+ , "java.awt.KeyEventPostProcessor"+ , "java.awt.KeyboardFocusManager"+ , "java.awt.Label"+ , "java.awt.LayoutManager"+ , "java.awt.LayoutManager2"+ , "java.awt.LinearGradientPaint"+ , "java.awt.List"+ , "java.awt.MediaTracker"+ , "java.awt.Menu"+ , "java.awt.MenuBar"+ , "java.awt.MenuComponent"+ , "java.awt.MenuContainer"+ , "java.awt.MenuItem"+ , "java.awt.MenuShortcut"+ , "java.awt.MouseInfo"+ , "java.awt.MultipleGradientPaint"+ , "java.awt.MultipleGradientPaint$ColorSpaceType"+ , "java.awt.MultipleGradientPaint$CycleMethod"+ , "java.awt.PageAttributes"+ , "java.awt.PageAttributes$ColorType"+ , "java.awt.PageAttributes$MediaType"+ , "java.awt.PageAttributes$OrientationRequestedType"+ , "java.awt.PageAttributes$OriginType"+ , "java.awt.PageAttributes$PrintQualityType"+ , "java.awt.Paint"+ , "java.awt.PaintContext"+ , "java.awt.Panel"+ , "java.awt.Point"+ , "java.awt.PointerInfo"+ , "java.awt.Polygon"+ , "java.awt.PopupMenu"+ , "java.awt.PrintGraphics"+ , "java.awt.PrintJob"+ , "java.awt.RadialGradientPaint"+ , "java.awt.Rectangle"+ , "java.awt.RenderingHints"+ , "java.awt.RenderingHints$Key"+ , "java.awt.Robot"+ , "java.awt.ScrollPane"+ , "java.awt.ScrollPaneAdjustable"+ , "java.awt.Scrollbar"+ , "java.awt.Shape"+ , "java.awt.SplashScreen"+ , "java.awt.Stroke"+ , "java.awt.SystemColor"+ , "java.awt.SystemTray"+ , "java.awt.TextArea"+ , "java.awt.TextComponent"+ , "java.awt.TextField"+ , "java.awt.TexturePaint"+ , "java.awt.Toolkit"+ , "java.awt.Transparency"+ , "java.awt.TrayIcon"+ , "java.awt.TrayIcon$MessageType"+ , "java.awt.Window"+ , "java.awt.color.CMMException"+ , "java.awt.color.ColorSpace"+ , "java.awt.color.ICC_ColorSpace"+ , "java.awt.color.ICC_Profile"+ , "java.awt.color.ICC_ProfileGray"+ , "java.awt.color.ICC_ProfileRGB"+ , "java.awt.color.ProfileDataException"+ , "java.awt.datatransfer.Clipboard"+ , "java.awt.datatransfer.ClipboardOwner"+ , "java.awt.datatransfer.DataFlavor"+ , "java.awt.datatransfer.FlavorEvent"+ , "java.awt.datatransfer.FlavorListener"+ , "java.awt.datatransfer.FlavorMap"+ , "java.awt.datatransfer.FlavorTable"+ , "java.awt.datatransfer.MimeTypeParseException"+ , "java.awt.datatransfer.StringSelection"+ , "java.awt.datatransfer.SystemFlavorMap"+ , "java.awt.datatransfer.Transferable"+ , "java.awt.datatransfer.UnsupportedFlavorException"+ , "java.awt.dnd.Autoscroll"+ , "java.awt.dnd.DnDConstants"+ , "java.awt.dnd.DragGestureEvent"+ , "java.awt.dnd.DragGestureListener"+ , "java.awt.dnd.DragGestureRecognizer"+ , "java.awt.dnd.DragSource"+ , "java.awt.dnd.DragSourceAdapter"+ , "java.awt.dnd.DragSourceContext"+ , "java.awt.dnd.DragSourceDragEvent"+ , "java.awt.dnd.DragSourceDropEvent"+ , "java.awt.dnd.DragSourceEvent"+ , "java.awt.dnd.DragSourceListener"+ , "java.awt.dnd.DragSourceMotionListener"+ , "java.awt.dnd.DropTarget"+ , "java.awt.dnd.DropTarget$DropTargetAutoScroller"+ , "java.awt.dnd.DropTargetAdapter"+ , "java.awt.dnd.DropTargetContext"+ , "java.awt.dnd.DropTargetDragEvent"+ , "java.awt.dnd.DropTargetDropEvent"+ , "java.awt.dnd.DropTargetEvent"+ , "java.awt.dnd.DropTargetListener"+ , "java.awt.dnd.InvalidDnDOperationException"+ , "java.awt.dnd.MouseDragGestureRecognizer"+ , "java.awt.event.AWTEventListener"+ , "java.awt.event.AWTEventListenerProxy"+ , "java.awt.event.ActionEvent"+ , "java.awt.event.ActionListener"+ , "java.awt.event.AdjustmentEvent"+ , "java.awt.event.AdjustmentListener"+ , "java.awt.event.ComponentAdapter"+ , "java.awt.event.ComponentEvent"+ , "java.awt.event.ComponentListener"+ , "java.awt.event.ContainerAdapter"+ , "java.awt.event.ContainerEvent"+ , "java.awt.event.ContainerListener"+ , "java.awt.event.FocusAdapter"+ , "java.awt.event.FocusEvent"+ , "java.awt.event.FocusListener"+ , "java.awt.event.HierarchyBoundsAdapter"+ , "java.awt.event.HierarchyBoundsListener"+ , "java.awt.event.HierarchyEvent"+ , "java.awt.event.HierarchyListener"+ , "java.awt.event.InputEvent"+ , "java.awt.event.InputMethodEvent"+ , "java.awt.event.InputMethodListener"+ , "java.awt.event.InvocationEvent"+ , "java.awt.event.ItemEvent"+ , "java.awt.event.ItemListener"+ , "java.awt.event.KeyAdapter"+ , "java.awt.event.KeyEvent"+ , "java.awt.event.KeyListener"+ , "java.awt.event.MouseAdapter"+ , "java.awt.event.MouseEvent"+ , "java.awt.event.MouseListener"+ , "java.awt.event.MouseMotionAdapter"+ , "java.awt.event.MouseMotionListener"+ , "java.awt.event.MouseWheelEvent"+ , "java.awt.event.MouseWheelListener"+ , "java.awt.event.PaintEvent"+ , "java.awt.event.TextEvent"+ , "java.awt.event.TextListener"+ , "java.awt.event.WindowAdapter"+ , "java.awt.event.WindowEvent"+ , "java.awt.event.WindowFocusListener"+ , "java.awt.event.WindowListener"+ , "java.awt.event.WindowStateListener"+ , "java.awt.font.FontRenderContext"+ , "java.awt.font.GlyphJustificationInfo"+ , "java.awt.font.GlyphMetrics"+ , "java.awt.font.GlyphVector"+ , "java.awt.font.GraphicAttribute"+ , "java.awt.font.ImageGraphicAttribute"+ , "java.awt.font.LayoutPath"+ , "java.awt.font.LineBreakMeasurer"+ , "java.awt.font.LineMetrics"+ , "java.awt.font.MultipleMaster"+ , "java.awt.font.NumericShaper"+ , "java.awt.font.OpenType"+ , "java.awt.font.ShapeGraphicAttribute"+ , "java.awt.font.TextAttribute"+ , "java.awt.font.TextHitInfo"+ , "java.awt.font.TextLayout"+ , "java.awt.font.TextLayout$CaretPolicy"+ , "java.awt.font.TextMeasurer"+ , "java.awt.font.TransformAttribute"+ , "java.awt.geom.AffineTransform"+ , "java.awt.geom.Arc2D"+ , "java.awt.geom.Arc2D$Double"+ , "java.awt.geom.Arc2D$Float"+ , "java.awt.geom.Area"+ , "java.awt.geom.CubicCurve2D"+ , "java.awt.geom.CubicCurve2D$Double"+ , "java.awt.geom.CubicCurve2D$Float"+ , "java.awt.geom.Dimension2D"+ , "java.awt.geom.Ellipse2D"+ , "java.awt.geom.Ellipse2D$Double"+ , "java.awt.geom.Ellipse2D$Float"+ , "java.awt.geom.FlatteningPathIterator"+ , "java.awt.geom.GeneralPath"+ , "java.awt.geom.IllegalPathStateException"+ , "java.awt.geom.Line2D"+ , "java.awt.geom.Line2D$Double"+ , "java.awt.geom.Line2D$Float"+ , "java.awt.geom.NoninvertibleTransformException"+ , "java.awt.geom.Path2D"+ , "java.awt.geom.Path2D$Double"+ , "java.awt.geom.Path2D$Float"+ , "java.awt.geom.PathIterator"+ , "java.awt.geom.Point2D"+ , "java.awt.geom.Point2D$Double"+ , "java.awt.geom.Point2D$Float"+ , "java.awt.geom.QuadCurve2D"+ , "java.awt.geom.QuadCurve2D$Double"+ , "java.awt.geom.QuadCurve2D$Float"+ , "java.awt.geom.Rectangle2D"+ , "java.awt.geom.Rectangle2D$Double"+ , "java.awt.geom.Rectangle2D$Float"+ , "java.awt.geom.RectangularShape"+ , "java.awt.geom.RoundRectangle2D"+ , "java.awt.geom.RoundRectangle2D$Double"+ , "java.awt.geom.RoundRectangle2D$Float"+ , "java.awt.im.InputContext"+ , "java.awt.im.InputMethodHighlight"+ , "java.awt.im.InputMethodRequests"+ , "java.awt.im.InputSubset"+ , "java.awt.im.spi.InputMethod"+ , "java.awt.im.spi.InputMethodContext"+ , "java.awt.im.spi.InputMethodDescriptor"+ , "java.awt.image.AffineTransformOp"+ , "java.awt.image.AreaAveragingScaleFilter"+ , "java.awt.image.BandCombineOp"+ , "java.awt.image.BandedSampleModel"+ , "java.awt.image.BufferStrategy"+ , "java.awt.image.BufferedImage"+ , "java.awt.image.BufferedImageFilter"+ , "java.awt.image.BufferedImageOp"+ , "java.awt.image.ByteLookupTable"+ , "java.awt.image.ColorConvertOp"+ , "java.awt.image.ColorModel"+ , "java.awt.image.ComponentColorModel"+ , "java.awt.image.ComponentSampleModel"+ , "java.awt.image.ConvolveOp"+ , "java.awt.image.CropImageFilter"+ , "java.awt.image.DataBuffer"+ , "java.awt.image.DataBufferByte"+ , "java.awt.image.DataBufferDouble"+ , "java.awt.image.DataBufferFloat"+ , "java.awt.image.DataBufferInt"+ , "java.awt.image.DataBufferShort"+ , "java.awt.image.DataBufferUShort"+ , "java.awt.image.DirectColorModel"+ , "java.awt.image.FilteredImageSource"+ , "java.awt.image.ImageConsumer"+ , "java.awt.image.ImageFilter"+ , "java.awt.image.ImageObserver"+ , "java.awt.image.ImageProducer"+ , "java.awt.image.ImagingOpException"+ , "java.awt.image.IndexColorModel"+ , "java.awt.image.Kernel"+ , "java.awt.image.LookupOp"+ , "java.awt.image.LookupTable"+ , "java.awt.image.MemoryImageSource"+ , "java.awt.image.MultiPixelPackedSampleModel"+ , "java.awt.image.PackedColorModel"+ , "java.awt.image.PixelGrabber"+ , "java.awt.image.PixelInterleavedSampleModel"+ , "java.awt.image.RGBImageFilter"+ , "java.awt.image.Raster"+ , "java.awt.image.RasterFormatException"+ , "java.awt.image.RasterOp"+ , "java.awt.image.RenderedImage"+ , "java.awt.image.ReplicateScaleFilter"+ , "java.awt.image.RescaleOp"+ , "java.awt.image.SampleModel"+ , "java.awt.image.ShortLookupTable"+ , "java.awt.image.SinglePixelPackedSampleModel"+ , "java.awt.image.TileObserver"+ , "java.awt.image.VolatileImage"+ , "java.awt.image.WritableRaster"+ , "java.awt.image.WritableRenderedImage"+ , "java.awt.image.renderable.ContextualRenderedImageFactory"+ , "java.awt.image.renderable.ParameterBlock"+ , "java.awt.image.renderable.RenderContext"+ , "java.awt.image.renderable.RenderableImage"+ , "java.awt.image.renderable.RenderableImageOp"+ , "java.awt.image.renderable.RenderableImageProducer"+ , "java.awt.image.renderable.RenderedImageFactory"+ , "java.awt.print.Book"+ , "java.awt.print.PageFormat"+ , "java.awt.print.Pageable"+ , "java.awt.print.Paper"+ , "java.awt.print.Printable"+ , "java.awt.print.PrinterAbortException"+ , "java.awt.print.PrinterException"+ , "java.awt.print.PrinterGraphics"+ , "java.awt.print.PrinterIOException"+ , "java.awt.print.PrinterJob"+ , "java.beans.AppletInitializer"+ , "java.beans.BeanDescriptor"+ , "java.beans.BeanInfo"+ , "java.beans.Beans"+ , "java.beans.ConstructorProperties"+ , "java.beans.Customizer"+ , "java.beans.DefaultPersistenceDelegate"+ , "java.beans.DesignMode"+ , "java.beans.Encoder"+ , "java.beans.EventHandler"+ , "java.beans.EventSetDescriptor"+ , "java.beans.ExceptionListener"+ , "java.beans.Expression"+ , "java.beans.FeatureDescriptor"+ , "java.beans.IndexedPropertyChangeEvent"+ , "java.beans.IndexedPropertyDescriptor"+ , "java.beans.IntrospectionException"+ , "java.beans.Introspector"+ , "java.beans.MethodDescriptor"+ , "java.beans.ParameterDescriptor"+ , "java.beans.PersistenceDelegate"+ , "java.beans.PropertyChangeEvent"+ , "java.beans.PropertyChangeListener"+ , "java.beans.PropertyChangeListenerProxy"+ , "java.beans.PropertyChangeSupport"+ , "java.beans.PropertyDescriptor"+ , "java.beans.PropertyEditor"+ , "java.beans.PropertyEditorManager"+ , "java.beans.PropertyEditorSupport"+ , "java.beans.PropertyVetoException"+ , "java.beans.SimpleBeanInfo"+ , "java.beans.Statement"+ , "java.beans.VetoableChangeListener"+ , "java.beans.VetoableChangeListenerProxy"+ , "java.beans.VetoableChangeSupport"+ , "java.beans.Visibility"+ , "java.beans.XMLDecoder"+ , "java.beans.XMLEncoder"+ , "java.beans.beancontext.BeanContext"+ , "java.beans.beancontext.BeanContextChild"+ , "java.beans.beancontext.BeanContextChildComponentProxy"+ , "java.beans.beancontext.BeanContextChildSupport"+ , "java.beans.beancontext.BeanContextContainerProxy"+ , "java.beans.beancontext.BeanContextEvent"+ , "java.beans.beancontext.BeanContextMembershipEvent"+ , "java.beans.beancontext.BeanContextMembershipListener"+ , "java.beans.beancontext.BeanContextProxy"+ , "java.beans.beancontext.BeanContextServiceAvailableEvent"+ , "java.beans.beancontext.BeanContextServiceProvider"+ , "java.beans.beancontext.BeanContextServiceProviderBeanInfo"+ , "java.beans.beancontext.BeanContextServiceRevokedEvent"+ , "java.beans.beancontext.BeanContextServiceRevokedListener"+ , "java.beans.beancontext.BeanContextServices"+ , "java.beans.beancontext.BeanContextServicesListener"+ , "java.beans.beancontext.BeanContextServicesSupport"+ , "java.beans.beancontext.BeanContextServicesSupport$BCSSServiceProvider"+ , "java.beans.beancontext.BeanContextSupport"+ , "java.beans.beancontext.BeanContextSupport$BCSIterator"+ , "java.io.BufferedInputStream"+ , "java.io.BufferedOutputStream"+ , "java.io.BufferedReader"+ , "java.io.BufferedWriter"+ , "java.io.ByteArrayInputStream"+ , "java.io.ByteArrayOutputStream"+ , "java.io.CharArrayReader"+ , "java.io.CharArrayWriter"+ , "java.io.CharConversionException"+ , "java.io.Closeable"+ , "java.io.Console"+ , "java.io.DataInput"+ , "java.io.DataInputStream"+ , "java.io.DataOutput"+ , "java.io.DataOutputStream"+ , "java.io.EOFException"+ , "java.io.Externalizable"+ , "java.io.File"+ , "java.io.FileDescriptor"+ , "java.io.FileFilter"+ , "java.io.FileInputStream"+ , "java.io.FileNotFoundException"+ , "java.io.FileOutputStream"+ , "java.io.FilePermission"+ , "java.io.FileReader"+ , "java.io.FileWriter"+ , "java.io.FilenameFilter"+ , "java.io.FilterInputStream"+ , "java.io.FilterOutputStream"+ , "java.io.FilterReader"+ , "java.io.FilterWriter"+ , "java.io.Flushable"+ , "java.io.IOError"+ , "java.io.IOException"+ , "java.io.InputStream"+ , "java.io.InputStreamReader"+ , "java.io.InterruptedIOException"+ , "java.io.InvalidClassException"+ , "java.io.InvalidObjectException"+ , "java.io.LineNumberInputStream"+ , "java.io.LineNumberReader"+ , "java.io.NotActiveException"+ , "java.io.NotSerializableException"+ , "java.io.ObjectInput"+ , "java.io.ObjectInputStream"+ , "java.io.ObjectInputStream$GetField"+ , "java.io.ObjectInputValidation"+ , "java.io.ObjectOutput"+ , "java.io.ObjectOutputStream"+ , "java.io.ObjectOutputStream$PutField"+ , "java.io.ObjectStreamClass"+ , "java.io.ObjectStreamConstants"+ , "java.io.ObjectStreamException"+ , "java.io.ObjectStreamField"+ , "java.io.OptionalDataException"+ , "java.io.OutputStream"+ , "java.io.OutputStreamWriter"+ , "java.io.PipedInputStream"+ , "java.io.PipedOutputStream"+ , "java.io.PipedReader"+ , "java.io.PipedWriter"+ , "java.io.PrintStream"+ , "java.io.PrintWriter"+ , "java.io.PushbackInputStream"+ , "java.io.PushbackReader"+ , "java.io.RandomAccessFile"+ , "java.io.Reader"+ , "java.io.SequenceInputStream"+ , "java.io.Serializable"+ , "java.io.SerializablePermission"+ , "java.io.StreamCorruptedException"+ , "java.io.StreamTokenizer"+ , "java.io.StringBufferInputStream"+ , "java.io.StringReader"+ , "java.io.StringWriter"+ , "java.io.SyncFailedException"+ , "java.io.UTFDataFormatException"+ , "java.io.UnsupportedEncodingException"+ , "java.io.WriteAbortedException"+ , "java.io.Writer"+ , "java.lang.AbstractMethodError"+ , "java.lang.Appendable"+ , "java.lang.ArithmeticException"+ , "java.lang.ArrayIndexOutOfBoundsException"+ , "java.lang.ArrayStoreException"+ , "java.lang.AssertionError"+ , "java.lang.Boolean"+ , "java.lang.Byte"+ , "java.lang.CharSequence"+ , "java.lang.Character"+ , "java.lang.Character$Subset"+ , "java.lang.Character$UnicodeBlock"+ , "java.lang.Class"+ , "java.lang.ClassCastException"+ , "java.lang.ClassCircularityError"+ , "java.lang.ClassFormatError"+ , "java.lang.ClassLoader"+ , "java.lang.ClassNotFoundException"+ , "java.lang.CloneNotSupportedException"+ , "java.lang.Cloneable"+ , "java.lang.Comparable"+ , "java.lang.Compiler"+ , "java.lang.Deprecated"+ , "java.lang.Double"+ , "java.lang.Enum"+ , "java.lang.EnumConstantNotPresentException"+ , "java.lang.Error"+ , "java.lang.Exception"+ , "java.lang.ExceptionInInitializerError"+ , "java.lang.Float"+ , "java.lang.IllegalAccessError"+ , "java.lang.IllegalAccessException"+ , "java.lang.IllegalArgumentException"+ , "java.lang.IllegalMonitorStateException"+ , "java.lang.IllegalStateException"+ , "java.lang.IllegalThreadStateException"+ , "java.lang.IncompatibleClassChangeError"+ , "java.lang.IndexOutOfBoundsException"+ , "java.lang.InheritableThreadLocal"+ , "java.lang.InstantiationError"+ , "java.lang.InstantiationException"+ , "java.lang.Integer"+ , "java.lang.InternalError"+ , "java.lang.InterruptedException"+ , "java.lang.Iterable"+ , "java.lang.LinkageError"+ , "java.lang.Long"+ , "java.lang.Math"+ , "java.lang.NegativeArraySizeException"+ , "java.lang.NoClassDefFoundError"+ , "java.lang.NoSuchFieldError"+ , "java.lang.NoSuchFieldException"+ , "java.lang.NoSuchMethodError"+ , "java.lang.NoSuchMethodException"+ , "java.lang.NullPointerException"+ , "java.lang.Number"+ , "java.lang.NumberFormatException"+ , "java.lang.Object"+ , "java.lang.OutOfMemoryError"+ , "java.lang.Override"+ , "java.lang.Package"+ , "java.lang.Process"+ , "java.lang.ProcessBuilder"+ , "java.lang.Readable"+ , "java.lang.Runnable"+ , "java.lang.Runtime"+ , "java.lang.RuntimeException"+ , "java.lang.RuntimePermission"+ , "java.lang.SecurityException"+ , "java.lang.SecurityManager"+ , "java.lang.Short"+ , "java.lang.StackOverflowError"+ , "java.lang.StackTraceElement"+ , "java.lang.StrictMath"+ , "java.lang.String"+ , "java.lang.StringBuffer"+ , "java.lang.StringBuilder"+ , "java.lang.StringIndexOutOfBoundsException"+ , "java.lang.SuppressWarnings"+ , "java.lang.System"+ , "java.lang.Thread"+ , "java.lang.Thread$State"+ , "java.lang.Thread$UncaughtExceptionHandler"+ , "java.lang.ThreadDeath"+ , "java.lang.ThreadGroup"+ , "java.lang.ThreadLocal"+ , "java.lang.Throwable"+ , "java.lang.TypeNotPresentException"+ , "java.lang.UnknownError"+ , "java.lang.UnsatisfiedLinkError"+ , "java.lang.UnsupportedClassVersionError"+ , "java.lang.UnsupportedOperationException"+ , "java.lang.VerifyError"+ , "java.lang.VirtualMachineError"+ , "java.lang.Void"+ , "java.lang.annotation.Annotation"+ , "java.lang.annotation.AnnotationFormatError"+ , "java.lang.annotation.AnnotationTypeMismatchException"+ , "java.lang.annotation.Documented"+ , "java.lang.annotation.ElementType"+ , "java.lang.annotation.IncompleteAnnotationException"+ , "java.lang.annotation.Inherited"+ , "java.lang.annotation.Retention"+ , "java.lang.annotation.RetentionPolicy"+ , "java.lang.annotation.Target"+ , "java.lang.instrument.ClassDefinition"+ , "java.lang.instrument.ClassFileTransformer"+ , "java.lang.instrument.IllegalClassFormatException"+ , "java.lang.instrument.Instrumentation"+ , "java.lang.instrument.UnmodifiableClassException"+ , "java.lang.management.ClassLoadingMXBean"+ , "java.lang.management.CompilationMXBean"+ , "java.lang.management.GarbageCollectorMXBean"+ , "java.lang.management.LockInfo"+ , "java.lang.management.ManagementFactory"+ , "java.lang.management.ManagementPermission"+ , "java.lang.management.MemoryMXBean"+ , "java.lang.management.MemoryManagerMXBean"+ , "java.lang.management.MemoryNotificationInfo"+ , "java.lang.management.MemoryPoolMXBean"+ , "java.lang.management.MemoryType"+ , "java.lang.management.MemoryUsage"+ , "java.lang.management.MonitorInfo"+ , "java.lang.management.OperatingSystemMXBean"+ , "java.lang.management.RuntimeMXBean"+ , "java.lang.management.ThreadInfo"+ , "java.lang.management.ThreadMXBean"+ , "java.lang.ref.PhantomReference"+ , "java.lang.ref.Reference"+ , "java.lang.ref.ReferenceQueue"+ , "java.lang.ref.SoftReference"+ , "java.lang.ref.WeakReference"+ , "java.lang.reflect.AccessibleObject"+ , "java.lang.reflect.AnnotatedElement"+ , "java.lang.reflect.Array"+ , "java.lang.reflect.Constructor"+ , "java.lang.reflect.Field"+ , "java.lang.reflect.GenericArrayType"+ , "java.lang.reflect.GenericDeclaration"+ , "java.lang.reflect.GenericSignatureFormatError"+ , "java.lang.reflect.InvocationHandler"+ , "java.lang.reflect.InvocationTargetException"+ , "java.lang.reflect.MalformedParameterizedTypeException"+ , "java.lang.reflect.Member"+ , "java.lang.reflect.Method"+ , "java.lang.reflect.Modifier"+ , "java.lang.reflect.ParameterizedType"+ , "java.lang.reflect.Proxy"+ , "java.lang.reflect.ReflectPermission"+ , "java.lang.reflect.Type"+ , "java.lang.reflect.TypeVariable"+ , "java.lang.reflect.UndeclaredThrowableException"+ , "java.lang.reflect.WildcardType"+ , "java.math.BigDecimal"+ , "java.math.BigInteger"+ , "java.math.MathContext"+ , "java.math.RoundingMode"+ , "java.net.Authenticator"+ , "java.net.Authenticator$RequestorType"+ , "java.net.BindException"+ , "java.net.CacheRequest"+ , "java.net.CacheResponse"+ , "java.net.ConnectException"+ , "java.net.ContentHandler"+ , "java.net.ContentHandlerFactory"+ , "java.net.CookieHandler"+ , "java.net.CookieManager"+ , "java.net.CookiePolicy"+ , "java.net.CookieStore"+ , "java.net.DatagramPacket"+ , "java.net.DatagramSocket"+ , "java.net.DatagramSocketImpl"+ , "java.net.DatagramSocketImplFactory"+ , "java.net.FileNameMap"+ , "java.net.HttpCookie"+ , "java.net.HttpRetryException"+ , "java.net.HttpURLConnection"+ , "java.net.IDN"+ , "java.net.Inet4Address"+ , "java.net.Inet6Address"+ , "java.net.InetAddress"+ , "java.net.InetSocketAddress"+ , "java.net.InterfaceAddress"+ , "java.net.JarURLConnection"+ , "java.net.MalformedURLException"+ , "java.net.MulticastSocket"+ , "java.net.NetPermission"+ , "java.net.NetworkInterface"+ , "java.net.NoRouteToHostException"+ , "java.net.PasswordAuthentication"+ , "java.net.PortUnreachableException"+ , "java.net.ProtocolException"+ , "java.net.Proxy"+ , "java.net.Proxy$Type"+ , "java.net.ProxySelector"+ , "java.net.ResponseCache"+ , "java.net.SecureCacheResponse"+ , "java.net.ServerSocket"+ , "java.net.Socket"+ , "java.net.SocketAddress"+ , "java.net.SocketException"+ , "java.net.SocketImpl"+ , "java.net.SocketImplFactory"+ , "java.net.SocketOptions"+ , "java.net.SocketPermission"+ , "java.net.SocketTimeoutException"+ , "java.net.URI"+ , "java.net.URISyntaxException"+ , "java.net.URL"+ , "java.net.URLClassLoader"+ , "java.net.URLConnection"+ , "java.net.URLDecoder"+ , "java.net.URLEncoder"+ , "java.net.URLStreamHandler"+ , "java.net.URLStreamHandlerFactory"+ , "java.net.UnknownHostException"+ , "java.net.UnknownServiceException"+ , "java.nio.Buffer"+ , "java.nio.BufferOverflowException"+ , "java.nio.BufferUnderflowException"+ , "java.nio.ByteBuffer"+ , "java.nio.ByteOrder"+ , "java.nio.CharBuffer"+ , "java.nio.DoubleBuffer"+ , "java.nio.FloatBuffer"+ , "java.nio.IntBuffer"+ , "java.nio.InvalidMarkException"+ , "java.nio.LongBuffer"+ , "java.nio.MappedByteBuffer"+ , "java.nio.ReadOnlyBufferException"+ , "java.nio.ShortBuffer"+ , "java.nio.channels.AlreadyConnectedException"+ , "java.nio.channels.AsynchronousCloseException"+ , "java.nio.channels.ByteChannel"+ , "java.nio.channels.CancelledKeyException"+ , "java.nio.channels.Channel"+ , "java.nio.channels.Channels"+ , "java.nio.channels.ClosedByInterruptException"+ , "java.nio.channels.ClosedChannelException"+ , "java.nio.channels.ClosedSelectorException"+ , "java.nio.channels.ConnectionPendingException"+ , "java.nio.channels.DatagramChannel"+ , "java.nio.channels.FileChannel"+ , "java.nio.channels.FileChannel$MapMode"+ , "java.nio.channels.FileLock"+ , "java.nio.channels.FileLockInterruptionException"+ , "java.nio.channels.GatheringByteChannel"+ , "java.nio.channels.IllegalBlockingModeException"+ , "java.nio.channels.IllegalSelectorException"+ , "java.nio.channels.InterruptibleChannel"+ , "java.nio.channels.NoConnectionPendingException"+ , "java.nio.channels.NonReadableChannelException"+ , "java.nio.channels.NonWritableChannelException"+ , "java.nio.channels.NotYetBoundException"+ , "java.nio.channels.NotYetConnectedException"+ , "java.nio.channels.OverlappingFileLockException"+ , "java.nio.channels.Pipe"+ , "java.nio.channels.Pipe$SinkChannel"+ , "java.nio.channels.Pipe$SourceChannel"+ , "java.nio.channels.ReadableByteChannel"+ , "java.nio.channels.ScatteringByteChannel"+ , "java.nio.channels.SelectableChannel"+ , "java.nio.channels.SelectionKey"+ , "java.nio.channels.Selector"+ , "java.nio.channels.ServerSocketChannel"+ , "java.nio.channels.SocketChannel"+ , "java.nio.channels.UnresolvedAddressException"+ , "java.nio.channels.UnsupportedAddressTypeException"+ , "java.nio.channels.WritableByteChannel"+ , "java.nio.channels.spi.AbstractInterruptibleChannel"+ , "java.nio.channels.spi.AbstractSelectableChannel"+ , "java.nio.channels.spi.AbstractSelectionKey"+ , "java.nio.channels.spi.AbstractSelector"+ , "java.nio.channels.spi.SelectorProvider"+ , "java.nio.charset.CharacterCodingException"+ , "java.nio.charset.Charset"+ , "java.nio.charset.CharsetDecoder"+ , "java.nio.charset.CharsetEncoder"+ , "java.nio.charset.CoderMalfunctionError"+ , "java.nio.charset.CoderResult"+ , "java.nio.charset.CodingErrorAction"+ , "java.nio.charset.IllegalCharsetNameException"+ , "java.nio.charset.MalformedInputException"+ , "java.nio.charset.UnmappableCharacterException"+ , "java.nio.charset.UnsupportedCharsetException"+ , "java.nio.charset.spi.CharsetProvider"+ , "java.rmi.AccessException"+ , "java.rmi.AlreadyBoundException"+ , "java.rmi.ConnectException"+ , "java.rmi.ConnectIOException"+ , "java.rmi.MarshalException"+ , "java.rmi.MarshalledObject"+ , "java.rmi.Naming"+ , "java.rmi.NoSuchObjectException"+ , "java.rmi.NotBoundException"+ , "java.rmi.RMISecurityException"+ , "java.rmi.RMISecurityManager"+ , "java.rmi.Remote"+ , "java.rmi.RemoteException"+ , "java.rmi.ServerError"+ , "java.rmi.ServerException"+ , "java.rmi.ServerRuntimeException"+ , "java.rmi.StubNotFoundException"+ , "java.rmi.UnexpectedException"+ , "java.rmi.UnknownHostException"+ , "java.rmi.UnmarshalException"+ , "java.rmi.activation.Activatable"+ , "java.rmi.activation.ActivateFailedException"+ , "java.rmi.activation.ActivationDesc"+ , "java.rmi.activation.ActivationException"+ , "java.rmi.activation.ActivationGroup"+ , "java.rmi.activation.ActivationGroupDesc"+ , "java.rmi.activation.ActivationGroupDesc$CommandEnvironment"+ , "java.rmi.activation.ActivationGroupID"+ , "java.rmi.activation.ActivationGroup_Stub"+ , "java.rmi.activation.ActivationID"+ , "java.rmi.activation.ActivationInstantiator"+ , "java.rmi.activation.ActivationMonitor"+ , "java.rmi.activation.ActivationSystem"+ , "java.rmi.activation.Activator"+ , "java.rmi.activation.UnknownGroupException"+ , "java.rmi.activation.UnknownObjectException"+ , "java.rmi.dgc.DGC"+ , "java.rmi.dgc.Lease"+ , "java.rmi.dgc.VMID"+ , "java.rmi.registry.LocateRegistry"+ , "java.rmi.registry.Registry"+ , "java.rmi.registry.RegistryHandler"+ , "java.rmi.server.ExportException"+ , "java.rmi.server.LoaderHandler"+ , "java.rmi.server.LogStream"+ , "java.rmi.server.ObjID"+ , "java.rmi.server.Operation"+ , "java.rmi.server.RMIClassLoader"+ , "java.rmi.server.RMIClassLoaderSpi"+ , "java.rmi.server.RMIClientSocketFactory"+ , "java.rmi.server.RMIFailureHandler"+ , "java.rmi.server.RMIServerSocketFactory"+ , "java.rmi.server.RMISocketFactory"+ , "java.rmi.server.RemoteCall"+ , "java.rmi.server.RemoteObject"+ , "java.rmi.server.RemoteObjectInvocationHandler"+ , "java.rmi.server.RemoteRef"+ , "java.rmi.server.RemoteServer"+ , "java.rmi.server.RemoteStub"+ , "java.rmi.server.ServerCloneException"+ , "java.rmi.server.ServerNotActiveException"+ , "java.rmi.server.ServerRef"+ , "java.rmi.server.Skeleton"+ , "java.rmi.server.SkeletonMismatchException"+ , "java.rmi.server.SkeletonNotFoundException"+ , "java.rmi.server.SocketSecurityException"+ , "java.rmi.server.UID"+ , "java.rmi.server.UnicastRemoteObject"+ , "java.rmi.server.Unreferenced"+ , "java.security.AccessControlContext"+ , "java.security.AccessControlException"+ , "java.security.AccessController"+ , "java.security.AlgorithmParameterGenerator"+ , "java.security.AlgorithmParameterGeneratorSpi"+ , "java.security.AlgorithmParameters"+ , "java.security.AlgorithmParametersSpi"+ , "java.security.AllPermission"+ , "java.security.AuthProvider"+ , "java.security.BasicPermission"+ , "java.security.Certificate"+ , "java.security.CodeSigner"+ , "java.security.CodeSource"+ , "java.security.DigestException"+ , "java.security.DigestInputStream"+ , "java.security.DigestOutputStream"+ , "java.security.DomainCombiner"+ , "java.security.GeneralSecurityException"+ , "java.security.Guard"+ , "java.security.GuardedObject"+ , "java.security.Identity"+ , "java.security.IdentityScope"+ , "java.security.InvalidAlgorithmParameterException"+ , "java.security.InvalidKeyException"+ , "java.security.InvalidParameterException"+ , "java.security.Key"+ , "java.security.KeyException"+ , "java.security.KeyFactory"+ , "java.security.KeyFactorySpi"+ , "java.security.KeyManagementException"+ , "java.security.KeyPair"+ , "java.security.KeyPairGenerator"+ , "java.security.KeyPairGeneratorSpi"+ , "java.security.KeyRep"+ , "java.security.KeyRep$Type"+ , "java.security.KeyStore"+ , "java.security.KeyStore$Builder"+ , "java.security.KeyStore$CallbackHandlerProtection"+ , "java.security.KeyStore$Entry"+ , "java.security.KeyStore$LoadStoreParameter"+ , "java.security.KeyStore$PasswordProtection"+ , "java.security.KeyStore$PrivateKeyEntry"+ , "java.security.KeyStore$ProtectionParameter"+ , "java.security.KeyStore$SecretKeyEntry"+ , "java.security.KeyStore$TrustedCertificateEntry"+ , "java.security.KeyStoreException"+ , "java.security.KeyStoreSpi"+ , "java.security.MessageDigest"+ , "java.security.MessageDigestSpi"+ , "java.security.NoSuchAlgorithmException"+ , "java.security.NoSuchProviderException"+ , "java.security.Permission"+ , "java.security.PermissionCollection"+ , "java.security.Permissions"+ , "java.security.Policy"+ , "java.security.Policy$Parameters"+ , "java.security.PolicySpi"+ , "java.security.Principal"+ , "java.security.PrivateKey"+ , "java.security.PrivilegedAction"+ , "java.security.PrivilegedActionException"+ , "java.security.PrivilegedExceptionAction"+ , "java.security.ProtectionDomain"+ , "java.security.Provider"+ , "java.security.Provider$Service"+ , "java.security.ProviderException"+ , "java.security.PublicKey"+ , "java.security.SecureClassLoader"+ , "java.security.SecureRandom"+ , "java.security.SecureRandomSpi"+ , "java.security.Security"+ , "java.security.SecurityPermission"+ , "java.security.Signature"+ , "java.security.SignatureException"+ , "java.security.SignatureSpi"+ , "java.security.SignedObject"+ , "java.security.Signer"+ , "java.security.Timestamp"+ , "java.security.URIParameter"+ , "java.security.UnrecoverableEntryException"+ , "java.security.UnrecoverableKeyException"+ , "java.security.UnresolvedPermission"+ , "java.security.acl.Acl"+ , "java.security.acl.AclEntry"+ , "java.security.acl.AclNotFoundException"+ , "java.security.acl.Group"+ , "java.security.acl.LastOwnerException"+ , "java.security.acl.NotOwnerException"+ , "java.security.acl.Owner"+ , "java.security.acl.Permission"+ , "java.security.cert.CRL"+ , "java.security.cert.CRLException"+ , "java.security.cert.CRLSelector"+ , "java.security.cert.CertPath"+ , "java.security.cert.CertPath$CertPathRep"+ , "java.security.cert.CertPathBuilder"+ , "java.security.cert.CertPathBuilderException"+ , "java.security.cert.CertPathBuilderResult"+ , "java.security.cert.CertPathBuilderSpi"+ , "java.security.cert.CertPathParameters"+ , "java.security.cert.CertPathValidator"+ , "java.security.cert.CertPathValidatorException"+ , "java.security.cert.CertPathValidatorResult"+ , "java.security.cert.CertPathValidatorSpi"+ , "java.security.cert.CertSelector"+ , "java.security.cert.CertStore"+ , "java.security.cert.CertStoreException"+ , "java.security.cert.CertStoreParameters"+ , "java.security.cert.CertStoreSpi"+ , "java.security.cert.Certificate"+ , "java.security.cert.Certificate$CertificateRep"+ , "java.security.cert.CertificateEncodingException"+ , "java.security.cert.CertificateException"+ , "java.security.cert.CertificateExpiredException"+ , "java.security.cert.CertificateFactory"+ , "java.security.cert.CertificateFactorySpi"+ , "java.security.cert.CertificateNotYetValidException"+ , "java.security.cert.CertificateParsingException"+ , "java.security.cert.CollectionCertStoreParameters"+ , "java.security.cert.LDAPCertStoreParameters"+ , "java.security.cert.PKIXBuilderParameters"+ , "java.security.cert.PKIXCertPathBuilderResult"+ , "java.security.cert.PKIXCertPathChecker"+ , "java.security.cert.PKIXCertPathValidatorResult"+ , "java.security.cert.PKIXParameters"+ , "java.security.cert.PolicyNode"+ , "java.security.cert.PolicyQualifierInfo"+ , "java.security.cert.TrustAnchor"+ , "java.security.cert.X509CRL"+ , "java.security.cert.X509CRLEntry"+ , "java.security.cert.X509CRLSelector"+ , "java.security.cert.X509CertSelector"+ , "java.security.cert.X509Certificate"+ , "java.security.cert.X509Extension"+ , "java.security.interfaces.DSAKey"+ , "java.security.interfaces.DSAKeyPairGenerator"+ , "java.security.interfaces.DSAParams"+ , "java.security.interfaces.DSAPrivateKey"+ , "java.security.interfaces.DSAPublicKey"+ , "java.security.interfaces.ECKey"+ , "java.security.interfaces.ECPrivateKey"+ , "java.security.interfaces.ECPublicKey"+ , "java.security.interfaces.RSAKey"+ , "java.security.interfaces.RSAMultiPrimePrivateCrtKey"+ , "java.security.interfaces.RSAPrivateCrtKey"+ , "java.security.interfaces.RSAPrivateKey"+ , "java.security.interfaces.RSAPublicKey"+ , "java.security.spec.AlgorithmParameterSpec"+ , "java.security.spec.DSAParameterSpec"+ , "java.security.spec.DSAPrivateKeySpec"+ , "java.security.spec.DSAPublicKeySpec"+ , "java.security.spec.ECField"+ , "java.security.spec.ECFieldF2m"+ , "java.security.spec.ECFieldFp"+ , "java.security.spec.ECGenParameterSpec"+ , "java.security.spec.ECParameterSpec"+ , "java.security.spec.ECPoint"+ , "java.security.spec.ECPrivateKeySpec"+ , "java.security.spec.ECPublicKeySpec"+ , "java.security.spec.EllipticCurve"+ , "java.security.spec.EncodedKeySpec"+ , "java.security.spec.InvalidKeySpecException"+ , "java.security.spec.InvalidParameterSpecException"+ , "java.security.spec.KeySpec"+ , "java.security.spec.MGF1ParameterSpec"+ , "java.security.spec.PKCS8EncodedKeySpec"+ , "java.security.spec.PSSParameterSpec"+ , "java.security.spec.RSAKeyGenParameterSpec"+ , "java.security.spec.RSAMultiPrimePrivateCrtKeySpec"+ , "java.security.spec.RSAOtherPrimeInfo"+ , "java.security.spec.RSAPrivateCrtKeySpec"+ , "java.security.spec.RSAPrivateKeySpec"+ , "java.security.spec.RSAPublicKeySpec"+ , "java.security.spec.X509EncodedKeySpec"+ , "java.sql.Array"+ , "java.sql.BatchUpdateException"+ , "java.sql.Blob"+ , "java.sql.CallableStatement"+ , "java.sql.ClientInfoStatus"+ , "java.sql.Clob"+ , "java.sql.Connection"+ , "java.sql.DataTruncation"+ , "java.sql.DatabaseMetaData"+ , "java.sql.Date"+ , "java.sql.Driver"+ , "java.sql.DriverManager"+ , "java.sql.DriverPropertyInfo"+ , "java.sql.NClob"+ , "java.sql.ParameterMetaData"+ , "java.sql.PreparedStatement"+ , "java.sql.Ref"+ , "java.sql.ResultSet"+ , "java.sql.ResultSetMetaData"+ , "java.sql.RowId"+ , "java.sql.RowIdLifetime"+ , "java.sql.SQLClientInfoException"+ , "java.sql.SQLData"+ , "java.sql.SQLDataException"+ , "java.sql.SQLException"+ , "java.sql.SQLFeatureNotSupportedException"+ , "java.sql.SQLInput"+ , "java.sql.SQLIntegrityConstraintViolationException"+ , "java.sql.SQLInvalidAuthorizationSpecException"+ , "java.sql.SQLNonTransientConnectionException"+ , "java.sql.SQLNonTransientException"+ , "java.sql.SQLOutput"+ , "java.sql.SQLPermission"+ , "java.sql.SQLRecoverableException"+ , "java.sql.SQLSyntaxErrorException"+ , "java.sql.SQLTimeoutException"+ , "java.sql.SQLTransactionRollbackException"+ , "java.sql.SQLTransientConnectionException"+ , "java.sql.SQLTransientException"+ , "java.sql.SQLWarning"+ , "java.sql.SQLXML"+ , "java.sql.Savepoint"+ , "java.sql.Statement"+ , "java.sql.Struct"+ , "java.sql.Time"+ , "java.sql.Timestamp"+ , "java.sql.Types"+ , "java.sql.Wrapper"+ , "java.text.Annotation"+ , "java.text.AttributedCharacterIterator"+ , "java.text.AttributedCharacterIterator$Attribute"+ , "java.text.AttributedString"+ , "java.text.Bidi"+ , "java.text.BreakIterator"+ , "java.text.CharacterIterator"+ , "java.text.ChoiceFormat"+ , "java.text.CollationElementIterator"+ , "java.text.CollationKey"+ , "java.text.Collator"+ , "java.text.DateFormat"+ , "java.text.DateFormat$Field"+ , "java.text.DateFormatSymbols"+ , "java.text.DecimalFormat"+ , "java.text.DecimalFormatSymbols"+ , "java.text.FieldPosition"+ , "java.text.Format"+ , "java.text.Format$Field"+ , "java.text.MessageFormat"+ , "java.text.MessageFormat$Field"+ , "java.text.Normalizer"+ , "java.text.Normalizer$Form"+ , "java.text.NumberFormat"+ , "java.text.NumberFormat$Field"+ , "java.text.ParseException"+ , "java.text.ParsePosition"+ , "java.text.RuleBasedCollator"+ , "java.text.SimpleDateFormat"+ , "java.text.StringCharacterIterator"+ , "java.text.spi.BreakIteratorProvider"+ , "java.text.spi.CollatorProvider"+ , "java.text.spi.DateFormatProvider"+ , "java.text.spi.DateFormatSymbolsProvider"+ , "java.text.spi.DecimalFormatSymbolsProvider"+ , "java.text.spi.NumberFormatProvider"+ , "java.util.AbstractCollection"+ , "java.util.AbstractList"+ , "java.util.AbstractMap"+ , "java.util.AbstractMap$SimpleEntry"+ , "java.util.AbstractMap$SimpleImmutableEntry"+ , "java.util.AbstractQueue"+ , "java.util.AbstractSequentialList"+ , "java.util.AbstractSet"+ , "java.util.ArrayDeque"+ , "java.util.ArrayList"+ , "java.util.Arrays"+ , "java.util.BitSet"+ , "java.util.Calendar"+ , "java.util.Collection"+ , "java.util.Collections"+ , "java.util.Comparator"+ , "java.util.ConcurrentModificationException"+ , "java.util.Currency"+ , "java.util.Date"+ , "java.util.Deque"+ , "java.util.Dictionary"+ , "java.util.DuplicateFormatFlagsException"+ , "java.util.EmptyStackException"+ , "java.util.EnumMap"+ , "java.util.EnumSet"+ , "java.util.Enumeration"+ , "java.util.EventListener"+ , "java.util.EventListenerProxy"+ , "java.util.EventObject"+ , "java.util.FormatFlagsConversionMismatchException"+ , "java.util.Formattable"+ , "java.util.FormattableFlags"+ , "java.util.Formatter"+ , "java.util.Formatter$BigDecimalLayoutForm"+ , "java.util.FormatterClosedException"+ , "java.util.GregorianCalendar"+ , "java.util.HashMap"+ , "java.util.HashSet"+ , "java.util.Hashtable"+ , "java.util.IdentityHashMap"+ , "java.util.IllegalFormatCodePointException"+ , "java.util.IllegalFormatConversionException"+ , "java.util.IllegalFormatException"+ , "java.util.IllegalFormatFlagsException"+ , "java.util.IllegalFormatPrecisionException"+ , "java.util.IllegalFormatWidthException"+ , "java.util.InputMismatchException"+ , "java.util.InvalidPropertiesFormatException"+ , "java.util.Iterator"+ , "java.util.LinkedHashMap"+ , "java.util.LinkedHashSet"+ , "java.util.LinkedList"+ , "java.util.List"+ , "java.util.ListIterator"+ , "java.util.ListResourceBundle"+ , "java.util.Locale"+ , "java.util.Map"+ , "java.util.Map$Entry"+ , "java.util.MissingFormatArgumentException"+ , "java.util.MissingFormatWidthException"+ , "java.util.MissingResourceException"+ , "java.util.NavigableMap"+ , "java.util.NavigableSet"+ , "java.util.NoSuchElementException"+ , "java.util.Observable"+ , "java.util.Observer"+ , "java.util.PriorityQueue"+ , "java.util.Properties"+ , "java.util.PropertyPermission"+ , "java.util.PropertyResourceBundle"+ , "java.util.Queue"+ , "java.util.Random"+ , "java.util.RandomAccess"+ , "java.util.ResourceBundle"+ , "java.util.ResourceBundle$Control"+ , "java.util.Scanner"+ , "java.util.ServiceConfigurationError"+ , "java.util.ServiceLoader"+ , "java.util.Set"+ , "java.util.SimpleTimeZone"+ , "java.util.SortedMap"+ , "java.util.SortedSet"+ , "java.util.Stack"+ , "java.util.StringTokenizer"+ , "java.util.TimeZone"+ , "java.util.Timer"+ , "java.util.TimerTask"+ , "java.util.TooManyListenersException"+ , "java.util.TreeMap"+ , "java.util.TreeSet"+ , "java.util.UUID"+ , "java.util.UnknownFormatConversionException"+ , "java.util.UnknownFormatFlagsException"+ , "java.util.Vector"+ , "java.util.WeakHashMap"+ , "java.util.concurrent.AbstractExecutorService"+ , "java.util.concurrent.ArrayBlockingQueue"+ , "java.util.concurrent.BlockingDeque"+ , "java.util.concurrent.BlockingQueue"+ , "java.util.concurrent.BrokenBarrierException"+ , "java.util.concurrent.Callable"+ , "java.util.concurrent.CancellationException"+ , "java.util.concurrent.CompletionService"+ , "java.util.concurrent.ConcurrentHashMap"+ , "java.util.concurrent.ConcurrentLinkedQueue"+ , "java.util.concurrent.ConcurrentMap"+ , "java.util.concurrent.ConcurrentNavigableMap"+ , "java.util.concurrent.ConcurrentSkipListMap"+ , "java.util.concurrent.ConcurrentSkipListSet"+ , "java.util.concurrent.CopyOnWriteArrayList"+ , "java.util.concurrent.CopyOnWriteArraySet"+ , "java.util.concurrent.CountDownLatch"+ , "java.util.concurrent.CyclicBarrier"+ , "java.util.concurrent.DelayQueue"+ , "java.util.concurrent.Delayed"+ , "java.util.concurrent.Exchanger"+ , "java.util.concurrent.ExecutionException"+ , "java.util.concurrent.Executor"+ , "java.util.concurrent.ExecutorCompletionService"+ , "java.util.concurrent.ExecutorService"+ , "java.util.concurrent.Executors"+ , "java.util.concurrent.Future"+ , "java.util.concurrent.FutureTask"+ , "java.util.concurrent.LinkedBlockingDeque"+ , "java.util.concurrent.LinkedBlockingQueue"+ , "java.util.concurrent.PriorityBlockingQueue"+ , "java.util.concurrent.RejectedExecutionException"+ , "java.util.concurrent.RejectedExecutionHandler"+ , "java.util.concurrent.RunnableFuture"+ , "java.util.concurrent.RunnableScheduledFuture"+ , "java.util.concurrent.ScheduledExecutorService"+ , "java.util.concurrent.ScheduledFuture"+ , "java.util.concurrent.ScheduledThreadPoolExecutor"+ , "java.util.concurrent.Semaphore"+ , "java.util.concurrent.SynchronousQueue"+ , "java.util.concurrent.ThreadFactory"+ , "java.util.concurrent.ThreadPoolExecutor"+ , "java.util.concurrent.ThreadPoolExecutor$AbortPolicy"+ , "java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"+ , "java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy"+ , "java.util.concurrent.ThreadPoolExecutor$DiscardPolicy"+ , "java.util.concurrent.TimeUnit"+ , "java.util.concurrent.TimeoutException"+ , "java.util.concurrent.atomic.AtomicBoolean"+ , "java.util.concurrent.atomic.AtomicInteger"+ , "java.util.concurrent.atomic.AtomicIntegerArray"+ , "java.util.concurrent.atomic.AtomicIntegerFieldUpdater"+ , "java.util.concurrent.atomic.AtomicLong"+ , "java.util.concurrent.atomic.AtomicLongArray"+ , "java.util.concurrent.atomic.AtomicLongFieldUpdater"+ , "java.util.concurrent.atomic.AtomicMarkableReference"+ , "java.util.concurrent.atomic.AtomicReference"+ , "java.util.concurrent.atomic.AtomicReferenceArray"+ , "java.util.concurrent.atomic.AtomicReferenceFieldUpdater"+ , "java.util.concurrent.atomic.AtomicStampedReference"+ , "java.util.concurrent.locks.AbstractOwnableSynchronizer"+ , "java.util.concurrent.locks.AbstractQueuedLongSynchronizer"+ , "java.util.concurrent.locks.AbstractQueuedSynchronizer"+ , "java.util.concurrent.locks.Condition"+ , "java.util.concurrent.locks.Lock"+ , "java.util.concurrent.locks.LockSupport"+ , "java.util.concurrent.locks.ReadWriteLock"+ , "java.util.concurrent.locks.ReentrantLock"+ , "java.util.concurrent.locks.ReentrantReadWriteLock"+ , "java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock"+ , "java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock"+ , "java.util.jar.Attributes"+ , "java.util.jar.Attributes$Name"+ , "java.util.jar.JarEntry"+ , "java.util.jar.JarException"+ , "java.util.jar.JarFile"+ , "java.util.jar.JarInputStream"+ , "java.util.jar.JarOutputStream"+ , "java.util.jar.Manifest"+ , "java.util.jar.Pack200"+ , "java.util.jar.Pack200$Packer"+ , "java.util.jar.Pack200$Unpacker"+ , "java.util.logging.ConsoleHandler"+ , "java.util.logging.ErrorManager"+ , "java.util.logging.FileHandler"+ , "java.util.logging.Filter"+ , "java.util.logging.Formatter"+ , "java.util.logging.Handler"+ , "java.util.logging.Level"+ , "java.util.logging.LogManager"+ , "java.util.logging.LogRecord"+ , "java.util.logging.Logger"+ , "java.util.logging.LoggingMXBean"+ , "java.util.logging.LoggingPermission"+ , "java.util.logging.MemoryHandler"+ , "java.util.logging.SimpleFormatter"+ , "java.util.logging.SocketHandler"+ , "java.util.logging.StreamHandler"+ , "java.util.logging.XMLFormatter"+ , "java.util.prefs.AbstractPreferences"+ , "java.util.prefs.BackingStoreException"+ , "java.util.prefs.InvalidPreferencesFormatException"+ , "java.util.prefs.NodeChangeEvent"+ , "java.util.prefs.NodeChangeListener"+ , "java.util.prefs.PreferenceChangeEvent"+ , "java.util.prefs.PreferenceChangeListener"+ , "java.util.prefs.Preferences"+ , "java.util.prefs.PreferencesFactory"+ , "java.util.regex.MatchResult"+ , "java.util.regex.Matcher"+ , "java.util.regex.Pattern"+ , "java.util.regex.PatternSyntaxException"+ , "java.util.spi.CurrencyNameProvider"+ , "java.util.spi.LocaleNameProvider"+ , "java.util.spi.LocaleServiceProvider"+ , "java.util.spi.TimeZoneNameProvider"+ , "java.util.zip.Adler32"+ , "java.util.zip.CRC32"+ , "java.util.zip.CheckedInputStream"+ , "java.util.zip.CheckedOutputStream"+ , "java.util.zip.Checksum"+ , "java.util.zip.DataFormatException"+ , "java.util.zip.Deflater"+ , "java.util.zip.DeflaterInputStream"+ , "java.util.zip.DeflaterOutputStream"+ , "java.util.zip.GZIPInputStream"+ , "java.util.zip.GZIPOutputStream"+ , "java.util.zip.Inflater"+ , "java.util.zip.InflaterInputStream"+ , "java.util.zip.InflaterOutputStream"+ , "java.util.zip.ZipEntry"+ , "java.util.zip.ZipError"+ , "java.util.zip.ZipException"+ , "java.util.zip.ZipFile"+ , "java.util.zip.ZipInputStream"+ , "java.util.zip.ZipOutputStream"+ , "javax.accessibility.Accessible"+ , "javax.accessibility.AccessibleAction"+ , "javax.accessibility.AccessibleAttributeSequence"+ , "javax.accessibility.AccessibleBundle"+ , "javax.accessibility.AccessibleComponent"+ , "javax.accessibility.AccessibleContext"+ , "javax.accessibility.AccessibleEditableText"+ , "javax.accessibility.AccessibleExtendedComponent"+ , "javax.accessibility.AccessibleExtendedTable"+ , "javax.accessibility.AccessibleExtendedText"+ , "javax.accessibility.AccessibleHyperlink"+ , "javax.accessibility.AccessibleHypertext"+ , "javax.accessibility.AccessibleIcon"+ , "javax.accessibility.AccessibleKeyBinding"+ , "javax.accessibility.AccessibleRelation"+ , "javax.accessibility.AccessibleRelationSet"+ , "javax.accessibility.AccessibleResourceBundle"+ , "javax.accessibility.AccessibleRole"+ , "javax.accessibility.AccessibleSelection"+ , "javax.accessibility.AccessibleState"+ , "javax.accessibility.AccessibleStateSet"+ , "javax.accessibility.AccessibleStreamable"+ , "javax.accessibility.AccessibleTable"+ , "javax.accessibility.AccessibleTableModelChange"+ , "javax.accessibility.AccessibleText"+ , "javax.accessibility.AccessibleTextSequence"+ , "javax.accessibility.AccessibleValue"+ , "javax.activation.ActivationDataFlavor"+ , "javax.activation.CommandInfo"+ , "javax.activation.CommandMap"+ , "javax.activation.CommandObject"+ , "javax.activation.DataContentHandler"+ , "javax.activation.DataContentHandlerFactory"+ , "javax.activation.DataHandler"+ , "javax.activation.DataSource"+ , "javax.activation.FileDataSource"+ , "javax.activation.FileTypeMap"+ , "javax.activation.MailcapCommandMap"+ , "javax.activation.MimeType"+ , "javax.activation.MimeTypeParameterList"+ , "javax.activation.MimeTypeParseException"+ , "javax.activation.MimetypesFileTypeMap"+ , "javax.activation.URLDataSource"+ , "javax.activation.UnsupportedDataTypeException"+ , "javax.activity.ActivityCompletedException"+ , "javax.activity.ActivityRequiredException"+ , "javax.activity.InvalidActivityException"+ , "javax.annotation.Generated"+ , "javax.annotation.PostConstruct"+ , "javax.annotation.PreDestroy"+ , "javax.annotation.Resource"+ , "javax.annotation.Resource$AuthenticationType"+ , "javax.annotation.Resources"+ , "javax.annotation.processing.AbstractProcessor"+ , "javax.annotation.processing.Completion"+ , "javax.annotation.processing.Completions"+ , "javax.annotation.processing.Filer"+ , "javax.annotation.processing.FilerException"+ , "javax.annotation.processing.Messager"+ , "javax.annotation.processing.ProcessingEnvironment"+ , "javax.annotation.processing.Processor"+ , "javax.annotation.processing.RoundEnvironment"+ , "javax.annotation.processing.SupportedAnnotationTypes"+ , "javax.annotation.processing.SupportedOptions"+ , "javax.annotation.processing.SupportedSourceVersion"+ , "javax.crypto.BadPaddingException"+ , "javax.crypto.Cipher"+ , "javax.crypto.CipherInputStream"+ , "javax.crypto.CipherOutputStream"+ , "javax.crypto.CipherSpi"+ , "javax.crypto.EncryptedPrivateKeyInfo"+ , "javax.crypto.ExemptionMechanism"+ , "javax.crypto.ExemptionMechanismException"+ , "javax.crypto.ExemptionMechanismSpi"+ , "javax.crypto.IllegalBlockSizeException"+ , "javax.crypto.KeyAgreement"+ , "javax.crypto.KeyAgreementSpi"+ , "javax.crypto.KeyGenerator"+ , "javax.crypto.KeyGeneratorSpi"+ , "javax.crypto.Mac"+ , "javax.crypto.MacSpi"+ , "javax.crypto.NoSuchPaddingException"+ , "javax.crypto.NullCipher"+ , "javax.crypto.SealedObject"+ , "javax.crypto.SecretKey"+ , "javax.crypto.SecretKeyFactory"+ , "javax.crypto.SecretKeyFactorySpi"+ , "javax.crypto.ShortBufferException"+ , "javax.crypto.interfaces.DHKey"+ , "javax.crypto.interfaces.DHPrivateKey"+ , "javax.crypto.interfaces.DHPublicKey"+ , "javax.crypto.interfaces.PBEKey"+ , "javax.crypto.spec.DESKeySpec"+ , "javax.crypto.spec.DESedeKeySpec"+ , "javax.crypto.spec.DHGenParameterSpec"+ , "javax.crypto.spec.DHParameterSpec"+ , "javax.crypto.spec.DHPrivateKeySpec"+ , "javax.crypto.spec.DHPublicKeySpec"+ , "javax.crypto.spec.IvParameterSpec"+ , "javax.crypto.spec.OAEPParameterSpec"+ , "javax.crypto.spec.PBEKeySpec"+ , "javax.crypto.spec.PBEParameterSpec"+ , "javax.crypto.spec.PSource"+ , "javax.crypto.spec.PSource$PSpecified"+ , "javax.crypto.spec.RC2ParameterSpec"+ , "javax.crypto.spec.RC5ParameterSpec"+ , "javax.crypto.spec.SecretKeySpec"+ , "javax.imageio.IIOException"+ , "javax.imageio.IIOImage"+ , "javax.imageio.IIOParam"+ , "javax.imageio.IIOParamController"+ , "javax.imageio.ImageIO"+ , "javax.imageio.ImageReadParam"+ , "javax.imageio.ImageReader"+ , "javax.imageio.ImageTranscoder"+ , "javax.imageio.ImageTypeSpecifier"+ , "javax.imageio.ImageWriteParam"+ , "javax.imageio.ImageWriter"+ , "javax.imageio.event.IIOReadProgressListener"+ , "javax.imageio.event.IIOReadUpdateListener"+ , "javax.imageio.event.IIOReadWarningListener"+ , "javax.imageio.event.IIOWriteProgressListener"+ , "javax.imageio.event.IIOWriteWarningListener"+ , "javax.imageio.metadata.IIOInvalidTreeException"+ , "javax.imageio.metadata.IIOMetadata"+ , "javax.imageio.metadata.IIOMetadataController"+ , "javax.imageio.metadata.IIOMetadataFormat"+ , "javax.imageio.metadata.IIOMetadataFormatImpl"+ , "javax.imageio.metadata.IIOMetadataNode"+ , "javax.imageio.plugins.bmp.BMPImageWriteParam"+ , "javax.imageio.plugins.jpeg.JPEGHuffmanTable"+ , "javax.imageio.plugins.jpeg.JPEGImageReadParam"+ , "javax.imageio.plugins.jpeg.JPEGImageWriteParam"+ , "javax.imageio.plugins.jpeg.JPEGQTable"+ , "javax.imageio.spi.IIORegistry"+ , "javax.imageio.spi.IIOServiceProvider"+ , "javax.imageio.spi.ImageInputStreamSpi"+ , "javax.imageio.spi.ImageOutputStreamSpi"+ , "javax.imageio.spi.ImageReaderSpi"+ , "javax.imageio.spi.ImageReaderWriterSpi"+ , "javax.imageio.spi.ImageTranscoderSpi"+ , "javax.imageio.spi.ImageWriterSpi"+ , "javax.imageio.spi.RegisterableService"+ , "javax.imageio.spi.ServiceRegistry"+ , "javax.imageio.spi.ServiceRegistry$Filter"+ , "javax.imageio.stream.FileCacheImageInputStream"+ , "javax.imageio.stream.FileCacheImageOutputStream"+ , "javax.imageio.stream.FileImageInputStream"+ , "javax.imageio.stream.FileImageOutputStream"+ , "javax.imageio.stream.IIOByteBuffer"+ , "javax.imageio.stream.ImageInputStream"+ , "javax.imageio.stream.ImageInputStreamImpl"+ , "javax.imageio.stream.ImageOutputStream"+ , "javax.imageio.stream.ImageOutputStreamImpl"+ , "javax.imageio.stream.MemoryCacheImageInputStream"+ , "javax.imageio.stream.MemoryCacheImageOutputStream"+ , "javax.jws.HandlerChain"+ , "javax.jws.Oneway"+ , "javax.jws.WebMethod"+ , "javax.jws.WebParam"+ , "javax.jws.WebParam$Mode"+ , "javax.jws.WebResult"+ , "javax.jws.WebService"+ , "javax.jws.soap.InitParam"+ , "javax.jws.soap.SOAPBinding"+ , "javax.jws.soap.SOAPBinding$ParameterStyle"+ , "javax.jws.soap.SOAPBinding$Style"+ , "javax.jws.soap.SOAPBinding$Use"+ , "javax.jws.soap.SOAPMessageHandler"+ , "javax.jws.soap.SOAPMessageHandlers"+ , "javax.lang.model.SourceVersion"+ , "javax.lang.model.element.AnnotationMirror"+ , "javax.lang.model.element.AnnotationValue"+ , "javax.lang.model.element.AnnotationValueVisitor"+ , "javax.lang.model.element.Element"+ , "javax.lang.model.element.ElementKind"+ , "javax.lang.model.element.ElementVisitor"+ , "javax.lang.model.element.ExecutableElement"+ , "javax.lang.model.element.Modifier"+ , "javax.lang.model.element.Name"+ , "javax.lang.model.element.NestingKind"+ , "javax.lang.model.element.PackageElement"+ , "javax.lang.model.element.TypeElement"+ , "javax.lang.model.element.TypeParameterElement"+ , "javax.lang.model.element.UnknownAnnotationValueException"+ , "javax.lang.model.element.UnknownElementException"+ , "javax.lang.model.element.VariableElement"+ , "javax.lang.model.type.ArrayType"+ , "javax.lang.model.type.DeclaredType"+ , "javax.lang.model.type.ErrorType"+ , "javax.lang.model.type.ExecutableType"+ , "javax.lang.model.type.MirroredTypeException"+ , "javax.lang.model.type.MirroredTypesException"+ , "javax.lang.model.type.NoType"+ , "javax.lang.model.type.NullType"+ , "javax.lang.model.type.PrimitiveType"+ , "javax.lang.model.type.ReferenceType"+ , "javax.lang.model.type.TypeKind"+ , "javax.lang.model.type.TypeMirror"+ , "javax.lang.model.type.TypeVariable"+ , "javax.lang.model.type.TypeVisitor"+ , "javax.lang.model.type.UnknownTypeException"+ , "javax.lang.model.type.WildcardType"+ , "javax.lang.model.util.AbstractAnnotationValueVisitor6"+ , "javax.lang.model.util.AbstractElementVisitor6"+ , "javax.lang.model.util.AbstractTypeVisitor6"+ , "javax.lang.model.util.ElementFilter"+ , "javax.lang.model.util.ElementKindVisitor6"+ , "javax.lang.model.util.ElementScanner6"+ , "javax.lang.model.util.Elements"+ , "javax.lang.model.util.SimpleAnnotationValueVisitor6"+ , "javax.lang.model.util.SimpleElementVisitor6"+ , "javax.lang.model.util.SimpleTypeVisitor6"+ , "javax.lang.model.util.TypeKindVisitor6"+ , "javax.lang.model.util.Types"+ , "javax.management.Attribute"+ , "javax.management.AttributeChangeNotification"+ , "javax.management.AttributeChangeNotificationFilter"+ , "javax.management.AttributeList"+ , "javax.management.AttributeNotFoundException"+ , "javax.management.AttributeValueExp"+ , "javax.management.BadAttributeValueExpException"+ , "javax.management.BadBinaryOpValueExpException"+ , "javax.management.BadStringOperationException"+ , "javax.management.DefaultLoaderRepository"+ , "javax.management.Descriptor"+ , "javax.management.DescriptorAccess"+ , "javax.management.DescriptorKey"+ , "javax.management.DescriptorRead"+ , "javax.management.DynamicMBean"+ , "javax.management.ImmutableDescriptor"+ , "javax.management.InstanceAlreadyExistsException"+ , "javax.management.InstanceNotFoundException"+ , "javax.management.IntrospectionException"+ , "javax.management.InvalidApplicationException"+ , "javax.management.InvalidAttributeValueException"+ , "javax.management.JMException"+ , "javax.management.JMRuntimeException"+ , "javax.management.JMX"+ , "javax.management.ListenerNotFoundException"+ , "javax.management.MBeanAttributeInfo"+ , "javax.management.MBeanConstructorInfo"+ , "javax.management.MBeanException"+ , "javax.management.MBeanFeatureInfo"+ , "javax.management.MBeanInfo"+ , "javax.management.MBeanNotificationInfo"+ , "javax.management.MBeanOperationInfo"+ , "javax.management.MBeanParameterInfo"+ , "javax.management.MBeanPermission"+ , "javax.management.MBeanRegistration"+ , "javax.management.MBeanRegistrationException"+ , "javax.management.MBeanServer"+ , "javax.management.MBeanServerBuilder"+ , "javax.management.MBeanServerConnection"+ , "javax.management.MBeanServerDelegate"+ , "javax.management.MBeanServerDelegateMBean"+ , "javax.management.MBeanServerFactory"+ , "javax.management.MBeanServerInvocationHandler"+ , "javax.management.MBeanServerNotification"+ , "javax.management.MBeanServerPermission"+ , "javax.management.MBeanTrustPermission"+ , "javax.management.MXBean"+ , "javax.management.MalformedObjectNameException"+ , "javax.management.NotCompliantMBeanException"+ , "javax.management.Notification"+ , "javax.management.NotificationBroadcaster"+ , "javax.management.NotificationBroadcasterSupport"+ , "javax.management.NotificationEmitter"+ , "javax.management.NotificationFilter"+ , "javax.management.NotificationFilterSupport"+ , "javax.management.NotificationListener"+ , "javax.management.ObjectInstance"+ , "javax.management.ObjectName"+ , "javax.management.OperationsException"+ , "javax.management.PersistentMBean"+ , "javax.management.Query"+ , "javax.management.QueryEval"+ , "javax.management.QueryExp"+ , "javax.management.ReflectionException"+ , "javax.management.RuntimeErrorException"+ , "javax.management.RuntimeMBeanException"+ , "javax.management.RuntimeOperationsException"+ , "javax.management.ServiceNotFoundException"+ , "javax.management.StandardEmitterMBean"+ , "javax.management.StandardMBean"+ , "javax.management.StringValueExp"+ , "javax.management.ValueExp"+ , "javax.management.loading.ClassLoaderRepository"+ , "javax.management.loading.DefaultLoaderRepository"+ , "javax.management.loading.MLet"+ , "javax.management.loading.MLetContent"+ , "javax.management.loading.MLetMBean"+ , "javax.management.loading.PrivateClassLoader"+ , "javax.management.loading.PrivateMLet"+ , "javax.management.modelmbean.DescriptorSupport"+ , "javax.management.modelmbean.InvalidTargetObjectTypeException"+ , "javax.management.modelmbean.ModelMBean"+ , "javax.management.modelmbean.ModelMBeanAttributeInfo"+ , "javax.management.modelmbean.ModelMBeanConstructorInfo"+ , "javax.management.modelmbean.ModelMBeanInfo"+ , "javax.management.modelmbean.ModelMBeanInfoSupport"+ , "javax.management.modelmbean.ModelMBeanNotificationBroadcaster"+ , "javax.management.modelmbean.ModelMBeanNotificationInfo"+ , "javax.management.modelmbean.ModelMBeanOperationInfo"+ , "javax.management.modelmbean.RequiredModelMBean"+ , "javax.management.modelmbean.XMLParseException"+ , "javax.management.monitor.CounterMonitor"+ , "javax.management.monitor.CounterMonitorMBean"+ , "javax.management.monitor.GaugeMonitor"+ , "javax.management.monitor.GaugeMonitorMBean"+ , "javax.management.monitor.Monitor"+ , "javax.management.monitor.MonitorMBean"+ , "javax.management.monitor.MonitorNotification"+ , "javax.management.monitor.MonitorSettingException"+ , "javax.management.monitor.StringMonitor"+ , "javax.management.monitor.StringMonitorMBean"+ , "javax.management.openmbean.ArrayType"+ , "javax.management.openmbean.CompositeData"+ , "javax.management.openmbean.CompositeDataInvocationHandler"+ , "javax.management.openmbean.CompositeDataSupport"+ , "javax.management.openmbean.CompositeDataView"+ , "javax.management.openmbean.CompositeType"+ , "javax.management.openmbean.InvalidKeyException"+ , "javax.management.openmbean.InvalidOpenTypeException"+ , "javax.management.openmbean.KeyAlreadyExistsException"+ , "javax.management.openmbean.OpenDataException"+ , "javax.management.openmbean.OpenMBeanAttributeInfo"+ , "javax.management.openmbean.OpenMBeanAttributeInfoSupport"+ , "javax.management.openmbean.OpenMBeanConstructorInfo"+ , "javax.management.openmbean.OpenMBeanConstructorInfoSupport"+ , "javax.management.openmbean.OpenMBeanInfo"+ , "javax.management.openmbean.OpenMBeanInfoSupport"+ , "javax.management.openmbean.OpenMBeanOperationInfo"+ , "javax.management.openmbean.OpenMBeanOperationInfoSupport"+ , "javax.management.openmbean.OpenMBeanParameterInfo"+ , "javax.management.openmbean.OpenMBeanParameterInfoSupport"+ , "javax.management.openmbean.OpenType"+ , "javax.management.openmbean.SimpleType"+ , "javax.management.openmbean.TabularData"+ , "javax.management.openmbean.TabularDataSupport"+ , "javax.management.openmbean.TabularType"+ , "javax.management.relation.InvalidRelationIdException"+ , "javax.management.relation.InvalidRelationServiceException"+ , "javax.management.relation.InvalidRelationTypeException"+ , "javax.management.relation.InvalidRoleInfoException"+ , "javax.management.relation.InvalidRoleValueException"+ , "javax.management.relation.MBeanServerNotificationFilter"+ , "javax.management.relation.Relation"+ , "javax.management.relation.RelationException"+ , "javax.management.relation.RelationNotFoundException"+ , "javax.management.relation.RelationNotification"+ , "javax.management.relation.RelationService"+ , "javax.management.relation.RelationServiceMBean"+ , "javax.management.relation.RelationServiceNotRegisteredException"+ , "javax.management.relation.RelationSupport"+ , "javax.management.relation.RelationSupportMBean"+ , "javax.management.relation.RelationType"+ , "javax.management.relation.RelationTypeNotFoundException"+ , "javax.management.relation.RelationTypeSupport"+ , "javax.management.relation.Role"+ , "javax.management.relation.RoleInfo"+ , "javax.management.relation.RoleInfoNotFoundException"+ , "javax.management.relation.RoleList"+ , "javax.management.relation.RoleNotFoundException"+ , "javax.management.relation.RoleResult"+ , "javax.management.relation.RoleStatus"+ , "javax.management.relation.RoleUnresolved"+ , "javax.management.relation.RoleUnresolvedList"+ , "javax.management.remote.JMXAddressable"+ , "javax.management.remote.JMXAuthenticator"+ , "javax.management.remote.JMXConnectionNotification"+ , "javax.management.remote.JMXConnector"+ , "javax.management.remote.JMXConnectorFactory"+ , "javax.management.remote.JMXConnectorProvider"+ , "javax.management.remote.JMXConnectorServer"+ , "javax.management.remote.JMXConnectorServerFactory"+ , "javax.management.remote.JMXConnectorServerMBean"+ , "javax.management.remote.JMXConnectorServerProvider"+ , "javax.management.remote.JMXPrincipal"+ , "javax.management.remote.JMXProviderException"+ , "javax.management.remote.JMXServerErrorException"+ , "javax.management.remote.JMXServiceURL"+ , "javax.management.remote.MBeanServerForwarder"+ , "javax.management.remote.NotificationResult"+ , "javax.management.remote.SubjectDelegationPermission"+ , "javax.management.remote.TargetedNotification"+ , "javax.management.remote.rmi.RMIConnection"+ , "javax.management.remote.rmi.RMIConnectionImpl"+ , "javax.management.remote.rmi.RMIConnectionImpl_Stub"+ , "javax.management.remote.rmi.RMIConnector"+ , "javax.management.remote.rmi.RMIConnectorServer"+ , "javax.management.remote.rmi.RMIIIOPServerImpl"+ , "javax.management.remote.rmi.RMIJRMPServerImpl"+ , "javax.management.remote.rmi.RMIServer"+ , "javax.management.remote.rmi.RMIServerImpl"+ , "javax.management.remote.rmi.RMIServerImpl_Stub"+ , "javax.management.timer.Timer"+ , "javax.management.timer.TimerMBean"+ , "javax.management.timer.TimerNotification"+ , "javax.naming.AuthenticationException"+ , "javax.naming.AuthenticationNotSupportedException"+ , "javax.naming.BinaryRefAddr"+ , "javax.naming.Binding"+ , "javax.naming.CannotProceedException"+ , "javax.naming.CommunicationException"+ , "javax.naming.CompositeName"+ , "javax.naming.CompoundName"+ , "javax.naming.ConfigurationException"+ , "javax.naming.Context"+ , "javax.naming.ContextNotEmptyException"+ , "javax.naming.InitialContext"+ , "javax.naming.InsufficientResourcesException"+ , "javax.naming.InterruptedNamingException"+ , "javax.naming.InvalidNameException"+ , "javax.naming.LimitExceededException"+ , "javax.naming.LinkException"+ , "javax.naming.LinkLoopException"+ , "javax.naming.LinkRef"+ , "javax.naming.MalformedLinkException"+ , "javax.naming.Name"+ , "javax.naming.NameAlreadyBoundException"+ , "javax.naming.NameClassPair"+ , "javax.naming.NameNotFoundException"+ , "javax.naming.NameParser"+ , "javax.naming.NamingEnumeration"+ , "javax.naming.NamingException"+ , "javax.naming.NamingSecurityException"+ , "javax.naming.NoInitialContextException"+ , "javax.naming.NoPermissionException"+ , "javax.naming.NotContextException"+ , "javax.naming.OperationNotSupportedException"+ , "javax.naming.PartialResultException"+ , "javax.naming.RefAddr"+ , "javax.naming.Reference"+ , "javax.naming.Referenceable"+ , "javax.naming.ReferralException"+ , "javax.naming.ServiceUnavailableException"+ , "javax.naming.SizeLimitExceededException"+ , "javax.naming.StringRefAddr"+ , "javax.naming.TimeLimitExceededException"+ , "javax.naming.directory.Attribute"+ , "javax.naming.directory.AttributeInUseException"+ , "javax.naming.directory.AttributeModificationException"+ , "javax.naming.directory.Attributes"+ , "javax.naming.directory.BasicAttribute"+ , "javax.naming.directory.BasicAttributes"+ , "javax.naming.directory.DirContext"+ , "javax.naming.directory.InitialDirContext"+ , "javax.naming.directory.InvalidAttributeIdentifierException"+ , "javax.naming.directory.InvalidAttributeValueException"+ , "javax.naming.directory.InvalidAttributesException"+ , "javax.naming.directory.InvalidSearchControlsException"+ , "javax.naming.directory.InvalidSearchFilterException"+ , "javax.naming.directory.ModificationItem"+ , "javax.naming.directory.NoSuchAttributeException"+ , "javax.naming.directory.SchemaViolationException"+ , "javax.naming.directory.SearchControls"+ , "javax.naming.directory.SearchResult"+ , "javax.naming.event.EventContext"+ , "javax.naming.event.EventDirContext"+ , "javax.naming.event.NamespaceChangeListener"+ , "javax.naming.event.NamingEvent"+ , "javax.naming.event.NamingExceptionEvent"+ , "javax.naming.event.NamingListener"+ , "javax.naming.event.ObjectChangeListener"+ , "javax.naming.ldap.BasicControl"+ , "javax.naming.ldap.Control"+ , "javax.naming.ldap.ControlFactory"+ , "javax.naming.ldap.ExtendedRequest"+ , "javax.naming.ldap.ExtendedResponse"+ , "javax.naming.ldap.HasControls"+ , "javax.naming.ldap.InitialLdapContext"+ , "javax.naming.ldap.LdapContext"+ , "javax.naming.ldap.LdapName"+ , "javax.naming.ldap.LdapReferralException"+ , "javax.naming.ldap.ManageReferralControl"+ , "javax.naming.ldap.PagedResultsControl"+ , "javax.naming.ldap.PagedResultsResponseControl"+ , "javax.naming.ldap.Rdn"+ , "javax.naming.ldap.SortControl"+ , "javax.naming.ldap.SortKey"+ , "javax.naming.ldap.SortResponseControl"+ , "javax.naming.ldap.StartTlsRequest"+ , "javax.naming.ldap.StartTlsResponse"+ , "javax.naming.ldap.UnsolicitedNotification"+ , "javax.naming.ldap.UnsolicitedNotificationEvent"+ , "javax.naming.ldap.UnsolicitedNotificationListener"+ , "javax.naming.spi.DirObjectFactory"+ , "javax.naming.spi.DirStateFactory"+ , "javax.naming.spi.DirStateFactory$Result"+ , "javax.naming.spi.DirectoryManager"+ , "javax.naming.spi.InitialContextFactory"+ , "javax.naming.spi.InitialContextFactoryBuilder"+ , "javax.naming.spi.NamingManager"+ , "javax.naming.spi.ObjectFactory"+ , "javax.naming.spi.ObjectFactoryBuilder"+ , "javax.naming.spi.ResolveResult"+ , "javax.naming.spi.Resolver"+ , "javax.naming.spi.StateFactory"+ , "javax.net.ServerSocketFactory"+ , "javax.net.SocketFactory"+ , "javax.net.ssl.CertPathTrustManagerParameters"+ , "javax.net.ssl.HandshakeCompletedEvent"+ , "javax.net.ssl.HandshakeCompletedListener"+ , "javax.net.ssl.HostnameVerifier"+ , "javax.net.ssl.HttpsURLConnection"+ , "javax.net.ssl.KeyManager"+ , "javax.net.ssl.KeyManagerFactory"+ , "javax.net.ssl.KeyManagerFactorySpi"+ , "javax.net.ssl.KeyStoreBuilderParameters"+ , "javax.net.ssl.ManagerFactoryParameters"+ , "javax.net.ssl.SSLContext"+ , "javax.net.ssl.SSLContextSpi"+ , "javax.net.ssl.SSLEngine"+ , "javax.net.ssl.SSLEngineResult"+ , "javax.net.ssl.SSLEngineResult$HandshakeStatus"+ , "javax.net.ssl.SSLEngineResult$Status"+ , "javax.net.ssl.SSLException"+ , "javax.net.ssl.SSLHandshakeException"+ , "javax.net.ssl.SSLKeyException"+ , "javax.net.ssl.SSLParameters"+ , "javax.net.ssl.SSLPeerUnverifiedException"+ , "javax.net.ssl.SSLPermission"+ , "javax.net.ssl.SSLProtocolException"+ , "javax.net.ssl.SSLServerSocket"+ , "javax.net.ssl.SSLServerSocketFactory"+ , "javax.net.ssl.SSLSession"+ , "javax.net.ssl.SSLSessionBindingEvent"+ , "javax.net.ssl.SSLSessionBindingListener"+ , "javax.net.ssl.SSLSessionContext"+ , "javax.net.ssl.SSLSocket"+ , "javax.net.ssl.SSLSocketFactory"+ , "javax.net.ssl.TrustManager"+ , "javax.net.ssl.TrustManagerFactory"+ , "javax.net.ssl.TrustManagerFactorySpi"+ , "javax.net.ssl.X509ExtendedKeyManager"+ , "javax.net.ssl.X509KeyManager"+ , "javax.net.ssl.X509TrustManager"+ , "javax.print.AttributeException"+ , "javax.print.CancelablePrintJob"+ , "javax.print.Doc"+ , "javax.print.DocFlavor"+ , "javax.print.DocFlavor$BYTE_ARRAY"+ , "javax.print.DocFlavor$CHAR_ARRAY"+ , "javax.print.DocFlavor$INPUT_STREAM"+ , "javax.print.DocFlavor$READER"+ , "javax.print.DocFlavor$SERVICE_FORMATTED"+ , "javax.print.DocFlavor$STRING"+ , "javax.print.DocFlavor$URL"+ , "javax.print.DocPrintJob"+ , "javax.print.FlavorException"+ , "javax.print.MultiDoc"+ , "javax.print.MultiDocPrintJob"+ , "javax.print.MultiDocPrintService"+ , "javax.print.PrintException"+ , "javax.print.PrintService"+ , "javax.print.PrintServiceLookup"+ , "javax.print.ServiceUI"+ , "javax.print.ServiceUIFactory"+ , "javax.print.SimpleDoc"+ , "javax.print.StreamPrintService"+ , "javax.print.StreamPrintServiceFactory"+ , "javax.print.URIException"+ , "javax.print.attribute.Attribute"+ , "javax.print.attribute.AttributeSet"+ , "javax.print.attribute.AttributeSetUtilities"+ , "javax.print.attribute.DateTimeSyntax"+ , "javax.print.attribute.DocAttribute"+ , "javax.print.attribute.DocAttributeSet"+ , "javax.print.attribute.EnumSyntax"+ , "javax.print.attribute.HashAttributeSet"+ , "javax.print.attribute.HashDocAttributeSet"+ , "javax.print.attribute.HashPrintJobAttributeSet"+ , "javax.print.attribute.HashPrintRequestAttributeSet"+ , "javax.print.attribute.HashPrintServiceAttributeSet"+ , "javax.print.attribute.IntegerSyntax"+ , "javax.print.attribute.PrintJobAttribute"+ , "javax.print.attribute.PrintJobAttributeSet"+ , "javax.print.attribute.PrintRequestAttribute"+ , "javax.print.attribute.PrintRequestAttributeSet"+ , "javax.print.attribute.PrintServiceAttribute"+ , "javax.print.attribute.PrintServiceAttributeSet"+ , "javax.print.attribute.ResolutionSyntax"+ , "javax.print.attribute.SetOfIntegerSyntax"+ , "javax.print.attribute.Size2DSyntax"+ , "javax.print.attribute.SupportedValuesAttribute"+ , "javax.print.attribute.TextSyntax"+ , "javax.print.attribute.URISyntax"+ , "javax.print.attribute.UnmodifiableSetException"+ , "javax.print.attribute.standard.Chromaticity"+ , "javax.print.attribute.standard.ColorSupported"+ , "javax.print.attribute.standard.Compression"+ , "javax.print.attribute.standard.Copies"+ , "javax.print.attribute.standard.CopiesSupported"+ , "javax.print.attribute.standard.DateTimeAtCompleted"+ , "javax.print.attribute.standard.DateTimeAtCreation"+ , "javax.print.attribute.standard.DateTimeAtProcessing"+ , "javax.print.attribute.standard.Destination"+ , "javax.print.attribute.standard.DocumentName"+ , "javax.print.attribute.standard.Fidelity"+ , "javax.print.attribute.standard.Finishings"+ , "javax.print.attribute.standard.JobHoldUntil"+ , "javax.print.attribute.standard.JobImpressions"+ , "javax.print.attribute.standard.JobImpressionsCompleted"+ , "javax.print.attribute.standard.JobImpressionsSupported"+ , "javax.print.attribute.standard.JobKOctets"+ , "javax.print.attribute.standard.JobKOctetsProcessed"+ , "javax.print.attribute.standard.JobKOctetsSupported"+ , "javax.print.attribute.standard.JobMediaSheets"+ , "javax.print.attribute.standard.JobMediaSheetsCompleted"+ , "javax.print.attribute.standard.JobMediaSheetsSupported"+ , "javax.print.attribute.standard.JobMessageFromOperator"+ , "javax.print.attribute.standard.JobName"+ , "javax.print.attribute.standard.JobOriginatingUserName"+ , "javax.print.attribute.standard.JobPriority"+ , "javax.print.attribute.standard.JobPrioritySupported"+ , "javax.print.attribute.standard.JobSheets"+ , "javax.print.attribute.standard.JobState"+ , "javax.print.attribute.standard.JobStateReason"+ , "javax.print.attribute.standard.JobStateReasons"+ , "javax.print.attribute.standard.Media"+ , "javax.print.attribute.standard.MediaName"+ , "javax.print.attribute.standard.MediaPrintableArea"+ , "javax.print.attribute.standard.MediaSize"+ , "javax.print.attribute.standard.MediaSize$Engineering"+ , "javax.print.attribute.standard.MediaSize$ISO"+ , "javax.print.attribute.standard.MediaSize$JIS"+ , "javax.print.attribute.standard.MediaSize$NA"+ , "javax.print.attribute.standard.MediaSize$Other"+ , "javax.print.attribute.standard.MediaSizeName"+ , "javax.print.attribute.standard.MediaTray"+ , "javax.print.attribute.standard.MultipleDocumentHandling"+ , "javax.print.attribute.standard.NumberOfDocuments"+ , "javax.print.attribute.standard.NumberOfInterveningJobs"+ , "javax.print.attribute.standard.NumberUp"+ , "javax.print.attribute.standard.NumberUpSupported"+ , "javax.print.attribute.standard.OrientationRequested"+ , "javax.print.attribute.standard.OutputDeviceAssigned"+ , "javax.print.attribute.standard.PDLOverrideSupported"+ , "javax.print.attribute.standard.PageRanges"+ , "javax.print.attribute.standard.PagesPerMinute"+ , "javax.print.attribute.standard.PagesPerMinuteColor"+ , "javax.print.attribute.standard.PresentationDirection"+ , "javax.print.attribute.standard.PrintQuality"+ , "javax.print.attribute.standard.PrinterInfo"+ , "javax.print.attribute.standard.PrinterIsAcceptingJobs"+ , "javax.print.attribute.standard.PrinterLocation"+ , "javax.print.attribute.standard.PrinterMakeAndModel"+ , "javax.print.attribute.standard.PrinterMessageFromOperator"+ , "javax.print.attribute.standard.PrinterMoreInfo"+ , "javax.print.attribute.standard.PrinterMoreInfoManufacturer"+ , "javax.print.attribute.standard.PrinterName"+ , "javax.print.attribute.standard.PrinterResolution"+ , "javax.print.attribute.standard.PrinterState"+ , "javax.print.attribute.standard.PrinterStateReason"+ , "javax.print.attribute.standard.PrinterStateReasons"+ , "javax.print.attribute.standard.PrinterURI"+ , "javax.print.attribute.standard.QueuedJobCount"+ , "javax.print.attribute.standard.ReferenceUriSchemesSupported"+ , "javax.print.attribute.standard.RequestingUserName"+ , "javax.print.attribute.standard.Severity"+ , "javax.print.attribute.standard.SheetCollate"+ , "javax.print.attribute.standard.Sides"+ , "javax.print.event.PrintEvent"+ , "javax.print.event.PrintJobAdapter"+ , "javax.print.event.PrintJobAttributeEvent"+ , "javax.print.event.PrintJobAttributeListener"+ , "javax.print.event.PrintJobEvent"+ , "javax.print.event.PrintJobListener"+ , "javax.print.event.PrintServiceAttributeEvent"+ , "javax.print.event.PrintServiceAttributeListener"+ , "javax.rmi.CORBA.ClassDesc"+ , "javax.rmi.CORBA.PortableRemoteObjectDelegate"+ , "javax.rmi.CORBA.Stub"+ , "javax.rmi.CORBA.StubDelegate"+ , "javax.rmi.CORBA.Tie"+ , "javax.rmi.CORBA.Util"+ , "javax.rmi.CORBA.UtilDelegate"+ , "javax.rmi.CORBA.ValueHandler"+ , "javax.rmi.CORBA.ValueHandlerMultiFormat"+ , "javax.rmi.PortableRemoteObject"+ , "javax.rmi.ssl.SslRMIClientSocketFactory"+ , "javax.rmi.ssl.SslRMIServerSocketFactory"+ , "javax.script.AbstractScriptEngine"+ , "javax.script.Bindings"+ , "javax.script.Compilable"+ , "javax.script.CompiledScript"+ , "javax.script.Invocable"+ , "javax.script.ScriptContext"+ , "javax.script.ScriptEngine"+ , "javax.script.ScriptEngineFactory"+ , "javax.script.ScriptEngineManager"+ , "javax.script.ScriptException"+ , "javax.script.SimpleBindings"+ , "javax.script.SimpleScriptContext"+ , "javax.security.auth.AuthPermission"+ , "javax.security.auth.DestroyFailedException"+ , "javax.security.auth.Destroyable"+ , "javax.security.auth.Policy"+ , "javax.security.auth.PrivateCredentialPermission"+ , "javax.security.auth.RefreshFailedException"+ , "javax.security.auth.Refreshable"+ , "javax.security.auth.Subject"+ , "javax.security.auth.SubjectDomainCombiner"+ , "javax.security.auth.callback.Callback"+ , "javax.security.auth.callback.CallbackHandler"+ , "javax.security.auth.callback.ChoiceCallback"+ , "javax.security.auth.callback.ConfirmationCallback"+ , "javax.security.auth.callback.LanguageCallback"+ , "javax.security.auth.callback.NameCallback"+ , "javax.security.auth.callback.PasswordCallback"+ , "javax.security.auth.callback.TextInputCallback"+ , "javax.security.auth.callback.TextOutputCallback"+ , "javax.security.auth.callback.UnsupportedCallbackException"+ , "javax.security.auth.kerberos.DelegationPermission"+ , "javax.security.auth.kerberos.KerberosKey"+ , "javax.security.auth.kerberos.KerberosPrincipal"+ , "javax.security.auth.kerberos.KerberosTicket"+ , "javax.security.auth.kerberos.ServicePermission"+ , "javax.security.auth.login.AccountException"+ , "javax.security.auth.login.AccountExpiredException"+ , "javax.security.auth.login.AccountLockedException"+ , "javax.security.auth.login.AccountNotFoundException"+ , "javax.security.auth.login.AppConfigurationEntry"+ , "javax.security.auth.login.AppConfigurationEntry$LoginModuleControlFlag"+ , "javax.security.auth.login.Configuration"+ , "javax.security.auth.login.Configuration$Parameters"+ , "javax.security.auth.login.ConfigurationSpi"+ , "javax.security.auth.login.CredentialException"+ , "javax.security.auth.login.CredentialExpiredException"+ , "javax.security.auth.login.CredentialNotFoundException"+ , "javax.security.auth.login.FailedLoginException"+ , "javax.security.auth.login.LoginContext"+ , "javax.security.auth.login.LoginException"+ , "javax.security.auth.spi.LoginModule"+ , "javax.security.auth.x500.X500Principal"+ , "javax.security.auth.x500.X500PrivateCredential"+ , "javax.security.cert.Certificate"+ , "javax.security.cert.CertificateEncodingException"+ , "javax.security.cert.CertificateException"+ , "javax.security.cert.CertificateExpiredException"+ , "javax.security.cert.CertificateNotYetValidException"+ , "javax.security.cert.CertificateParsingException"+ , "javax.security.cert.X509Certificate"+ , "javax.security.sasl.AuthenticationException"+ , "javax.security.sasl.AuthorizeCallback"+ , "javax.security.sasl.RealmCallback"+ , "javax.security.sasl.RealmChoiceCallback"+ , "javax.security.sasl.Sasl"+ , "javax.security.sasl.SaslClient"+ , "javax.security.sasl.SaslClientFactory"+ , "javax.security.sasl.SaslException"+ , "javax.security.sasl.SaslServer"+ , "javax.security.sasl.SaslServerFactory"+ , "javax.sound.midi.ControllerEventListener"+ , "javax.sound.midi.Instrument"+ , "javax.sound.midi.InvalidMidiDataException"+ , "javax.sound.midi.MetaEventListener"+ , "javax.sound.midi.MetaMessage"+ , "javax.sound.midi.MidiChannel"+ , "javax.sound.midi.MidiDevice"+ , "javax.sound.midi.MidiDevice$Info"+ , "javax.sound.midi.MidiEvent"+ , "javax.sound.midi.MidiFileFormat"+ , "javax.sound.midi.MidiMessage"+ , "javax.sound.midi.MidiSystem"+ , "javax.sound.midi.MidiUnavailableException"+ , "javax.sound.midi.Patch"+ , "javax.sound.midi.Receiver"+ , "javax.sound.midi.Sequence"+ , "javax.sound.midi.Sequencer"+ , "javax.sound.midi.Sequencer$SyncMode"+ , "javax.sound.midi.ShortMessage"+ , "javax.sound.midi.Soundbank"+ , "javax.sound.midi.SoundbankResource"+ , "javax.sound.midi.Synthesizer"+ , "javax.sound.midi.SysexMessage"+ , "javax.sound.midi.Track"+ , "javax.sound.midi.Transmitter"+ , "javax.sound.midi.VoiceStatus"+ , "javax.sound.midi.spi.MidiDeviceProvider"+ , "javax.sound.midi.spi.MidiFileReader"+ , "javax.sound.midi.spi.MidiFileWriter"+ , "javax.sound.midi.spi.SoundbankReader"+ , "javax.sound.sampled.AudioFileFormat"+ , "javax.sound.sampled.AudioFileFormat$Type"+ , "javax.sound.sampled.AudioFormat"+ , "javax.sound.sampled.AudioFormat$Encoding"+ , "javax.sound.sampled.AudioInputStream"+ , "javax.sound.sampled.AudioPermission"+ , "javax.sound.sampled.AudioSystem"+ , "javax.sound.sampled.BooleanControl"+ , "javax.sound.sampled.BooleanControl$Type"+ , "javax.sound.sampled.Clip"+ , "javax.sound.sampled.CompoundControl"+ , "javax.sound.sampled.CompoundControl$Type"+ , "javax.sound.sampled.Control"+ , "javax.sound.sampled.Control$Type"+ , "javax.sound.sampled.DataLine"+ , "javax.sound.sampled.DataLine$Info"+ , "javax.sound.sampled.EnumControl"+ , "javax.sound.sampled.EnumControl$Type"+ , "javax.sound.sampled.FloatControl"+ , "javax.sound.sampled.FloatControl$Type"+ , "javax.sound.sampled.Line"+ , "javax.sound.sampled.Line$Info"+ , "javax.sound.sampled.LineEvent"+ , "javax.sound.sampled.LineEvent$Type"+ , "javax.sound.sampled.LineListener"+ , "javax.sound.sampled.LineUnavailableException"+ , "javax.sound.sampled.Mixer"+ , "javax.sound.sampled.Mixer$Info"+ , "javax.sound.sampled.Port"+ , "javax.sound.sampled.Port$Info"+ , "javax.sound.sampled.ReverbType"+ , "javax.sound.sampled.SourceDataLine"+ , "javax.sound.sampled.TargetDataLine"+ , "javax.sound.sampled.UnsupportedAudioFileException"+ , "javax.sound.sampled.spi.AudioFileReader"+ , "javax.sound.sampled.spi.AudioFileWriter"+ , "javax.sound.sampled.spi.FormatConversionProvider"+ , "javax.sound.sampled.spi.MixerProvider"+ , "javax.sql.CommonDataSource"+ , "javax.sql.ConnectionEvent"+ , "javax.sql.ConnectionEventListener"+ , "javax.sql.ConnectionPoolDataSource"+ , "javax.sql.DataSource"+ , "javax.sql.PooledConnection"+ , "javax.sql.RowSet"+ , "javax.sql.RowSetEvent"+ , "javax.sql.RowSetInternal"+ , "javax.sql.RowSetListener"+ , "javax.sql.RowSetMetaData"+ , "javax.sql.RowSetReader"+ , "javax.sql.RowSetWriter"+ , "javax.sql.StatementEvent"+ , "javax.sql.StatementEventListener"+ , "javax.sql.XAConnection"+ , "javax.sql.XADataSource"+ , "javax.sql.rowset.BaseRowSet"+ , "javax.sql.rowset.CachedRowSet"+ , "javax.sql.rowset.FilteredRowSet"+ , "javax.sql.rowset.JdbcRowSet"+ , "javax.sql.rowset.JoinRowSet"+ , "javax.sql.rowset.Joinable"+ , "javax.sql.rowset.Predicate"+ , "javax.sql.rowset.RowSetMetaDataImpl"+ , "javax.sql.rowset.RowSetWarning"+ , "javax.sql.rowset.WebRowSet"+ , "javax.sql.rowset.serial.SQLInputImpl"+ , "javax.sql.rowset.serial.SQLOutputImpl"+ , "javax.sql.rowset.serial.SerialArray"+ , "javax.sql.rowset.serial.SerialBlob"+ , "javax.sql.rowset.serial.SerialClob"+ , "javax.sql.rowset.serial.SerialDatalink"+ , "javax.sql.rowset.serial.SerialException"+ , "javax.sql.rowset.serial.SerialJavaObject"+ , "javax.sql.rowset.serial.SerialRef"+ , "javax.sql.rowset.serial.SerialStruct"+ , "javax.sql.rowset.spi.SyncFactory"+ , "javax.sql.rowset.spi.SyncFactoryException"+ , "javax.sql.rowset.spi.SyncProvider"+ , "javax.sql.rowset.spi.SyncProviderException"+ , "javax.sql.rowset.spi.SyncResolver"+ , "javax.sql.rowset.spi.TransactionalWriter"+ , "javax.sql.rowset.spi.XmlReader"+ , "javax.sql.rowset.spi.XmlWriter"+ , "javax.swing.AbstractAction"+ , "javax.swing.AbstractButton"+ , "javax.swing.AbstractCellEditor"+ , "javax.swing.AbstractListModel"+ , "javax.swing.AbstractSpinnerModel"+ , "javax.swing.Action"+ , "javax.swing.ActionMap"+ , "javax.swing.BorderFactory"+ , "javax.swing.BoundedRangeModel"+ , "javax.swing.Box"+ , "javax.swing.Box$Filler"+ , "javax.swing.BoxLayout"+ , "javax.swing.ButtonGroup"+ , "javax.swing.ButtonModel"+ , "javax.swing.CellEditor"+ , "javax.swing.CellRendererPane"+ , "javax.swing.ComboBoxEditor"+ , "javax.swing.ComboBoxModel"+ , "javax.swing.ComponentInputMap"+ , "javax.swing.DebugGraphics"+ , "javax.swing.DefaultBoundedRangeModel"+ , "javax.swing.DefaultButtonModel"+ , "javax.swing.DefaultCellEditor"+ , "javax.swing.DefaultComboBoxModel"+ , "javax.swing.DefaultDesktopManager"+ , "javax.swing.DefaultFocusManager"+ , "javax.swing.DefaultListCellRenderer"+ , "javax.swing.DefaultListCellRenderer$UIResource"+ , "javax.swing.DefaultListModel"+ , "javax.swing.DefaultListSelectionModel"+ , "javax.swing.DefaultRowSorter"+ , "javax.swing.DefaultRowSorter$ModelWrapper"+ , "javax.swing.DefaultSingleSelectionModel"+ , "javax.swing.DesktopManager"+ , "javax.swing.DropMode"+ , "javax.swing.FocusManager"+ , "javax.swing.GrayFilter"+ , "javax.swing.GroupLayout"+ , "javax.swing.GroupLayout$Alignment"+ , "javax.swing.Icon"+ , "javax.swing.ImageIcon"+ , "javax.swing.InputMap"+ , "javax.swing.InputVerifier"+ , "javax.swing.InternalFrameFocusTraversalPolicy"+ , "javax.swing.JApplet"+ , "javax.swing.JButton"+ , "javax.swing.JCheckBox"+ , "javax.swing.JCheckBoxMenuItem"+ , "javax.swing.JColorChooser"+ , "javax.swing.JComboBox"+ , "javax.swing.JComboBox$KeySelectionManager"+ , "javax.swing.JComponent"+ , "javax.swing.JDesktopPane"+ , "javax.swing.JDialog"+ , "javax.swing.JEditorPane"+ , "javax.swing.JFileChooser"+ , "javax.swing.JFormattedTextField"+ , "javax.swing.JFormattedTextField$AbstractFormatter"+ , "javax.swing.JFormattedTextField$AbstractFormatterFactory"+ , "javax.swing.JFrame"+ , "javax.swing.JInternalFrame"+ , "javax.swing.JInternalFrame$JDesktopIcon"+ , "javax.swing.JLabel"+ , "javax.swing.JLayeredPane"+ , "javax.swing.JList"+ , "javax.swing.JList$DropLocation"+ , "javax.swing.JMenu"+ , "javax.swing.JMenuBar"+ , "javax.swing.JMenuItem"+ , "javax.swing.JOptionPane"+ , "javax.swing.JPanel"+ , "javax.swing.JPasswordField"+ , "javax.swing.JPopupMenu"+ , "javax.swing.JPopupMenu$Separator"+ , "javax.swing.JProgressBar"+ , "javax.swing.JRadioButton"+ , "javax.swing.JRadioButtonMenuItem"+ , "javax.swing.JRootPane"+ , "javax.swing.JScrollBar"+ , "javax.swing.JScrollPane"+ , "javax.swing.JSeparator"+ , "javax.swing.JSlider"+ , "javax.swing.JSpinner"+ , "javax.swing.JSpinner$DateEditor"+ , "javax.swing.JSpinner$DefaultEditor"+ , "javax.swing.JSpinner$ListEditor"+ , "javax.swing.JSpinner$NumberEditor"+ , "javax.swing.JSplitPane"+ , "javax.swing.JTabbedPane"+ , "javax.swing.JTable"+ , "javax.swing.JTable$DropLocation"+ , "javax.swing.JTable$PrintMode"+ , "javax.swing.JTextArea"+ , "javax.swing.JTextField"+ , "javax.swing.JTextPane"+ , "javax.swing.JToggleButton"+ , "javax.swing.JToggleButton$ToggleButtonModel"+ , "javax.swing.JToolBar"+ , "javax.swing.JToolBar$Separator"+ , "javax.swing.JToolTip"+ , "javax.swing.JTree"+ , "javax.swing.JTree$DropLocation"+ , "javax.swing.JTree$DynamicUtilTreeNode"+ , "javax.swing.JTree$EmptySelectionModel"+ , "javax.swing.JViewport"+ , "javax.swing.JWindow"+ , "javax.swing.KeyStroke"+ , "javax.swing.LayoutFocusTraversalPolicy"+ , "javax.swing.LayoutStyle"+ , "javax.swing.LayoutStyle$ComponentPlacement"+ , "javax.swing.ListCellRenderer"+ , "javax.swing.ListModel"+ , "javax.swing.ListSelectionModel"+ , "javax.swing.LookAndFeel"+ , "javax.swing.MenuElement"+ , "javax.swing.MenuSelectionManager"+ , "javax.swing.MutableComboBoxModel"+ , "javax.swing.OverlayLayout"+ , "javax.swing.Popup"+ , "javax.swing.PopupFactory"+ , "javax.swing.ProgressMonitor"+ , "javax.swing.ProgressMonitorInputStream"+ , "javax.swing.Renderer"+ , "javax.swing.RepaintManager"+ , "javax.swing.RootPaneContainer"+ , "javax.swing.RowFilter"+ , "javax.swing.RowFilter$ComparisonType"+ , "javax.swing.RowFilter$Entry"+ , "javax.swing.RowSorter"+ , "javax.swing.RowSorter$SortKey"+ , "javax.swing.ScrollPaneConstants"+ , "javax.swing.ScrollPaneLayout"+ , "javax.swing.ScrollPaneLayout$UIResource"+ , "javax.swing.Scrollable"+ , "javax.swing.SingleSelectionModel"+ , "javax.swing.SizeRequirements"+ , "javax.swing.SizeSequence"+ , "javax.swing.SortOrder"+ , "javax.swing.SortingFocusTraversalPolicy"+ , "javax.swing.SpinnerDateModel"+ , "javax.swing.SpinnerListModel"+ , "javax.swing.SpinnerModel"+ , "javax.swing.SpinnerNumberModel"+ , "javax.swing.Spring"+ , "javax.swing.SpringLayout"+ , "javax.swing.SpringLayout$Constraints"+ , "javax.swing.SwingConstants"+ , "javax.swing.SwingUtilities"+ , "javax.swing.SwingWorker"+ , "javax.swing.SwingWorker$StateValue"+ , "javax.swing.Timer"+ , "javax.swing.ToolTipManager"+ , "javax.swing.TransferHandler"+ , "javax.swing.TransferHandler$DropLocation"+ , "javax.swing.TransferHandler$TransferSupport"+ , "javax.swing.UIDefaults"+ , "javax.swing.UIDefaults$ActiveValue"+ , "javax.swing.UIDefaults$LazyInputMap"+ , "javax.swing.UIDefaults$LazyValue"+ , "javax.swing.UIDefaults$ProxyLazyValue"+ , "javax.swing.UIManager"+ , "javax.swing.UIManager$LookAndFeelInfo"+ , "javax.swing.UnsupportedLookAndFeelException"+ , "javax.swing.ViewportLayout"+ , "javax.swing.WindowConstants"+ , "javax.swing.border.AbstractBorder"+ , "javax.swing.border.BevelBorder"+ , "javax.swing.border.Border"+ , "javax.swing.border.CompoundBorder"+ , "javax.swing.border.EmptyBorder"+ , "javax.swing.border.EtchedBorder"+ , "javax.swing.border.LineBorder"+ , "javax.swing.border.MatteBorder"+ , "javax.swing.border.SoftBevelBorder"+ , "javax.swing.border.TitledBorder"+ , "javax.swing.colorchooser.AbstractColorChooserPanel"+ , "javax.swing.colorchooser.ColorChooserComponentFactory"+ , "javax.swing.colorchooser.ColorSelectionModel"+ , "javax.swing.colorchooser.DefaultColorSelectionModel"+ , "javax.swing.event.AncestorEvent"+ , "javax.swing.event.AncestorListener"+ , "javax.swing.event.CaretEvent"+ , "javax.swing.event.CaretListener"+ , "javax.swing.event.CellEditorListener"+ , "javax.swing.event.ChangeEvent"+ , "javax.swing.event.ChangeListener"+ , "javax.swing.event.DocumentEvent"+ , "javax.swing.event.DocumentEvent$ElementChange"+ , "javax.swing.event.DocumentEvent$EventType"+ , "javax.swing.event.DocumentListener"+ , "javax.swing.event.EventListenerList"+ , "javax.swing.event.HyperlinkEvent"+ , "javax.swing.event.HyperlinkEvent$EventType"+ , "javax.swing.event.HyperlinkListener"+ , "javax.swing.event.InternalFrameAdapter"+ , "javax.swing.event.InternalFrameEvent"+ , "javax.swing.event.InternalFrameListener"+ , "javax.swing.event.ListDataEvent"+ , "javax.swing.event.ListDataListener"+ , "javax.swing.event.ListSelectionEvent"+ , "javax.swing.event.ListSelectionListener"+ , "javax.swing.event.MenuDragMouseEvent"+ , "javax.swing.event.MenuDragMouseListener"+ , "javax.swing.event.MenuEvent"+ , "javax.swing.event.MenuKeyEvent"+ , "javax.swing.event.MenuKeyListener"+ , "javax.swing.event.MenuListener"+ , "javax.swing.event.MouseInputAdapter"+ , "javax.swing.event.MouseInputListener"+ , "javax.swing.event.PopupMenuEvent"+ , "javax.swing.event.PopupMenuListener"+ , "javax.swing.event.RowSorterEvent"+ , "javax.swing.event.RowSorterEvent$Type"+ , "javax.swing.event.RowSorterListener"+ , "javax.swing.event.SwingPropertyChangeSupport"+ , "javax.swing.event.TableColumnModelEvent"+ , "javax.swing.event.TableColumnModelListener"+ , "javax.swing.event.TableModelEvent"+ , "javax.swing.event.TableModelListener"+ , "javax.swing.event.TreeExpansionEvent"+ , "javax.swing.event.TreeExpansionListener"+ , "javax.swing.event.TreeModelEvent"+ , "javax.swing.event.TreeModelListener"+ , "javax.swing.event.TreeSelectionEvent"+ , "javax.swing.event.TreeSelectionListener"+ , "javax.swing.event.TreeWillExpandListener"+ , "javax.swing.event.UndoableEditEvent"+ , "javax.swing.event.UndoableEditListener"+ , "javax.swing.filechooser.FileFilter"+ , "javax.swing.filechooser.FileNameExtensionFilter"+ , "javax.swing.filechooser.FileSystemView"+ , "javax.swing.filechooser.FileView"+ , "javax.swing.plaf.ActionMapUIResource"+ , "javax.swing.plaf.BorderUIResource"+ , "javax.swing.plaf.BorderUIResource$BevelBorderUIResource"+ , "javax.swing.plaf.BorderUIResource$CompoundBorderUIResource"+ , "javax.swing.plaf.BorderUIResource$EmptyBorderUIResource"+ , "javax.swing.plaf.BorderUIResource$EtchedBorderUIResource"+ , "javax.swing.plaf.BorderUIResource$LineBorderUIResource"+ , "javax.swing.plaf.BorderUIResource$MatteBorderUIResource"+ , "javax.swing.plaf.BorderUIResource$TitledBorderUIResource"+ , "javax.swing.plaf.ButtonUI"+ , "javax.swing.plaf.ColorChooserUI"+ , "javax.swing.plaf.ColorUIResource"+ , "javax.swing.plaf.ComboBoxUI"+ , "javax.swing.plaf.ComponentInputMapUIResource"+ , "javax.swing.plaf.ComponentUI"+ , "javax.swing.plaf.DesktopIconUI"+ , "javax.swing.plaf.DesktopPaneUI"+ , "javax.swing.plaf.DimensionUIResource"+ , "javax.swing.plaf.FileChooserUI"+ , "javax.swing.plaf.FontUIResource"+ , "javax.swing.plaf.IconUIResource"+ , "javax.swing.plaf.InputMapUIResource"+ , "javax.swing.plaf.InsetsUIResource"+ , "javax.swing.plaf.InternalFrameUI"+ , "javax.swing.plaf.LabelUI"+ , "javax.swing.plaf.ListUI"+ , "javax.swing.plaf.MenuBarUI"+ , "javax.swing.plaf.MenuItemUI"+ , "javax.swing.plaf.OptionPaneUI"+ , "javax.swing.plaf.PanelUI"+ , "javax.swing.plaf.PopupMenuUI"+ , "javax.swing.plaf.ProgressBarUI"+ , "javax.swing.plaf.RootPaneUI"+ , "javax.swing.plaf.ScrollBarUI"+ , "javax.swing.plaf.ScrollPaneUI"+ , "javax.swing.plaf.SeparatorUI"+ , "javax.swing.plaf.SliderUI"+ , "javax.swing.plaf.SpinnerUI"+ , "javax.swing.plaf.SplitPaneUI"+ , "javax.swing.plaf.TabbedPaneUI"+ , "javax.swing.plaf.TableHeaderUI"+ , "javax.swing.plaf.TableUI"+ , "javax.swing.plaf.TextUI"+ , "javax.swing.plaf.ToolBarUI"+ , "javax.swing.plaf.ToolTipUI"+ , "javax.swing.plaf.TreeUI"+ , "javax.swing.plaf.UIResource"+ , "javax.swing.plaf.ViewportUI"+ , "javax.swing.plaf.basic.BasicArrowButton"+ , "javax.swing.plaf.basic.BasicBorders"+ , "javax.swing.plaf.basic.BasicBorders$ButtonBorder"+ , "javax.swing.plaf.basic.BasicBorders$FieldBorder"+ , "javax.swing.plaf.basic.BasicBorders$MarginBorder"+ , "javax.swing.plaf.basic.BasicBorders$MenuBarBorder"+ , "javax.swing.plaf.basic.BasicBorders$RadioButtonBorder"+ , "javax.swing.plaf.basic.BasicBorders$RolloverButtonBorder"+ , "javax.swing.plaf.basic.BasicBorders$SplitPaneBorder"+ , "javax.swing.plaf.basic.BasicBorders$ToggleButtonBorder"+ , "javax.swing.plaf.basic.BasicButtonListener"+ , "javax.swing.plaf.basic.BasicButtonUI"+ , "javax.swing.plaf.basic.BasicCheckBoxMenuItemUI"+ , "javax.swing.plaf.basic.BasicCheckBoxUI"+ , "javax.swing.plaf.basic.BasicColorChooserUI"+ , "javax.swing.plaf.basic.BasicComboBoxEditor"+ , "javax.swing.plaf.basic.BasicComboBoxEditor$UIResource"+ , "javax.swing.plaf.basic.BasicComboBoxRenderer"+ , "javax.swing.plaf.basic.BasicComboBoxRenderer$UIResource"+ , "javax.swing.plaf.basic.BasicComboBoxUI"+ , "javax.swing.plaf.basic.BasicComboPopup"+ , "javax.swing.plaf.basic.BasicDesktopIconUI"+ , "javax.swing.plaf.basic.BasicDesktopPaneUI"+ , "javax.swing.plaf.basic.BasicDirectoryModel"+ , "javax.swing.plaf.basic.BasicEditorPaneUI"+ , "javax.swing.plaf.basic.BasicFileChooserUI"+ , "javax.swing.plaf.basic.BasicFormattedTextFieldUI"+ , "javax.swing.plaf.basic.BasicGraphicsUtils"+ , "javax.swing.plaf.basic.BasicHTML"+ , "javax.swing.plaf.basic.BasicIconFactory"+ , "javax.swing.plaf.basic.BasicInternalFrameTitlePane"+ , "javax.swing.plaf.basic.BasicInternalFrameUI"+ , "javax.swing.plaf.basic.BasicLabelUI"+ , "javax.swing.plaf.basic.BasicListUI"+ , "javax.swing.plaf.basic.BasicLookAndFeel"+ , "javax.swing.plaf.basic.BasicMenuBarUI"+ , "javax.swing.plaf.basic.BasicMenuItemUI"+ , "javax.swing.plaf.basic.BasicMenuUI"+ , "javax.swing.plaf.basic.BasicOptionPaneUI"+ , "javax.swing.plaf.basic.BasicOptionPaneUI$ButtonAreaLayout"+ , "javax.swing.plaf.basic.BasicPanelUI"+ , "javax.swing.plaf.basic.BasicPasswordFieldUI"+ , "javax.swing.plaf.basic.BasicPopupMenuSeparatorUI"+ , "javax.swing.plaf.basic.BasicPopupMenuUI"+ , "javax.swing.plaf.basic.BasicProgressBarUI"+ , "javax.swing.plaf.basic.BasicRadioButtonMenuItemUI"+ , "javax.swing.plaf.basic.BasicRadioButtonUI"+ , "javax.swing.plaf.basic.BasicRootPaneUI"+ , "javax.swing.plaf.basic.BasicScrollBarUI"+ , "javax.swing.plaf.basic.BasicScrollPaneUI"+ , "javax.swing.plaf.basic.BasicSeparatorUI"+ , "javax.swing.plaf.basic.BasicSliderUI"+ , "javax.swing.plaf.basic.BasicSpinnerUI"+ , "javax.swing.plaf.basic.BasicSplitPaneDivider"+ , "javax.swing.plaf.basic.BasicSplitPaneUI"+ , "javax.swing.plaf.basic.BasicTabbedPaneUI"+ , "javax.swing.plaf.basic.BasicTableHeaderUI"+ , "javax.swing.plaf.basic.BasicTableUI"+ , "javax.swing.plaf.basic.BasicTextAreaUI"+ , "javax.swing.plaf.basic.BasicTextFieldUI"+ , "javax.swing.plaf.basic.BasicTextPaneUI"+ , "javax.swing.plaf.basic.BasicTextUI"+ , "javax.swing.plaf.basic.BasicTextUI$BasicCaret"+ , "javax.swing.plaf.basic.BasicTextUI$BasicHighlighter"+ , "javax.swing.plaf.basic.BasicToggleButtonUI"+ , "javax.swing.plaf.basic.BasicToolBarSeparatorUI"+ , "javax.swing.plaf.basic.BasicToolBarUI"+ , "javax.swing.plaf.basic.BasicToolTipUI"+ , "javax.swing.plaf.basic.BasicTreeUI"+ , "javax.swing.plaf.basic.BasicViewportUI"+ , "javax.swing.plaf.basic.ComboPopup"+ , "javax.swing.plaf.basic.DefaultMenuLayout"+ , "javax.swing.plaf.metal.DefaultMetalTheme"+ , "javax.swing.plaf.metal.MetalBorders"+ , "javax.swing.plaf.metal.MetalBorders$ButtonBorder"+ , "javax.swing.plaf.metal.MetalBorders$Flush3DBorder"+ , "javax.swing.plaf.metal.MetalBorders$InternalFrameBorder"+ , "javax.swing.plaf.metal.MetalBorders$MenuBarBorder"+ , "javax.swing.plaf.metal.MetalBorders$MenuItemBorder"+ , "javax.swing.plaf.metal.MetalBorders$OptionDialogBorder"+ , "javax.swing.plaf.metal.MetalBorders$PaletteBorder"+ , "javax.swing.plaf.metal.MetalBorders$PopupMenuBorder"+ , "javax.swing.plaf.metal.MetalBorders$RolloverButtonBorder"+ , "javax.swing.plaf.metal.MetalBorders$ScrollPaneBorder"+ , "javax.swing.plaf.metal.MetalBorders$TableHeaderBorder"+ , "javax.swing.plaf.metal.MetalBorders$TextFieldBorder"+ , "javax.swing.plaf.metal.MetalBorders$ToggleButtonBorder"+ , "javax.swing.plaf.metal.MetalBorders$ToolBarBorder"+ , "javax.swing.plaf.metal.MetalButtonUI"+ , "javax.swing.plaf.metal.MetalCheckBoxIcon"+ , "javax.swing.plaf.metal.MetalCheckBoxUI"+ , "javax.swing.plaf.metal.MetalComboBoxButton"+ , "javax.swing.plaf.metal.MetalComboBoxEditor"+ , "javax.swing.plaf.metal.MetalComboBoxEditor$UIResource"+ , "javax.swing.plaf.metal.MetalComboBoxIcon"+ , "javax.swing.plaf.metal.MetalComboBoxUI"+ , "javax.swing.plaf.metal.MetalDesktopIconUI"+ , "javax.swing.plaf.metal.MetalFileChooserUI"+ , "javax.swing.plaf.metal.MetalIconFactory"+ , "javax.swing.plaf.metal.MetalIconFactory$FileIcon16"+ , "javax.swing.plaf.metal.MetalIconFactory$FolderIcon16"+ , "javax.swing.plaf.metal.MetalIconFactory$PaletteCloseIcon"+ , "javax.swing.plaf.metal.MetalIconFactory$TreeControlIcon"+ , "javax.swing.plaf.metal.MetalIconFactory$TreeFolderIcon"+ , "javax.swing.plaf.metal.MetalIconFactory$TreeLeafIcon"+ , "javax.swing.plaf.metal.MetalInternalFrameTitlePane"+ , "javax.swing.plaf.metal.MetalInternalFrameUI"+ , "javax.swing.plaf.metal.MetalLabelUI"+ , "javax.swing.plaf.metal.MetalLookAndFeel"+ , "javax.swing.plaf.metal.MetalMenuBarUI"+ , "javax.swing.plaf.metal.MetalPopupMenuSeparatorUI"+ , "javax.swing.plaf.metal.MetalProgressBarUI"+ , "javax.swing.plaf.metal.MetalRadioButtonUI"+ , "javax.swing.plaf.metal.MetalRootPaneUI"+ , "javax.swing.plaf.metal.MetalScrollBarUI"+ , "javax.swing.plaf.metal.MetalScrollButton"+ , "javax.swing.plaf.metal.MetalScrollPaneUI"+ , "javax.swing.plaf.metal.MetalSeparatorUI"+ , "javax.swing.plaf.metal.MetalSliderUI"+ , "javax.swing.plaf.metal.MetalSplitPaneUI"+ , "javax.swing.plaf.metal.MetalTabbedPaneUI"+ , "javax.swing.plaf.metal.MetalTextFieldUI"+ , "javax.swing.plaf.metal.MetalTheme"+ , "javax.swing.plaf.metal.MetalToggleButtonUI"+ , "javax.swing.plaf.metal.MetalToolBarUI"+ , "javax.swing.plaf.metal.MetalToolTipUI"+ , "javax.swing.plaf.metal.MetalTreeUI"+ , "javax.swing.plaf.metal.OceanTheme"+ , "javax.swing.plaf.multi.MultiButtonUI"+ , "javax.swing.plaf.multi.MultiColorChooserUI"+ , "javax.swing.plaf.multi.MultiComboBoxUI"+ , "javax.swing.plaf.multi.MultiDesktopIconUI"+ , "javax.swing.plaf.multi.MultiDesktopPaneUI"+ , "javax.swing.plaf.multi.MultiFileChooserUI"+ , "javax.swing.plaf.multi.MultiInternalFrameUI"+ , "javax.swing.plaf.multi.MultiLabelUI"+ , "javax.swing.plaf.multi.MultiListUI"+ , "javax.swing.plaf.multi.MultiLookAndFeel"+ , "javax.swing.plaf.multi.MultiMenuBarUI"+ , "javax.swing.plaf.multi.MultiMenuItemUI"+ , "javax.swing.plaf.multi.MultiOptionPaneUI"+ , "javax.swing.plaf.multi.MultiPanelUI"+ , "javax.swing.plaf.multi.MultiPopupMenuUI"+ , "javax.swing.plaf.multi.MultiProgressBarUI"+ , "javax.swing.plaf.multi.MultiRootPaneUI"+ , "javax.swing.plaf.multi.MultiScrollBarUI"+ , "javax.swing.plaf.multi.MultiScrollPaneUI"+ , "javax.swing.plaf.multi.MultiSeparatorUI"+ , "javax.swing.plaf.multi.MultiSliderUI"+ , "javax.swing.plaf.multi.MultiSpinnerUI"+ , "javax.swing.plaf.multi.MultiSplitPaneUI"+ , "javax.swing.plaf.multi.MultiTabbedPaneUI"+ , "javax.swing.plaf.multi.MultiTableHeaderUI"+ , "javax.swing.plaf.multi.MultiTableUI"+ , "javax.swing.plaf.multi.MultiTextUI"+ , "javax.swing.plaf.multi.MultiToolBarUI"+ , "javax.swing.plaf.multi.MultiToolTipUI"+ , "javax.swing.plaf.multi.MultiTreeUI"+ , "javax.swing.plaf.multi.MultiViewportUI"+ , "javax.swing.plaf.synth.ColorType"+ , "javax.swing.plaf.synth.Region"+ , "javax.swing.plaf.synth.SynthConstants"+ , "javax.swing.plaf.synth.SynthContext"+ , "javax.swing.plaf.synth.SynthGraphicsUtils"+ , "javax.swing.plaf.synth.SynthLookAndFeel"+ , "javax.swing.plaf.synth.SynthPainter"+ , "javax.swing.plaf.synth.SynthStyle"+ , "javax.swing.plaf.synth.SynthStyleFactory"+ , "javax.swing.table.AbstractTableModel"+ , "javax.swing.table.DefaultTableCellRenderer"+ , "javax.swing.table.DefaultTableCellRenderer$UIResource"+ , "javax.swing.table.DefaultTableColumnModel"+ , "javax.swing.table.DefaultTableModel"+ , "javax.swing.table.JTableHeader"+ , "javax.swing.table.TableCellEditor"+ , "javax.swing.table.TableCellRenderer"+ , "javax.swing.table.TableColumn"+ , "javax.swing.table.TableColumnModel"+ , "javax.swing.table.TableModel"+ , "javax.swing.table.TableRowSorter"+ , "javax.swing.table.TableStringConverter"+ , "javax.swing.text.AbstractDocument"+ , "javax.swing.text.AbstractDocument$AttributeContext"+ , "javax.swing.text.AbstractDocument$Content"+ , "javax.swing.text.AbstractDocument$ElementEdit"+ , "javax.swing.text.AbstractWriter"+ , "javax.swing.text.AsyncBoxView"+ , "javax.swing.text.AttributeSet"+ , "javax.swing.text.AttributeSet$CharacterAttribute"+ , "javax.swing.text.AttributeSet$ColorAttribute"+ , "javax.swing.text.AttributeSet$FontAttribute"+ , "javax.swing.text.AttributeSet$ParagraphAttribute"+ , "javax.swing.text.BadLocationException"+ , "javax.swing.text.BoxView"+ , "javax.swing.text.Caret"+ , "javax.swing.text.ChangedCharSetException"+ , "javax.swing.text.ComponentView"+ , "javax.swing.text.CompositeView"+ , "javax.swing.text.DateFormatter"+ , "javax.swing.text.DefaultCaret"+ , "javax.swing.text.DefaultEditorKit"+ , "javax.swing.text.DefaultEditorKit$BeepAction"+ , "javax.swing.text.DefaultEditorKit$CopyAction"+ , "javax.swing.text.DefaultEditorKit$CutAction"+ , "javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction"+ , "javax.swing.text.DefaultEditorKit$InsertBreakAction"+ , "javax.swing.text.DefaultEditorKit$InsertContentAction"+ , "javax.swing.text.DefaultEditorKit$InsertTabAction"+ , "javax.swing.text.DefaultEditorKit$PasteAction"+ , "javax.swing.text.DefaultFormatter"+ , "javax.swing.text.DefaultFormatterFactory"+ , "javax.swing.text.DefaultHighlighter"+ , "javax.swing.text.DefaultHighlighter$DefaultHighlightPainter"+ , "javax.swing.text.DefaultStyledDocument"+ , "javax.swing.text.DefaultStyledDocument$AttributeUndoableEdit"+ , "javax.swing.text.DefaultStyledDocument$ElementSpec"+ , "javax.swing.text.DefaultTextUI"+ , "javax.swing.text.Document"+ , "javax.swing.text.DocumentFilter"+ , "javax.swing.text.DocumentFilter$FilterBypass"+ , "javax.swing.text.EditorKit"+ , "javax.swing.text.Element"+ , "javax.swing.text.ElementIterator"+ , "javax.swing.text.FieldView"+ , "javax.swing.text.FlowView"+ , "javax.swing.text.FlowView$FlowStrategy"+ , "javax.swing.text.GapContent"+ , "javax.swing.text.GlyphView"+ , "javax.swing.text.GlyphView$GlyphPainter"+ , "javax.swing.text.Highlighter"+ , "javax.swing.text.Highlighter$Highlight"+ , "javax.swing.text.Highlighter$HighlightPainter"+ , "javax.swing.text.IconView"+ , "javax.swing.text.InternationalFormatter"+ , "javax.swing.text.JTextComponent"+ , "javax.swing.text.JTextComponent$DropLocation"+ , "javax.swing.text.JTextComponent$KeyBinding"+ , "javax.swing.text.Keymap"+ , "javax.swing.text.LabelView"+ , "javax.swing.text.LayeredHighlighter"+ , "javax.swing.text.LayeredHighlighter$LayerPainter"+ , "javax.swing.text.LayoutQueue"+ , "javax.swing.text.MaskFormatter"+ , "javax.swing.text.MutableAttributeSet"+ , "javax.swing.text.NavigationFilter"+ , "javax.swing.text.NavigationFilter$FilterBypass"+ , "javax.swing.text.NumberFormatter"+ , "javax.swing.text.ParagraphView"+ , "javax.swing.text.PasswordView"+ , "javax.swing.text.PlainDocument"+ , "javax.swing.text.PlainView"+ , "javax.swing.text.Position"+ , "javax.swing.text.Position$Bias"+ , "javax.swing.text.Segment"+ , "javax.swing.text.SimpleAttributeSet"+ , "javax.swing.text.StringContent"+ , "javax.swing.text.Style"+ , "javax.swing.text.StyleConstants"+ , "javax.swing.text.StyleConstants$CharacterConstants"+ , "javax.swing.text.StyleConstants$ColorConstants"+ , "javax.swing.text.StyleConstants$FontConstants"+ , "javax.swing.text.StyleConstants$ParagraphConstants"+ , "javax.swing.text.StyleContext"+ , "javax.swing.text.StyledDocument"+ , "javax.swing.text.StyledEditorKit"+ , "javax.swing.text.StyledEditorKit$AlignmentAction"+ , "javax.swing.text.StyledEditorKit$BoldAction"+ , "javax.swing.text.StyledEditorKit$FontFamilyAction"+ , "javax.swing.text.StyledEditorKit$FontSizeAction"+ , "javax.swing.text.StyledEditorKit$ForegroundAction"+ , "javax.swing.text.StyledEditorKit$ItalicAction"+ , "javax.swing.text.StyledEditorKit$StyledTextAction"+ , "javax.swing.text.StyledEditorKit$UnderlineAction"+ , "javax.swing.text.TabExpander"+ , "javax.swing.text.TabSet"+ , "javax.swing.text.TabStop"+ , "javax.swing.text.TabableView"+ , "javax.swing.text.TableView"+ , "javax.swing.text.TextAction"+ , "javax.swing.text.Utilities"+ , "javax.swing.text.View"+ , "javax.swing.text.ViewFactory"+ , "javax.swing.text.WrappedPlainView"+ , "javax.swing.text.ZoneView"+ , "javax.swing.text.html.BlockView"+ , "javax.swing.text.html.CSS"+ , "javax.swing.text.html.CSS$Attribute"+ , "javax.swing.text.html.FormSubmitEvent"+ , "javax.swing.text.html.FormSubmitEvent$MethodType"+ , "javax.swing.text.html.FormView"+ , "javax.swing.text.html.HTML"+ , "javax.swing.text.html.HTML$Attribute"+ , "javax.swing.text.html.HTML$Tag"+ , "javax.swing.text.html.HTML$UnknownTag"+ , "javax.swing.text.html.HTMLDocument"+ , "javax.swing.text.html.HTMLDocument$Iterator"+ , "javax.swing.text.html.HTMLEditorKit"+ , "javax.swing.text.html.HTMLEditorKit$HTMLFactory"+ , "javax.swing.text.html.HTMLEditorKit$HTMLTextAction"+ , "javax.swing.text.html.HTMLEditorKit$InsertHTMLTextAction"+ , "javax.swing.text.html.HTMLEditorKit$LinkController"+ , "javax.swing.text.html.HTMLEditorKit$Parser"+ , "javax.swing.text.html.HTMLEditorKit$ParserCallback"+ , "javax.swing.text.html.HTMLFrameHyperlinkEvent"+ , "javax.swing.text.html.HTMLWriter"+ , "javax.swing.text.html.ImageView"+ , "javax.swing.text.html.InlineView"+ , "javax.swing.text.html.ListView"+ , "javax.swing.text.html.MinimalHTMLWriter"+ , "javax.swing.text.html.ObjectView"+ , "javax.swing.text.html.Option"+ , "javax.swing.text.html.ParagraphView"+ , "javax.swing.text.html.StyleSheet"+ , "javax.swing.text.html.StyleSheet$BoxPainter"+ , "javax.swing.text.html.StyleSheet$ListPainter"+ , "javax.swing.text.html.parser.AttributeList"+ , "javax.swing.text.html.parser.ContentModel"+ , "javax.swing.text.html.parser.DTD"+ , "javax.swing.text.html.parser.DTDConstants"+ , "javax.swing.text.html.parser.DocumentParser"+ , "javax.swing.text.html.parser.Element"+ , "javax.swing.text.html.parser.Entity"+ , "javax.swing.text.html.parser.Parser"+ , "javax.swing.text.html.parser.ParserDelegator"+ , "javax.swing.text.html.parser.TagElement"+ , "javax.swing.text.rtf.RTFEditorKit"+ , "javax.swing.tree.AbstractLayoutCache"+ , "javax.swing.tree.AbstractLayoutCache$NodeDimensions"+ , "javax.swing.tree.DefaultMutableTreeNode"+ , "javax.swing.tree.DefaultTreeCellEditor"+ , "javax.swing.tree.DefaultTreeCellRenderer"+ , "javax.swing.tree.DefaultTreeModel"+ , "javax.swing.tree.DefaultTreeSelectionModel"+ , "javax.swing.tree.ExpandVetoException"+ , "javax.swing.tree.FixedHeightLayoutCache"+ , "javax.swing.tree.MutableTreeNode"+ , "javax.swing.tree.RowMapper"+ , "javax.swing.tree.TreeCellEditor"+ , "javax.swing.tree.TreeCellRenderer"+ , "javax.swing.tree.TreeModel"+ , "javax.swing.tree.TreeNode"+ , "javax.swing.tree.TreePath"+ , "javax.swing.tree.TreeSelectionModel"+ , "javax.swing.tree.VariableHeightLayoutCache"+ , "javax.swing.undo.AbstractUndoableEdit"+ , "javax.swing.undo.CannotRedoException"+ , "javax.swing.undo.CannotUndoException"+ , "javax.swing.undo.CompoundEdit"+ , "javax.swing.undo.StateEdit"+ , "javax.swing.undo.StateEditable"+ , "javax.swing.undo.UndoManager"+ , "javax.swing.undo.UndoableEdit"+ , "javax.swing.undo.UndoableEditSupport"+ , "javax.tools.Diagnostic"+ , "javax.tools.Diagnostic$Kind"+ , "javax.tools.DiagnosticCollector"+ , "javax.tools.DiagnosticListener"+ , "javax.tools.FileObject"+ , "javax.tools.ForwardingFileObject"+ , "javax.tools.ForwardingJavaFileManager"+ , "javax.tools.ForwardingJavaFileObject"+ , "javax.tools.JavaCompiler"+ , "javax.tools.JavaCompiler$CompilationTask"+ , "javax.tools.JavaFileManager"+ , "javax.tools.JavaFileManager$Location"+ , "javax.tools.JavaFileObject"+ , "javax.tools.JavaFileObject$Kind"+ , "javax.tools.OptionChecker"+ , "javax.tools.SimpleJavaFileObject"+ , "javax.tools.StandardJavaFileManager"+ , "javax.tools.StandardLocation"+ , "javax.tools.Tool"+ , "javax.tools.ToolProvider"+ , "javax.transaction.InvalidTransactionException"+ , "javax.transaction.TransactionRequiredException"+ , "javax.transaction.TransactionRolledbackException"+ , "javax.transaction.xa.XAException"+ , "javax.transaction.xa.XAResource"+ , "javax.transaction.xa.Xid"+ , "javax.xml.XMLConstants"+ , "javax.xml.bind.Binder"+ , "javax.xml.bind.DataBindingException"+ , "javax.xml.bind.DatatypeConverter"+ , "javax.xml.bind.DatatypeConverterInterface"+ , "javax.xml.bind.Element"+ , "javax.xml.bind.JAXB"+ , "javax.xml.bind.JAXBContext"+ , "javax.xml.bind.JAXBElement"+ , "javax.xml.bind.JAXBElement$GlobalScope"+ , "javax.xml.bind.JAXBException"+ , "javax.xml.bind.JAXBIntrospector"+ , "javax.xml.bind.MarshalException"+ , "javax.xml.bind.Marshaller"+ , "javax.xml.bind.Marshaller$Listener"+ , "javax.xml.bind.NotIdentifiableEvent"+ , "javax.xml.bind.ParseConversionEvent"+ , "javax.xml.bind.PrintConversionEvent"+ , "javax.xml.bind.PropertyException"+ , "javax.xml.bind.SchemaOutputResolver"+ , "javax.xml.bind.TypeConstraintException"+ , "javax.xml.bind.UnmarshalException"+ , "javax.xml.bind.Unmarshaller"+ , "javax.xml.bind.Unmarshaller$Listener"+ , "javax.xml.bind.UnmarshallerHandler"+ , "javax.xml.bind.ValidationEvent"+ , "javax.xml.bind.ValidationEventHandler"+ , "javax.xml.bind.ValidationEventLocator"+ , "javax.xml.bind.ValidationException"+ , "javax.xml.bind.Validator"+ , "javax.xml.bind.annotation.DomHandler"+ , "javax.xml.bind.annotation.W3CDomHandler"+ , "javax.xml.bind.annotation.XmlAccessOrder"+ , "javax.xml.bind.annotation.XmlAccessType"+ , "javax.xml.bind.annotation.XmlAccessorOrder"+ , "javax.xml.bind.annotation.XmlAccessorType"+ , "javax.xml.bind.annotation.XmlAnyAttribute"+ , "javax.xml.bind.annotation.XmlAnyElement"+ , "javax.xml.bind.annotation.XmlAttachmentRef"+ , "javax.xml.bind.annotation.XmlAttribute"+ , "javax.xml.bind.annotation.XmlElement"+ , "javax.xml.bind.annotation.XmlElement$DEFAULT"+ , "javax.xml.bind.annotation.XmlElementDecl"+ , "javax.xml.bind.annotation.XmlElementDecl$GLOBAL"+ , "javax.xml.bind.annotation.XmlElementRef"+ , "javax.xml.bind.annotation.XmlElementRef$DEFAULT"+ , "javax.xml.bind.annotation.XmlElementRefs"+ , "javax.xml.bind.annotation.XmlElementWrapper"+ , "javax.xml.bind.annotation.XmlElements"+ , "javax.xml.bind.annotation.XmlEnum"+ , "javax.xml.bind.annotation.XmlEnumValue"+ , "javax.xml.bind.annotation.XmlID"+ , "javax.xml.bind.annotation.XmlIDREF"+ , "javax.xml.bind.annotation.XmlInlineBinaryData"+ , "javax.xml.bind.annotation.XmlList"+ , "javax.xml.bind.annotation.XmlMimeType"+ , "javax.xml.bind.annotation.XmlMixed"+ , "javax.xml.bind.annotation.XmlNs"+ , "javax.xml.bind.annotation.XmlNsForm"+ , "javax.xml.bind.annotation.XmlRegistry"+ , "javax.xml.bind.annotation.XmlRootElement"+ , "javax.xml.bind.annotation.XmlSchema"+ , "javax.xml.bind.annotation.XmlSchemaType"+ , "javax.xml.bind.annotation.XmlSchemaType$DEFAULT"+ , "javax.xml.bind.annotation.XmlSchemaTypes"+ , "javax.xml.bind.annotation.XmlSeeAlso"+ , "javax.xml.bind.annotation.XmlTransient"+ , "javax.xml.bind.annotation.XmlType"+ , "javax.xml.bind.annotation.XmlType$DEFAULT"+ , "javax.xml.bind.annotation.XmlValue"+ , "javax.xml.bind.annotation.adapters.CollapsedStringAdapter"+ , "javax.xml.bind.annotation.adapters.HexBinaryAdapter"+ , "javax.xml.bind.annotation.adapters.NormalizedStringAdapter"+ , "javax.xml.bind.annotation.adapters.XmlAdapter"+ , "javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter"+ , "javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter$DEFAULT"+ , "javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters"+ , "javax.xml.bind.attachment.AttachmentMarshaller"+ , "javax.xml.bind.attachment.AttachmentUnmarshaller"+ , "javax.xml.bind.helpers.AbstractMarshallerImpl"+ , "javax.xml.bind.helpers.AbstractUnmarshallerImpl"+ , "javax.xml.bind.helpers.DefaultValidationEventHandler"+ , "javax.xml.bind.helpers.NotIdentifiableEventImpl"+ , "javax.xml.bind.helpers.ParseConversionEventImpl"+ , "javax.xml.bind.helpers.PrintConversionEventImpl"+ , "javax.xml.bind.helpers.ValidationEventImpl"+ , "javax.xml.bind.helpers.ValidationEventLocatorImpl"+ , "javax.xml.bind.util.JAXBResult"+ , "javax.xml.bind.util.JAXBSource"+ , "javax.xml.bind.util.ValidationEventCollector"+ , "javax.xml.crypto.AlgorithmMethod"+ , "javax.xml.crypto.Data"+ , "javax.xml.crypto.KeySelector"+ , "javax.xml.crypto.KeySelector$Purpose"+ , "javax.xml.crypto.KeySelectorException"+ , "javax.xml.crypto.KeySelectorResult"+ , "javax.xml.crypto.MarshalException"+ , "javax.xml.crypto.NoSuchMechanismException"+ , "javax.xml.crypto.NodeSetData"+ , "javax.xml.crypto.OctetStreamData"+ , "javax.xml.crypto.URIDereferencer"+ , "javax.xml.crypto.URIReference"+ , "javax.xml.crypto.URIReferenceException"+ , "javax.xml.crypto.XMLCryptoContext"+ , "javax.xml.crypto.XMLStructure"+ , "javax.xml.crypto.dom.DOMCryptoContext"+ , "javax.xml.crypto.dom.DOMStructure"+ , "javax.xml.crypto.dom.DOMURIReference"+ , "javax.xml.crypto.dsig.CanonicalizationMethod"+ , "javax.xml.crypto.dsig.DigestMethod"+ , "javax.xml.crypto.dsig.Manifest"+ , "javax.xml.crypto.dsig.Reference"+ , "javax.xml.crypto.dsig.SignatureMethod"+ , "javax.xml.crypto.dsig.SignatureProperties"+ , "javax.xml.crypto.dsig.SignatureProperty"+ , "javax.xml.crypto.dsig.SignedInfo"+ , "javax.xml.crypto.dsig.Transform"+ , "javax.xml.crypto.dsig.TransformException"+ , "javax.xml.crypto.dsig.TransformService"+ , "javax.xml.crypto.dsig.XMLObject"+ , "javax.xml.crypto.dsig.XMLSignContext"+ , "javax.xml.crypto.dsig.XMLSignature"+ , "javax.xml.crypto.dsig.XMLSignature$SignatureValue"+ , "javax.xml.crypto.dsig.XMLSignatureException"+ , "javax.xml.crypto.dsig.XMLSignatureFactory"+ , "javax.xml.crypto.dsig.XMLValidateContext"+ , "javax.xml.crypto.dsig.dom.DOMSignContext"+ , "javax.xml.crypto.dsig.dom.DOMValidateContext"+ , "javax.xml.crypto.dsig.keyinfo.KeyInfo"+ , "javax.xml.crypto.dsig.keyinfo.KeyInfoFactory"+ , "javax.xml.crypto.dsig.keyinfo.KeyName"+ , "javax.xml.crypto.dsig.keyinfo.KeyValue"+ , "javax.xml.crypto.dsig.keyinfo.PGPData"+ , "javax.xml.crypto.dsig.keyinfo.RetrievalMethod"+ , "javax.xml.crypto.dsig.keyinfo.X509Data"+ , "javax.xml.crypto.dsig.keyinfo.X509IssuerSerial"+ , "javax.xml.crypto.dsig.spec.C14NMethodParameterSpec"+ , "javax.xml.crypto.dsig.spec.DigestMethodParameterSpec"+ , "javax.xml.crypto.dsig.spec.ExcC14NParameterSpec"+ , "javax.xml.crypto.dsig.spec.HMACParameterSpec"+ , "javax.xml.crypto.dsig.spec.SignatureMethodParameterSpec"+ , "javax.xml.crypto.dsig.spec.TransformParameterSpec"+ , "javax.xml.crypto.dsig.spec.XPathFilter2ParameterSpec"+ , "javax.xml.crypto.dsig.spec.XPathFilterParameterSpec"+ , "javax.xml.crypto.dsig.spec.XPathType"+ , "javax.xml.crypto.dsig.spec.XPathType$Filter"+ , "javax.xml.crypto.dsig.spec.XSLTTransformParameterSpec"+ , "javax.xml.datatype.DatatypeConfigurationException"+ , "javax.xml.datatype.DatatypeConstants"+ , "javax.xml.datatype.DatatypeConstants$Field"+ , "javax.xml.datatype.DatatypeFactory"+ , "javax.xml.datatype.Duration"+ , "javax.xml.datatype.XMLGregorianCalendar"+ , "javax.xml.namespace.NamespaceContext"+ , "javax.xml.namespace.QName"+ , "javax.xml.parsers.DocumentBuilder"+ , "javax.xml.parsers.DocumentBuilderFactory"+ , "javax.xml.parsers.FactoryConfigurationError"+ , "javax.xml.parsers.ParserConfigurationException"+ , "javax.xml.parsers.SAXParser"+ , "javax.xml.parsers.SAXParserFactory"+ , "javax.xml.soap.AttachmentPart"+ , "javax.xml.soap.Detail"+ , "javax.xml.soap.DetailEntry"+ , "javax.xml.soap.MessageFactory"+ , "javax.xml.soap.MimeHeader"+ , "javax.xml.soap.MimeHeaders"+ , "javax.xml.soap.Name"+ , "javax.xml.soap.Node"+ , "javax.xml.soap.SAAJMetaFactory"+ , "javax.xml.soap.SAAJResult"+ , "javax.xml.soap.SOAPBody"+ , "javax.xml.soap.SOAPBodyElement"+ , "javax.xml.soap.SOAPConnection"+ , "javax.xml.soap.SOAPConnectionFactory"+ , "javax.xml.soap.SOAPConstants"+ , "javax.xml.soap.SOAPElement"+ , "javax.xml.soap.SOAPElementFactory"+ , "javax.xml.soap.SOAPEnvelope"+ , "javax.xml.soap.SOAPException"+ , "javax.xml.soap.SOAPFactory"+ , "javax.xml.soap.SOAPFault"+ , "javax.xml.soap.SOAPFaultElement"+ , "javax.xml.soap.SOAPHeader"+ , "javax.xml.soap.SOAPHeaderElement"+ , "javax.xml.soap.SOAPMessage"+ , "javax.xml.soap.SOAPPart"+ , "javax.xml.soap.Text"+ , "javax.xml.stream.EventFilter"+ , "javax.xml.stream.FactoryConfigurationError"+ , "javax.xml.stream.Location"+ , "javax.xml.stream.StreamFilter"+ , "javax.xml.stream.XMLEventFactory"+ , "javax.xml.stream.XMLEventReader"+ , "javax.xml.stream.XMLEventWriter"+ , "javax.xml.stream.XMLInputFactory"+ , "javax.xml.stream.XMLOutputFactory"+ , "javax.xml.stream.XMLReporter"+ , "javax.xml.stream.XMLResolver"+ , "javax.xml.stream.XMLStreamConstants"+ , "javax.xml.stream.XMLStreamException"+ , "javax.xml.stream.XMLStreamReader"+ , "javax.xml.stream.XMLStreamWriter"+ , "javax.xml.stream.events.Attribute"+ , "javax.xml.stream.events.Characters"+ , "javax.xml.stream.events.Comment"+ , "javax.xml.stream.events.DTD"+ , "javax.xml.stream.events.EndDocument"+ , "javax.xml.stream.events.EndElement"+ , "javax.xml.stream.events.EntityDeclaration"+ , "javax.xml.stream.events.EntityReference"+ , "javax.xml.stream.events.Namespace"+ , "javax.xml.stream.events.NotationDeclaration"+ , "javax.xml.stream.events.ProcessingInstruction"+ , "javax.xml.stream.events.StartDocument"+ , "javax.xml.stream.events.StartElement"+ , "javax.xml.stream.events.XMLEvent"+ , "javax.xml.stream.util.EventReaderDelegate"+ , "javax.xml.stream.util.StreamReaderDelegate"+ , "javax.xml.stream.util.XMLEventAllocator"+ , "javax.xml.stream.util.XMLEventConsumer"+ , "javax.xml.transform.ErrorListener"+ , "javax.xml.transform.OutputKeys"+ , "javax.xml.transform.Result"+ , "javax.xml.transform.Source"+ , "javax.xml.transform.SourceLocator"+ , "javax.xml.transform.Templates"+ , "javax.xml.transform.Transformer"+ , "javax.xml.transform.TransformerConfigurationException"+ , "javax.xml.transform.TransformerException"+ , "javax.xml.transform.TransformerFactory"+ , "javax.xml.transform.TransformerFactoryConfigurationError"+ , "javax.xml.transform.URIResolver"+ , "javax.xml.transform.dom.DOMLocator"+ , "javax.xml.transform.dom.DOMResult"+ , "javax.xml.transform.dom.DOMSource"+ , "javax.xml.transform.sax.SAXResult"+ , "javax.xml.transform.sax.SAXSource"+ , "javax.xml.transform.sax.SAXTransformerFactory"+ , "javax.xml.transform.sax.TemplatesHandler"+ , "javax.xml.transform.sax.TransformerHandler"+ , "javax.xml.transform.stax.StAXResult"+ , "javax.xml.transform.stax.StAXSource"+ , "javax.xml.transform.stream.StreamResult"+ , "javax.xml.transform.stream.StreamSource"+ , "javax.xml.validation.Schema"+ , "javax.xml.validation.SchemaFactory"+ , "javax.xml.validation.SchemaFactoryLoader"+ , "javax.xml.validation.TypeInfoProvider"+ , "javax.xml.validation.Validator"+ , "javax.xml.validation.ValidatorHandler"+ , "javax.xml.ws.Action"+ , "javax.xml.ws.AsyncHandler"+ , "javax.xml.ws.Binding"+ , "javax.xml.ws.BindingProvider"+ , "javax.xml.ws.BindingType"+ , "javax.xml.ws.Dispatch"+ , "javax.xml.ws.Endpoint"+ , "javax.xml.ws.EndpointReference"+ , "javax.xml.ws.FaultAction"+ , "javax.xml.ws.Holder"+ , "javax.xml.ws.LogicalMessage"+ , "javax.xml.ws.ProtocolException"+ , "javax.xml.ws.Provider"+ , "javax.xml.ws.RequestWrapper"+ , "javax.xml.ws.RespectBinding"+ , "javax.xml.ws.RespectBindingFeature"+ , "javax.xml.ws.Response"+ , "javax.xml.ws.ResponseWrapper"+ , "javax.xml.ws.Service"+ , "javax.xml.ws.Service$Mode"+ , "javax.xml.ws.ServiceMode"+ , "javax.xml.ws.WebEndpoint"+ , "javax.xml.ws.WebFault"+ , "javax.xml.ws.WebServiceClient"+ , "javax.xml.ws.WebServiceContext"+ , "javax.xml.ws.WebServiceException"+ , "javax.xml.ws.WebServiceFeature"+ , "javax.xml.ws.WebServicePermission"+ , "javax.xml.ws.WebServiceProvider"+ , "javax.xml.ws.WebServiceRef"+ , "javax.xml.ws.WebServiceRefs"+ , "javax.xml.ws.handler.Handler"+ , "javax.xml.ws.handler.HandlerResolver"+ , "javax.xml.ws.handler.LogicalHandler"+ , "javax.xml.ws.handler.LogicalMessageContext"+ , "javax.xml.ws.handler.MessageContext"+ , "javax.xml.ws.handler.MessageContext$Scope"+ , "javax.xml.ws.handler.PortInfo"+ , "javax.xml.ws.handler.soap.SOAPHandler"+ , "javax.xml.ws.handler.soap.SOAPMessageContext"+ , "javax.xml.ws.http.HTTPBinding"+ , "javax.xml.ws.http.HTTPException"+ , "javax.xml.ws.soap.Addressing"+ , "javax.xml.ws.soap.AddressingFeature"+ , "javax.xml.ws.soap.MTOM"+ , "javax.xml.ws.soap.MTOMFeature"+ , "javax.xml.ws.soap.SOAPBinding"+ , "javax.xml.ws.soap.SOAPFaultException"+ , "javax.xml.ws.spi.Provider"+ , "javax.xml.ws.spi.ServiceDelegate"+ , "javax.xml.ws.spi.WebServiceFeatureAnnotation"+ , "javax.xml.ws.wsaddressing.W3CEndpointReference"+ , "javax.xml.ws.wsaddressing.W3CEndpointReferenceBuilder"+ , "javax.xml.xpath.XPath"+ , "javax.xml.xpath.XPathConstants"+ , "javax.xml.xpath.XPathException"+ , "javax.xml.xpath.XPathExpression"+ , "javax.xml.xpath.XPathExpressionException"+ , "javax.xml.xpath.XPathFactory"+ , "javax.xml.xpath.XPathFactoryConfigurationException"+ , "javax.xml.xpath.XPathFunction"+ , "javax.xml.xpath.XPathFunctionException"+ , "javax.xml.xpath.XPathFunctionResolver"+ , "javax.xml.xpath.XPathVariableResolver"+ , "org.ietf.jgss.ChannelBinding"+ , "org.ietf.jgss.GSSContext"+ , "org.ietf.jgss.GSSCredential"+ , "org.ietf.jgss.GSSException"+ , "org.ietf.jgss.GSSManager"+ , "org.ietf.jgss.GSSName"+ , "org.ietf.jgss.MessageProp"+ , "org.ietf.jgss.Oid"+ , "org.omg.CORBA.ACTIVITY_COMPLETED"+ , "org.omg.CORBA.ACTIVITY_REQUIRED"+ , "org.omg.CORBA.ARG_IN"+ , "org.omg.CORBA.ARG_INOUT"+ , "org.omg.CORBA.ARG_OUT"+ , "org.omg.CORBA.Any"+ , "org.omg.CORBA.AnyHolder"+ , "org.omg.CORBA.AnySeqHelper"+ , "org.omg.CORBA.AnySeqHolder"+ , "org.omg.CORBA.BAD_CONTEXT"+ , "org.omg.CORBA.BAD_INV_ORDER"+ , "org.omg.CORBA.BAD_OPERATION"+ , "org.omg.CORBA.BAD_PARAM"+ , "org.omg.CORBA.BAD_POLICY"+ , "org.omg.CORBA.BAD_POLICY_TYPE"+ , "org.omg.CORBA.BAD_POLICY_VALUE"+ , "org.omg.CORBA.BAD_QOS"+ , "org.omg.CORBA.BAD_TYPECODE"+ , "org.omg.CORBA.BooleanHolder"+ , "org.omg.CORBA.BooleanSeqHelper"+ , "org.omg.CORBA.BooleanSeqHolder"+ , "org.omg.CORBA.Bounds"+ , "org.omg.CORBA.ByteHolder"+ , "org.omg.CORBA.CODESET_INCOMPATIBLE"+ , "org.omg.CORBA.COMM_FAILURE"+ , "org.omg.CORBA.CTX_RESTRICT_SCOPE"+ , "org.omg.CORBA.CharHolder"+ , "org.omg.CORBA.CharSeqHelper"+ , "org.omg.CORBA.CharSeqHolder"+ , "org.omg.CORBA.CompletionStatus"+ , "org.omg.CORBA.CompletionStatusHelper"+ , "org.omg.CORBA.Context"+ , "org.omg.CORBA.ContextList"+ , "org.omg.CORBA.Current"+ , "org.omg.CORBA.CurrentHelper"+ , "org.omg.CORBA.CurrentHolder"+ , "org.omg.CORBA.CurrentOperations"+ , "org.omg.CORBA.CustomMarshal"+ , "org.omg.CORBA.DATA_CONVERSION"+ , "org.omg.CORBA.DataInputStream"+ , "org.omg.CORBA.DataOutputStream"+ , "org.omg.CORBA.DefinitionKind"+ , "org.omg.CORBA.DefinitionKindHelper"+ , "org.omg.CORBA.DomainManager"+ , "org.omg.CORBA.DomainManagerOperations"+ , "org.omg.CORBA.DoubleHolder"+ , "org.omg.CORBA.DoubleSeqHelper"+ , "org.omg.CORBA.DoubleSeqHolder"+ , "org.omg.CORBA.DynAny"+ , "org.omg.CORBA.DynAnyPackage.Invalid"+ , "org.omg.CORBA.DynAnyPackage.InvalidSeq"+ , "org.omg.CORBA.DynAnyPackage.InvalidValue"+ , "org.omg.CORBA.DynAnyPackage.TypeMismatch"+ , "org.omg.CORBA.DynArray"+ , "org.omg.CORBA.DynEnum"+ , "org.omg.CORBA.DynFixed"+ , "org.omg.CORBA.DynSequence"+ , "org.omg.CORBA.DynStruct"+ , "org.omg.CORBA.DynUnion"+ , "org.omg.CORBA.DynValue"+ , "org.omg.CORBA.DynamicImplementation"+ , "org.omg.CORBA.Environment"+ , "org.omg.CORBA.ExceptionList"+ , "org.omg.CORBA.FREE_MEM"+ , "org.omg.CORBA.FieldNameHelper"+ , "org.omg.CORBA.FixedHolder"+ , "org.omg.CORBA.FloatHolder"+ , "org.omg.CORBA.FloatSeqHelper"+ , "org.omg.CORBA.FloatSeqHolder"+ , "org.omg.CORBA.IDLType"+ , "org.omg.CORBA.IDLTypeHelper"+ , "org.omg.CORBA.IDLTypeOperations"+ , "org.omg.CORBA.IMP_LIMIT"+ , "org.omg.CORBA.INITIALIZE"+ , "org.omg.CORBA.INTERNAL"+ , "org.omg.CORBA.INTF_REPOS"+ , "org.omg.CORBA.INVALID_ACTIVITY"+ , "org.omg.CORBA.INVALID_TRANSACTION"+ , "org.omg.CORBA.INV_FLAG"+ , "org.omg.CORBA.INV_IDENT"+ , "org.omg.CORBA.INV_OBJREF"+ , "org.omg.CORBA.INV_POLICY"+ , "org.omg.CORBA.IRObject"+ , "org.omg.CORBA.IRObjectOperations"+ , "org.omg.CORBA.IdentifierHelper"+ , "org.omg.CORBA.IntHolder"+ , "org.omg.CORBA.LocalObject"+ , "org.omg.CORBA.LongHolder"+ , "org.omg.CORBA.LongLongSeqHelper"+ , "org.omg.CORBA.LongLongSeqHolder"+ , "org.omg.CORBA.LongSeqHelper"+ , "org.omg.CORBA.LongSeqHolder"+ , "org.omg.CORBA.MARSHAL"+ , "org.omg.CORBA.NO_IMPLEMENT"+ , "org.omg.CORBA.NO_MEMORY"+ , "org.omg.CORBA.NO_PERMISSION"+ , "org.omg.CORBA.NO_RESOURCES"+ , "org.omg.CORBA.NO_RESPONSE"+ , "org.omg.CORBA.NVList"+ , "org.omg.CORBA.NameValuePair"+ , "org.omg.CORBA.NameValuePairHelper"+ , "org.omg.CORBA.NamedValue"+ , "org.omg.CORBA.OBJECT_NOT_EXIST"+ , "org.omg.CORBA.OBJ_ADAPTER"+ , "org.omg.CORBA.OMGVMCID"+ , "org.omg.CORBA.ORB"+ , "org.omg.CORBA.ORBPackage.InconsistentTypeCode"+ , "org.omg.CORBA.ORBPackage.InvalidName"+ , "org.omg.CORBA.Object"+ , "org.omg.CORBA.ObjectHelper"+ , "org.omg.CORBA.ObjectHolder"+ , "org.omg.CORBA.OctetSeqHelper"+ , "org.omg.CORBA.OctetSeqHolder"+ , "org.omg.CORBA.PERSIST_STORE"+ , "org.omg.CORBA.PRIVATE_MEMBER"+ , "org.omg.CORBA.PUBLIC_MEMBER"+ , "org.omg.CORBA.ParameterMode"+ , "org.omg.CORBA.ParameterModeHelper"+ , "org.omg.CORBA.ParameterModeHolder"+ , "org.omg.CORBA.Policy"+ , "org.omg.CORBA.PolicyError"+ , "org.omg.CORBA.PolicyErrorCodeHelper"+ , "org.omg.CORBA.PolicyErrorHelper"+ , "org.omg.CORBA.PolicyErrorHolder"+ , "org.omg.CORBA.PolicyHelper"+ , "org.omg.CORBA.PolicyHolder"+ , "org.omg.CORBA.PolicyListHelper"+ , "org.omg.CORBA.PolicyListHolder"+ , "org.omg.CORBA.PolicyOperations"+ , "org.omg.CORBA.PolicyTypeHelper"+ , "org.omg.CORBA.Principal"+ , "org.omg.CORBA.PrincipalHolder"+ , "org.omg.CORBA.REBIND"+ , "org.omg.CORBA.RepositoryIdHelper"+ , "org.omg.CORBA.Request"+ , "org.omg.CORBA.ServerRequest"+ , "org.omg.CORBA.ServiceDetail"+ , "org.omg.CORBA.ServiceDetailHelper"+ , "org.omg.CORBA.ServiceInformation"+ , "org.omg.CORBA.ServiceInformationHelper"+ , "org.omg.CORBA.ServiceInformationHolder"+ , "org.omg.CORBA.SetOverrideType"+ , "org.omg.CORBA.SetOverrideTypeHelper"+ , "org.omg.CORBA.ShortHolder"+ , "org.omg.CORBA.ShortSeqHelper"+ , "org.omg.CORBA.ShortSeqHolder"+ , "org.omg.CORBA.StringHolder"+ , "org.omg.CORBA.StringSeqHelper"+ , "org.omg.CORBA.StringSeqHolder"+ , "org.omg.CORBA.StringValueHelper"+ , "org.omg.CORBA.StructMember"+ , "org.omg.CORBA.StructMemberHelper"+ , "org.omg.CORBA.SystemException"+ , "org.omg.CORBA.TCKind"+ , "org.omg.CORBA.TIMEOUT"+ , "org.omg.CORBA.TRANSACTION_MODE"+ , "org.omg.CORBA.TRANSACTION_REQUIRED"+ , "org.omg.CORBA.TRANSACTION_ROLLEDBACK"+ , "org.omg.CORBA.TRANSACTION_UNAVAILABLE"+ , "org.omg.CORBA.TRANSIENT"+ , "org.omg.CORBA.TypeCode"+ , "org.omg.CORBA.TypeCodeHolder"+ , "org.omg.CORBA.TypeCodePackage.BadKind"+ , "org.omg.CORBA.TypeCodePackage.Bounds"+ , "org.omg.CORBA.ULongLongSeqHelper"+ , "org.omg.CORBA.ULongLongSeqHolder"+ , "org.omg.CORBA.ULongSeqHelper"+ , "org.omg.CORBA.ULongSeqHolder"+ , "org.omg.CORBA.UNKNOWN"+ , "org.omg.CORBA.UNSUPPORTED_POLICY"+ , "org.omg.CORBA.UNSUPPORTED_POLICY_VALUE"+ , "org.omg.CORBA.UShortSeqHelper"+ , "org.omg.CORBA.UShortSeqHolder"+ , "org.omg.CORBA.UnionMember"+ , "org.omg.CORBA.UnionMemberHelper"+ , "org.omg.CORBA.UnknownUserException"+ , "org.omg.CORBA.UnknownUserExceptionHelper"+ , "org.omg.CORBA.UnknownUserExceptionHolder"+ , "org.omg.CORBA.UserException"+ , "org.omg.CORBA.VM_ABSTRACT"+ , "org.omg.CORBA.VM_CUSTOM"+ , "org.omg.CORBA.VM_NONE"+ , "org.omg.CORBA.VM_TRUNCATABLE"+ , "org.omg.CORBA.ValueBaseHelper"+ , "org.omg.CORBA.ValueBaseHolder"+ , "org.omg.CORBA.ValueMember"+ , "org.omg.CORBA.ValueMemberHelper"+ , "org.omg.CORBA.VersionSpecHelper"+ , "org.omg.CORBA.VisibilityHelper"+ , "org.omg.CORBA.WCharSeqHelper"+ , "org.omg.CORBA.WCharSeqHolder"+ , "org.omg.CORBA.WStringSeqHelper"+ , "org.omg.CORBA.WStringSeqHolder"+ , "org.omg.CORBA.WStringValueHelper"+ , "org.omg.CORBA.WrongTransaction"+ , "org.omg.CORBA.WrongTransactionHelper"+ , "org.omg.CORBA.WrongTransactionHolder"+ , "org.omg.CORBA._IDLTypeStub"+ , "org.omg.CORBA._PolicyStub"+ , "org.omg.CORBA.portable.ApplicationException"+ , "org.omg.CORBA.portable.BoxedValueHelper"+ , "org.omg.CORBA.portable.CustomValue"+ , "org.omg.CORBA.portable.Delegate"+ , "org.omg.CORBA.portable.IDLEntity"+ , "org.omg.CORBA.portable.IndirectionException"+ , "org.omg.CORBA.portable.InputStream"+ , "org.omg.CORBA.portable.InvokeHandler"+ , "org.omg.CORBA.portable.ObjectImpl"+ , "org.omg.CORBA.portable.OutputStream"+ , "org.omg.CORBA.portable.RemarshalException"+ , "org.omg.CORBA.portable.ResponseHandler"+ , "org.omg.CORBA.portable.ServantObject"+ , "org.omg.CORBA.portable.Streamable"+ , "org.omg.CORBA.portable.StreamableValue"+ , "org.omg.CORBA.portable.UnknownException"+ , "org.omg.CORBA.portable.ValueBase"+ , "org.omg.CORBA.portable.ValueFactory"+ , "org.omg.CORBA.portable.ValueInputStream"+ , "org.omg.CORBA.portable.ValueOutputStream"+ , "org.omg.CORBA_2_3.ORB"+ , "org.omg.CORBA_2_3.portable.Delegate"+ , "org.omg.CORBA_2_3.portable.InputStream"+ , "org.omg.CORBA_2_3.portable.ObjectImpl"+ , "org.omg.CORBA_2_3.portable.OutputStream"+ , "org.omg.CosNaming.Binding"+ , "org.omg.CosNaming.BindingHelper"+ , "org.omg.CosNaming.BindingHolder"+ , "org.omg.CosNaming.BindingIterator"+ , "org.omg.CosNaming.BindingIteratorHelper"+ , "org.omg.CosNaming.BindingIteratorHolder"+ , "org.omg.CosNaming.BindingIteratorOperations"+ , "org.omg.CosNaming.BindingIteratorPOA"+ , "org.omg.CosNaming.BindingListHelper"+ , "org.omg.CosNaming.BindingListHolder"+ , "org.omg.CosNaming.BindingType"+ , "org.omg.CosNaming.BindingTypeHelper"+ , "org.omg.CosNaming.BindingTypeHolder"+ , "org.omg.CosNaming.IstringHelper"+ , "org.omg.CosNaming.NameComponent"+ , "org.omg.CosNaming.NameComponentHelper"+ , "org.omg.CosNaming.NameComponentHolder"+ , "org.omg.CosNaming.NameHelper"+ , "org.omg.CosNaming.NameHolder"+ , "org.omg.CosNaming.NamingContext"+ , "org.omg.CosNaming.NamingContextExt"+ , "org.omg.CosNaming.NamingContextExtHelper"+ , "org.omg.CosNaming.NamingContextExtHolder"+ , "org.omg.CosNaming.NamingContextExtOperations"+ , "org.omg.CosNaming.NamingContextExtPOA"+ , "org.omg.CosNaming.NamingContextExtPackage.AddressHelper"+ , "org.omg.CosNaming.NamingContextExtPackage.InvalidAddress"+ , "org.omg.CosNaming.NamingContextExtPackage.InvalidAddressHelper"+ , "org.omg.CosNaming.NamingContextExtPackage.InvalidAddressHolder"+ , "org.omg.CosNaming.NamingContextExtPackage.StringNameHelper"+ , "org.omg.CosNaming.NamingContextExtPackage.URLStringHelper"+ , "org.omg.CosNaming.NamingContextHelper"+ , "org.omg.CosNaming.NamingContextHolder"+ , "org.omg.CosNaming.NamingContextOperations"+ , "org.omg.CosNaming.NamingContextPOA"+ , "org.omg.CosNaming.NamingContextPackage.AlreadyBound"+ , "org.omg.CosNaming.NamingContextPackage.AlreadyBoundHelper"+ , "org.omg.CosNaming.NamingContextPackage.AlreadyBoundHolder"+ , "org.omg.CosNaming.NamingContextPackage.CannotProceed"+ , "org.omg.CosNaming.NamingContextPackage.CannotProceedHelper"+ , "org.omg.CosNaming.NamingContextPackage.CannotProceedHolder"+ , "org.omg.CosNaming.NamingContextPackage.InvalidName"+ , "org.omg.CosNaming.NamingContextPackage.InvalidNameHelper"+ , "org.omg.CosNaming.NamingContextPackage.InvalidNameHolder"+ , "org.omg.CosNaming.NamingContextPackage.NotEmpty"+ , "org.omg.CosNaming.NamingContextPackage.NotEmptyHelper"+ , "org.omg.CosNaming.NamingContextPackage.NotEmptyHolder"+ , "org.omg.CosNaming.NamingContextPackage.NotFound"+ , "org.omg.CosNaming.NamingContextPackage.NotFoundHelper"+ , "org.omg.CosNaming.NamingContextPackage.NotFoundHolder"+ , "org.omg.CosNaming.NamingContextPackage.NotFoundReason"+ , "org.omg.CosNaming.NamingContextPackage.NotFoundReasonHelper"+ , "org.omg.CosNaming.NamingContextPackage.NotFoundReasonHolder"+ , "org.omg.CosNaming._BindingIteratorImplBase"+ , "org.omg.CosNaming._BindingIteratorStub"+ , "org.omg.CosNaming._NamingContextExtStub"+ , "org.omg.CosNaming._NamingContextImplBase"+ , "org.omg.CosNaming._NamingContextStub"+ , "org.omg.Dynamic.Parameter"+ , "org.omg.DynamicAny.AnySeqHelper"+ , "org.omg.DynamicAny.DynAny"+ , "org.omg.DynamicAny.DynAnyFactory"+ , "org.omg.DynamicAny.DynAnyFactoryHelper"+ , "org.omg.DynamicAny.DynAnyFactoryOperations"+ , "org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode"+ , "org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCodeHelper"+ , "org.omg.DynamicAny.DynAnyHelper"+ , "org.omg.DynamicAny.DynAnyOperations"+ , "org.omg.DynamicAny.DynAnyPackage.InvalidValue"+ , "org.omg.DynamicAny.DynAnyPackage.InvalidValueHelper"+ , "org.omg.DynamicAny.DynAnyPackage.TypeMismatch"+ , "org.omg.DynamicAny.DynAnyPackage.TypeMismatchHelper"+ , "org.omg.DynamicAny.DynAnySeqHelper"+ , "org.omg.DynamicAny.DynArray"+ , "org.omg.DynamicAny.DynArrayHelper"+ , "org.omg.DynamicAny.DynArrayOperations"+ , "org.omg.DynamicAny.DynEnum"+ , "org.omg.DynamicAny.DynEnumHelper"+ , "org.omg.DynamicAny.DynEnumOperations"+ , "org.omg.DynamicAny.DynFixed"+ , "org.omg.DynamicAny.DynFixedHelper"+ , "org.omg.DynamicAny.DynFixedOperations"+ , "org.omg.DynamicAny.DynSequence"+ , "org.omg.DynamicAny.DynSequenceHelper"+ , "org.omg.DynamicAny.DynSequenceOperations"+ , "org.omg.DynamicAny.DynStruct"+ , "org.omg.DynamicAny.DynStructHelper"+ , "org.omg.DynamicAny.DynStructOperations"+ , "org.omg.DynamicAny.DynUnion"+ , "org.omg.DynamicAny.DynUnionHelper"+ , "org.omg.DynamicAny.DynUnionOperations"+ , "org.omg.DynamicAny.DynValue"+ , "org.omg.DynamicAny.DynValueBox"+ , "org.omg.DynamicAny.DynValueBoxOperations"+ , "org.omg.DynamicAny.DynValueCommon"+ , "org.omg.DynamicAny.DynValueCommonOperations"+ , "org.omg.DynamicAny.DynValueHelper"+ , "org.omg.DynamicAny.DynValueOperations"+ , "org.omg.DynamicAny.FieldNameHelper"+ , "org.omg.DynamicAny.NameDynAnyPair"+ , "org.omg.DynamicAny.NameDynAnyPairHelper"+ , "org.omg.DynamicAny.NameDynAnyPairSeqHelper"+ , "org.omg.DynamicAny.NameValuePair"+ , "org.omg.DynamicAny.NameValuePairHelper"+ , "org.omg.DynamicAny.NameValuePairSeqHelper"+ , "org.omg.DynamicAny._DynAnyFactoryStub"+ , "org.omg.DynamicAny._DynAnyStub"+ , "org.omg.DynamicAny._DynArrayStub"+ , "org.omg.DynamicAny._DynEnumStub"+ , "org.omg.DynamicAny._DynFixedStub"+ , "org.omg.DynamicAny._DynSequenceStub"+ , "org.omg.DynamicAny._DynStructStub"+ , "org.omg.DynamicAny._DynUnionStub"+ , "org.omg.DynamicAny._DynValueStub"+ , "org.omg.IOP.CodeSets"+ , "org.omg.IOP.Codec"+ , "org.omg.IOP.CodecFactory"+ , "org.omg.IOP.CodecFactoryHelper"+ , "org.omg.IOP.CodecFactoryOperations"+ , "org.omg.IOP.CodecFactoryPackage.UnknownEncoding"+ , "org.omg.IOP.CodecFactoryPackage.UnknownEncodingHelper"+ , "org.omg.IOP.CodecOperations"+ , "org.omg.IOP.CodecPackage.FormatMismatch"+ , "org.omg.IOP.CodecPackage.FormatMismatchHelper"+ , "org.omg.IOP.CodecPackage.InvalidTypeForEncoding"+ , "org.omg.IOP.CodecPackage.InvalidTypeForEncodingHelper"+ , "org.omg.IOP.CodecPackage.TypeMismatch"+ , "org.omg.IOP.CodecPackage.TypeMismatchHelper"+ , "org.omg.IOP.ComponentIdHelper"+ , "org.omg.IOP.ENCODING_CDR_ENCAPS"+ , "org.omg.IOP.Encoding"+ , "org.omg.IOP.ExceptionDetailMessage"+ , "org.omg.IOP.IOR"+ , "org.omg.IOP.IORHelper"+ , "org.omg.IOP.IORHolder"+ , "org.omg.IOP.MultipleComponentProfileHelper"+ , "org.omg.IOP.MultipleComponentProfileHolder"+ , "org.omg.IOP.ProfileIdHelper"+ , "org.omg.IOP.RMICustomMaxStreamFormat"+ , "org.omg.IOP.ServiceContext"+ , "org.omg.IOP.ServiceContextHelper"+ , "org.omg.IOP.ServiceContextHolder"+ , "org.omg.IOP.ServiceContextListHelper"+ , "org.omg.IOP.ServiceContextListHolder"+ , "org.omg.IOP.ServiceIdHelper"+ , "org.omg.IOP.TAG_ALTERNATE_IIOP_ADDRESS"+ , "org.omg.IOP.TAG_CODE_SETS"+ , "org.omg.IOP.TAG_INTERNET_IOP"+ , "org.omg.IOP.TAG_JAVA_CODEBASE"+ , "org.omg.IOP.TAG_MULTIPLE_COMPONENTS"+ , "org.omg.IOP.TAG_ORB_TYPE"+ , "org.omg.IOP.TAG_POLICIES"+ , "org.omg.IOP.TAG_RMI_CUSTOM_MAX_STREAM_FORMAT"+ , "org.omg.IOP.TaggedComponent"+ , "org.omg.IOP.TaggedComponentHelper"+ , "org.omg.IOP.TaggedComponentHolder"+ , "org.omg.IOP.TaggedProfile"+ , "org.omg.IOP.TaggedProfileHelper"+ , "org.omg.IOP.TaggedProfileHolder"+ , "org.omg.IOP.TransactionService"+ , "org.omg.Messaging.SYNC_WITH_TRANSPORT"+ , "org.omg.Messaging.SyncScopeHelper"+ , "org.omg.PortableInterceptor.ACTIVE"+ , "org.omg.PortableInterceptor.AdapterManagerIdHelper"+ , "org.omg.PortableInterceptor.AdapterNameHelper"+ , "org.omg.PortableInterceptor.AdapterStateHelper"+ , "org.omg.PortableInterceptor.ClientRequestInfo"+ , "org.omg.PortableInterceptor.ClientRequestInfoOperations"+ , "org.omg.PortableInterceptor.ClientRequestInterceptor"+ , "org.omg.PortableInterceptor.ClientRequestInterceptorOperations"+ , "org.omg.PortableInterceptor.Current"+ , "org.omg.PortableInterceptor.CurrentHelper"+ , "org.omg.PortableInterceptor.CurrentOperations"+ , "org.omg.PortableInterceptor.DISCARDING"+ , "org.omg.PortableInterceptor.ForwardRequest"+ , "org.omg.PortableInterceptor.ForwardRequestHelper"+ , "org.omg.PortableInterceptor.HOLDING"+ , "org.omg.PortableInterceptor.INACTIVE"+ , "org.omg.PortableInterceptor.IORInfo"+ , "org.omg.PortableInterceptor.IORInfoOperations"+ , "org.omg.PortableInterceptor.IORInterceptor"+ , "org.omg.PortableInterceptor.IORInterceptorOperations"+ , "org.omg.PortableInterceptor.IORInterceptor_3_0"+ , "org.omg.PortableInterceptor.IORInterceptor_3_0Helper"+ , "org.omg.PortableInterceptor.IORInterceptor_3_0Holder"+ , "org.omg.PortableInterceptor.IORInterceptor_3_0Operations"+ , "org.omg.PortableInterceptor.Interceptor"+ , "org.omg.PortableInterceptor.InterceptorOperations"+ , "org.omg.PortableInterceptor.InvalidSlot"+ , "org.omg.PortableInterceptor.InvalidSlotHelper"+ , "org.omg.PortableInterceptor.LOCATION_FORWARD"+ , "org.omg.PortableInterceptor.NON_EXISTENT"+ , "org.omg.PortableInterceptor.ORBIdHelper"+ , "org.omg.PortableInterceptor.ORBInitInfo"+ , "org.omg.PortableInterceptor.ORBInitInfoOperations"+ , "org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName"+ , "org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateNameHelper"+ , "org.omg.PortableInterceptor.ORBInitInfoPackage.InvalidName"+ , "org.omg.PortableInterceptor.ORBInitInfoPackage.InvalidNameHelper"+ , "org.omg.PortableInterceptor.ORBInitInfoPackage.ObjectIdHelper"+ , "org.omg.PortableInterceptor.ORBInitializer"+ , "org.omg.PortableInterceptor.ORBInitializerOperations"+ , "org.omg.PortableInterceptor.ObjectIdHelper"+ , "org.omg.PortableInterceptor.ObjectReferenceFactory"+ , "org.omg.PortableInterceptor.ObjectReferenceFactoryHelper"+ , "org.omg.PortableInterceptor.ObjectReferenceFactoryHolder"+ , "org.omg.PortableInterceptor.ObjectReferenceTemplate"+ , "org.omg.PortableInterceptor.ObjectReferenceTemplateHelper"+ , "org.omg.PortableInterceptor.ObjectReferenceTemplateHolder"+ , "org.omg.PortableInterceptor.ObjectReferenceTemplateSeqHelper"+ , "org.omg.PortableInterceptor.ObjectReferenceTemplateSeqHolder"+ , "org.omg.PortableInterceptor.PolicyFactory"+ , "org.omg.PortableInterceptor.PolicyFactoryOperations"+ , "org.omg.PortableInterceptor.RequestInfo"+ , "org.omg.PortableInterceptor.RequestInfoOperations"+ , "org.omg.PortableInterceptor.SUCCESSFUL"+ , "org.omg.PortableInterceptor.SYSTEM_EXCEPTION"+ , "org.omg.PortableInterceptor.ServerIdHelper"+ , "org.omg.PortableInterceptor.ServerRequestInfo"+ , "org.omg.PortableInterceptor.ServerRequestInfoOperations"+ , "org.omg.PortableInterceptor.ServerRequestInterceptor"+ , "org.omg.PortableInterceptor.ServerRequestInterceptorOperations"+ , "org.omg.PortableInterceptor.TRANSPORT_RETRY"+ , "org.omg.PortableInterceptor.UNKNOWN"+ , "org.omg.PortableInterceptor.USER_EXCEPTION"+ , "org.omg.PortableServer.AdapterActivator"+ , "org.omg.PortableServer.AdapterActivatorOperations"+ , "org.omg.PortableServer.Current"+ , "org.omg.PortableServer.CurrentHelper"+ , "org.omg.PortableServer.CurrentOperations"+ , "org.omg.PortableServer.CurrentPackage.NoContext"+ , "org.omg.PortableServer.CurrentPackage.NoContextHelper"+ , "org.omg.PortableServer.DynamicImplementation"+ , "org.omg.PortableServer.ForwardRequest"+ , "org.omg.PortableServer.ForwardRequestHelper"+ , "org.omg.PortableServer.ID_ASSIGNMENT_POLICY_ID"+ , "org.omg.PortableServer.ID_UNIQUENESS_POLICY_ID"+ , "org.omg.PortableServer.IMPLICIT_ACTIVATION_POLICY_ID"+ , "org.omg.PortableServer.IdAssignmentPolicy"+ , "org.omg.PortableServer.IdAssignmentPolicyOperations"+ , "org.omg.PortableServer.IdAssignmentPolicyValue"+ , "org.omg.PortableServer.IdUniquenessPolicy"+ , "org.omg.PortableServer.IdUniquenessPolicyOperations"+ , "org.omg.PortableServer.IdUniquenessPolicyValue"+ , "org.omg.PortableServer.ImplicitActivationPolicy"+ , "org.omg.PortableServer.ImplicitActivationPolicyOperations"+ , "org.omg.PortableServer.ImplicitActivationPolicyValue"+ , "org.omg.PortableServer.LIFESPAN_POLICY_ID"+ , "org.omg.PortableServer.LifespanPolicy"+ , "org.omg.PortableServer.LifespanPolicyOperations"+ , "org.omg.PortableServer.LifespanPolicyValue"+ , "org.omg.PortableServer.POA"+ , "org.omg.PortableServer.POAHelper"+ , "org.omg.PortableServer.POAManager"+ , "org.omg.PortableServer.POAManagerOperations"+ , "org.omg.PortableServer.POAManagerPackage.AdapterInactive"+ , "org.omg.PortableServer.POAManagerPackage.AdapterInactiveHelper"+ , "org.omg.PortableServer.POAManagerPackage.State"+ , "org.omg.PortableServer.POAOperations"+ , "org.omg.PortableServer.POAPackage.AdapterAlreadyExists"+ , "org.omg.PortableServer.POAPackage.AdapterAlreadyExistsHelper"+ , "org.omg.PortableServer.POAPackage.AdapterNonExistent"+ , "org.omg.PortableServer.POAPackage.AdapterNonExistentHelper"+ , "org.omg.PortableServer.POAPackage.InvalidPolicy"+ , "org.omg.PortableServer.POAPackage.InvalidPolicyHelper"+ , "org.omg.PortableServer.POAPackage.NoServant"+ , "org.omg.PortableServer.POAPackage.NoServantHelper"+ , "org.omg.PortableServer.POAPackage.ObjectAlreadyActive"+ , "org.omg.PortableServer.POAPackage.ObjectAlreadyActiveHelper"+ , "org.omg.PortableServer.POAPackage.ObjectNotActive"+ , "org.omg.PortableServer.POAPackage.ObjectNotActiveHelper"+ , "org.omg.PortableServer.POAPackage.ServantAlreadyActive"+ , "org.omg.PortableServer.POAPackage.ServantAlreadyActiveHelper"+ , "org.omg.PortableServer.POAPackage.ServantNotActive"+ , "org.omg.PortableServer.POAPackage.ServantNotActiveHelper"+ , "org.omg.PortableServer.POAPackage.WrongAdapter"+ , "org.omg.PortableServer.POAPackage.WrongAdapterHelper"+ , "org.omg.PortableServer.POAPackage.WrongPolicy"+ , "org.omg.PortableServer.POAPackage.WrongPolicyHelper"+ , "org.omg.PortableServer.REQUEST_PROCESSING_POLICY_ID"+ , "org.omg.PortableServer.RequestProcessingPolicy"+ , "org.omg.PortableServer.RequestProcessingPolicyOperations"+ , "org.omg.PortableServer.RequestProcessingPolicyValue"+ , "org.omg.PortableServer.SERVANT_RETENTION_POLICY_ID"+ , "org.omg.PortableServer.Servant"+ , "org.omg.PortableServer.ServantActivator"+ , "org.omg.PortableServer.ServantActivatorHelper"+ , "org.omg.PortableServer.ServantActivatorOperations"+ , "org.omg.PortableServer.ServantActivatorPOA"+ , "org.omg.PortableServer.ServantLocator"+ , "org.omg.PortableServer.ServantLocatorHelper"+ , "org.omg.PortableServer.ServantLocatorOperations"+ , "org.omg.PortableServer.ServantLocatorPOA"+ , "org.omg.PortableServer.ServantLocatorPackage.CookieHolder"+ , "org.omg.PortableServer.ServantManager"+ , "org.omg.PortableServer.ServantManagerOperations"+ , "org.omg.PortableServer.ServantRetentionPolicy"+ , "org.omg.PortableServer.ServantRetentionPolicyOperations"+ , "org.omg.PortableServer.ServantRetentionPolicyValue"+ , "org.omg.PortableServer.THREAD_POLICY_ID"+ , "org.omg.PortableServer.ThreadPolicy"+ , "org.omg.PortableServer.ThreadPolicyOperations"+ , "org.omg.PortableServer.ThreadPolicyValue"+ , "org.omg.PortableServer._ServantActivatorStub"+ , "org.omg.PortableServer._ServantLocatorStub"+ , "org.omg.PortableServer.portable.Delegate"+ , "org.omg.SendingContext.RunTime"+ , "org.omg.SendingContext.RunTimeOperations"+ , "org.omg.stub.java.rmi._Remote_Stub"+ , "org.w3c.dom.Attr"+ , "org.w3c.dom.CDATASection"+ , "org.w3c.dom.CharacterData"+ , "org.w3c.dom.Comment"+ , "org.w3c.dom.DOMConfiguration"+ , "org.w3c.dom.DOMError"+ , "org.w3c.dom.DOMErrorHandler"+ , "org.w3c.dom.DOMException"+ , "org.w3c.dom.DOMImplementation"+ , "org.w3c.dom.DOMImplementationList"+ , "org.w3c.dom.DOMImplementationSource"+ , "org.w3c.dom.DOMLocator"+ , "org.w3c.dom.DOMStringList"+ , "org.w3c.dom.Document"+ , "org.w3c.dom.DocumentFragment"+ , "org.w3c.dom.DocumentType"+ , "org.w3c.dom.Element"+ , "org.w3c.dom.Entity"+ , "org.w3c.dom.EntityReference"+ , "org.w3c.dom.NameList"+ , "org.w3c.dom.NamedNodeMap"+ , "org.w3c.dom.Node"+ , "org.w3c.dom.NodeList"+ , "org.w3c.dom.Notation"+ , "org.w3c.dom.ProcessingInstruction"+ , "org.w3c.dom.Text"+ , "org.w3c.dom.TypeInfo"+ , "org.w3c.dom.UserDataHandler"+ , "org.w3c.dom.bootstrap.DOMImplementationRegistry"+ , "org.w3c.dom.events.DocumentEvent"+ , "org.w3c.dom.events.Event"+ , "org.w3c.dom.events.EventException"+ , "org.w3c.dom.events.EventListener"+ , "org.w3c.dom.events.EventTarget"+ , "org.w3c.dom.events.MouseEvent"+ , "org.w3c.dom.events.MutationEvent"+ , "org.w3c.dom.events.UIEvent"+ , "org.w3c.dom.ls.DOMImplementationLS"+ , "org.w3c.dom.ls.LSException"+ , "org.w3c.dom.ls.LSInput"+ , "org.w3c.dom.ls.LSLoadEvent"+ , "org.w3c.dom.ls.LSOutput"+ , "org.w3c.dom.ls.LSParser"+ , "org.w3c.dom.ls.LSParserFilter"+ , "org.w3c.dom.ls.LSProgressEvent"+ , "org.w3c.dom.ls.LSResourceResolver"+ , "org.w3c.dom.ls.LSSerializer"+ , "org.w3c.dom.ls.LSSerializerFilter"+ , "org.xml.sax.AttributeList"+ , "org.xml.sax.Attributes"+ , "org.xml.sax.ContentHandler"+ , "org.xml.sax.DTDHandler"+ , "org.xml.sax.DocumentHandler"+ , "org.xml.sax.EntityResolver"+ , "org.xml.sax.ErrorHandler"+ , "org.xml.sax.HandlerBase"+ , "org.xml.sax.InputSource"+ , "org.xml.sax.Locator"+ , "org.xml.sax.Parser"+ , "org.xml.sax.SAXException"+ , "org.xml.sax.SAXNotRecognizedException"+ , "org.xml.sax.SAXNotSupportedException"+ , "org.xml.sax.SAXParseException"+ , "org.xml.sax.XMLFilter"+ , "org.xml.sax.XMLReader"+ , "org.xml.sax.ext.Attributes2"+ , "org.xml.sax.ext.Attributes2Impl"+ , "org.xml.sax.ext.DeclHandler"+ , "org.xml.sax.ext.DefaultHandler2"+ , "org.xml.sax.ext.EntityResolver2"+ , "org.xml.sax.ext.LexicalHandler"+ , "org.xml.sax.ext.Locator2"+ , "org.xml.sax.ext.Locator2Impl"+ , "org.xml.sax.helpers.AttributeListImpl"+ , "org.xml.sax.helpers.AttributesImpl"+ , "org.xml.sax.helpers.DefaultHandler"+ , "org.xml.sax.helpers.LocatorImpl"+ , "org.xml.sax.helpers.NamespaceSupport"+ , "org.xml.sax.helpers.ParserAdapter"+ , "org.xml.sax.helpers.ParserFactory"+ , "org.xml.sax.helpers.XMLFilterImpl"+ , "org.xml.sax.helpers.XMLReaderAdapter"+ , "org.xml.sax.helpers.XMLReaderFactory" ]++
+ src/Foreign/Java/Bindings/JavaTypes.hs view
@@ -0,0 +1,211 @@+{-# LANGUAGE Haskell2010+ , DeriveDataTypeable+ #-}+{-# OPTIONS -Wall #-}++-- |+-- Module : Foreign.Java.Bindings.JavaTypes+-- Copyright : (c) Julian Fleischer 2013+-- License : MIT (See LICENSE file in cabal package)+--+-- Maintainer : julian.fleischer@fu-berlin.de+-- Stability : provisional+-- Portability : non-portable (DeriveDataTypeable)+--+-- Data structures that describe the interface of+-- Java structures such as classes, generic types,+-- their methods, etc.+--+-- All types are instances of 'Data' and 'Typeable' and+-- can therefor be used with /Scrap Your Boilerplate/+-- combinators (see "Data.Generics").+module Foreign.Java.Bindings.JavaTypes where++import Foreign.Java.Utils+import Data.Int+import Data.Data++-- type JavaClassCache = Map (String, [JavaType]) JavaClass++-- | A JavaType is either a Primitive Type, an Array, or an Object.+data JavaType+ = JBoolean+ | JChar+ | JByte+ | JShort+ | JInt+ | JLong+ | JFloat+ | JDouble+ | JObj {+ typeName :: String+ }+ | JArr {+ componentType :: JavaType+ }+ deriving (Eq, Ord, Show, Read, Data, Typeable)+++printJavaType :: JavaType -> String+printJavaType t = case t of+ JBoolean -> "boolean"+ JChar -> "char"+ JByte -> "byte"+ JShort -> "short"+ JInt -> "int"+ JLong -> "long"+ JFloat -> "float"+ JDouble -> "double"+ JObj n -> n+ JArr c -> printJavaType c ++ "[]"++-- | The interface of a Java class.+data JavaClass = JavaClass {+ className :: String,+ classPackage :: Maybe String,+ classModName :: String,+ classParents :: [String],+ classIfaces :: [String],+ classConstructors :: [JavaConstructor],+ classMethods :: [JavaMethod],+ classTypeParams :: [JavaTypeParam],+ classEnum :: Bool,+ classEnumConstants :: [(Int32, String)],+ classIface :: Bool,+ classAnnotation :: Bool,+ classAbstract :: Bool,+ classFinal :: Bool+ } deriving (Eq, Show, Read, Data, Typeable)++data JavaClassType = Annotation | Interface | Enum | Class | Exception | Error+ deriving (Eq, Ord, Show, Read, Data, Typeable)+++classType :: JavaClass -> JavaClassType+-- ^ Determines the 'JavaClassType' of a 'JavaClass'.+classType clazz+ | "java.lang.Error" `elem` classParents clazz = Error+ | "java.lang.Exception" `elem` classParents clazz = Exception+ | classAnnotation clazz = Annotation+ | classIface clazz = Interface+ | classEnum clazz = Enum+ | otherwise = Class+++classDependencies :: JavaClass -> [String]+-- ^ Calculate all classes that are referenced in any way by this class.+classDependencies clazz = concat [+ classParents clazz,+ classIfaces clazz,+ concatMap methodDependencies (classMethods clazz),+ concatMap constructorDependencies (classConstructors clazz) ]++classFullName :: JavaClass -> String+-- ^ Derive the full name from a class definition. See also 'makeName'.+classFullName clazz = makeName (classPackage clazz) (className clazz)+ ++-- | A Type variable declaration.+data JavaTypeParam = JavaTypeParam {+ paramName :: TyVar,+ paramBounds :: [JavaGenericType]+ } deriving (Eq, Ord, Show, Read, Data, Typeable)++-- | A Type variable. This is merely a name.+newtype TyVar = TyVar { tyVarName :: String }+ deriving (Eq, Ord, Show, Read, Data, Typeable)++data JavaGenericType+ = -- | @<? super X>@, @<? extends X>@+ Wildcard {+ jgtBounds :: [JavaGenericType],+ jgtLowerBounds :: [JavaGenericType]+ }+ | -- | @java.util.List<X>@+ Parameterized {+ -- | The full name of the base type, e.g. @java.lang.Class@.+ jgtBasetype :: String,+ -- | The parameters.+ jgtParameters :: [JavaGenericType]+ }+ | -- | @X[]@+ GenericArray {+ -- | The base type of the generic array, e.g. @java.lang.Number@.+ jgtComponentType :: JavaGenericType+ }+ | -- | @<X>@+ TypeVarReference {+ -- | The name of the type variable, e.g. @E@ or @X@.+ jgtName :: TyVar+ }+ | -- java.lang.Object+ NotSoGeneric {+ -- | A plain type, full name. Used for example in a 'Parameterized'+ -- type, which may be parameterized by a plain type (like+ -- @Class<Number>@.+ jgtBasetype :: String+ } deriving (Eq, Ord, Show, Read, Data, Typeable)++-- | The type of a generic type.+data JavaGenericTypeType = WildcardT+ | ParameterizedT+ | GenericArrayT+ | TypeVarReferenceT+ | NotSoGenericT++jgtType :: JavaGenericType -> JavaGenericTypeType+-- ^ Get the type of a generic type.+jgtType t = case t of+ (Wildcard _ _) -> WildcardT+ (Parameterized _ _) -> ParameterizedT+ (GenericArray _) -> GenericArrayT+ (TypeVarReference _) -> TypeVarReferenceT+ (NotSoGeneric _) -> NotSoGenericT+++-- | The interface to a method in the Java language.+data JavaMethod = JavaMethod {+ methodName :: String,+ methodName' :: String,+ methodParams :: [JavaType],+ methodGenericParams :: [JavaGenericType],+ methodReturnType :: Maybe JavaType,+ methodGenericReturnType :: JavaGenericType,+ methodTypeParams :: [JavaTypeParam],+ methodStatic :: Bool,+ methodAbstract :: Bool,+ methodPublic :: Bool,+ methodFinal :: Bool,+ methodNative :: Bool,+ methodSynchronized :: Bool+ } deriving (Eq, Show, Read, Data, Typeable)++methodDependencies :: JavaMethod -> [String]+-- ^ Return the full names of all classes that this method+-- references in its definition.+methodDependencies method = foldl classReference [] referenced+ where+ referenced = maybe paramTypes (: paramTypes) (methodReturnType method)+ paramTypes = methodParams method+ classReference r c = case c of+ JObj n -> n : r+ _ -> r++-- | A Constructor in the Java language.+data JavaConstructor = JavaConstructor {+ constructorParams :: [JavaType],+ constructorGenericParams :: [JavaGenericType],+ constructorTypeParams :: [JavaTypeParam]+ } deriving (Eq, Show, Read, Data, Typeable)++constructorDependencies :: JavaConstructor -> [String]+-- ^ Retrieve all classes that this constructor definition+-- references in its parameters or generic declaration.+constructorDependencies constr = foldl classReference []+ $ constructorParams constr+ where+ classReference r c = case c of+ JObj n -> n : r+ _ -> r++
+ src/Foreign/Java/Bindings/ReflectHaskell.hs view
@@ -0,0 +1,6 @@+{-# LANGUAGE Haskell2010 #-}++module Foreign.Java.Bindings.ReflectHaskell where+++
+ src/Foreign/Java/Bindings/ReflectJava.hs view
@@ -0,0 +1,523 @@+{-# LANGUAGE Haskell2010 #-}+{-# OPTIONS+ -Wall+ -fno-warn-missing-signatures+ -fno-warn-name-shadowing+ #-}++-- |+-- Module : Foreign.Java.Bindings.ReflectJava+-- Copyright : (c) Julian Fleischer 2013+-- License : MIT (See LICENSE file in cabal package)+--+-- Maintainer : julian.fleischer@fu-berlin.de+-- Stability : provisional+--+-- Methods for reflecting Java classes using a JVM as source of information.+module Foreign.Java.Bindings.ReflectJava where+++import qualified Data.Map as Map+import Data.Map (Map)++import qualified Data.Set as Set+import Data.Set (Set)++import Data.Int+import Data.Word+import Data.Maybe (fromJust)++import Foreign.Java+import Foreign.Java.Bindings.JavaTypes+import Foreign.Java.Utils+++-- (+-- [Methods = [types] ],+-- (Maybe Parentclass, [Interfaces])+-- )+type Class = ([String], (Maybe String, [String]))+++findClasses :: Word32 -> [String] -> Java [String] --Java (Map String Class)+findClasses maxDepth classNamesToFind = do++ (Just clazz) <- getClass "java.lang.Class"+ (Just cMethod) <- getClass "java.lang.reflect.Method"+ (Just cConstr) <- getClass "java.lang.reflect.Constructor"++ getMethods <- clazz `bindMethod` "getMethods"+ ::= array (object "java.lang.reflect.Method")+ getConstructors <- clazz `bindMethod` "getConstructors"+ ::= array (object "java.lang.reflect.Constructor")+ getReturnType <- cMethod `bindMethod` "getReturnType"+ ::= object "java.lang.Class"+ getClassName <- clazz `bindMethod` "getName"+ ::= string+ getParametersM <- cMethod `bindMethod` "getParameterTypes"+ ::= array (object "java.lang.Class")+ getParametersC <- cConstr `bindMethod` "getParameterTypes"+ ::= array (object "java.lang.Class")+ getSuperclass <- clazz `bindMethod` "getSuperclass"+ ::= object "java.lang.Class"+ getInterfaces <- clazz `bindMethod` "getInterfaces"+ ::= array (object "java.lang.Class")++ (Just classLoader) <- getClass "java.lang.ClassLoader"+ getSystemClassLoader <- classLoader `bindStaticMethod` "getSystemClassLoader"+ ::= object "java.lang.ClassLoader"+ (Just systemClassLoader) <- getSystemClassLoader++ (Just loadClass) <- classLoader `getMethod` "loadClass"+ ::= string --> boolean --> object "java.lang.Class"++ let getClass' :: String -> Java (Maybe JObject)+ getClass' clazz = callMethodE loadClass systemClassLoader clazz False+ >>= return . either (const Nothing) id++ readClass :: JObject -> Java Class+ readClass clazz = do+ constructors <- getConstructors clazz+ >>= toList . fromJust+ >>= mapM (readConstructor . fromJust)+ >>= return . concat+ methods <- getMethods clazz+ >>= toList . fromJust+ >>= mapM (readMethod . fromJust)+ >>= return . concat+ superclass <- getSuperclass clazz+ >>= maybe (return Nothing) getClassName+ interfaces <- getInterfaces clazz+ >>= toList . fromJust+ >>= mapM (getClassName . fromJust)+ >>= return . map fromJust+ return (constructors ++ methods, (superclass, interfaces))++ readMethod :: JObject -> Java [String]+ readMethod method = do+ args <- readMethodParameters method+-- excs <- readMethodExceptions method+ (Just returnType) <- getReturnType method >>= getClassName . fromJust+ + return (returnType : args)++ readConstructor :: JObject -> Java [String]+ readConstructor constr = do+ args <- readConstructorParameters constr+-- excs <- readConstructorExceptions constr+ + return args++ readMethodParameters :: JObject -> Java [String]+ readMethodParameters method = getParametersM method+ >>= toList . fromJust+ >>= mapM (getClassName . fromJust)+ >>= return . map fromJust++ readConstructorParameters :: JObject -> Java [String]+ readConstructorParameters method = getParametersC method+ >>= toList . fromJust+ >>= mapM (getClassName . fromJust)+ >>= return . map fromJust++ readReferences :: Class -> [String]+ readReferences (refs1, (super, ifaces)) =+ let refs2 = maybe ifaces (: ifaces) super+ in refs2 ++ refs1++ isPrimitive x = head x == '[' || x `elem` ["byte", "short", "int", "long",+ "float", "double", "boolean", "char",+ "void"]++ resolve :: Map String Class -> Set String -> [String]+ -> Java (Map String Class, Set String)+ resolve map set css = case css of+ (x:xs) -> if x `Map.member` map+ then do resolve map set xs+ else getClass' x >>= maybe (resolve map set xs) (\clazz -> do+ clazz' <- readClass clazz+ let newClasses = Set.filter (`Map.notMember` map)+ $ Set.fromList (readReferences clazz')+ resolve (Map.insert x clazz' map)+ (newClasses `Set.union` set)+ xs)+ [] -> do return (map, Set.filter (not . isPrimitive) set)++ findAll :: Word32 -> Map String Class -> [String] -> Java (Map String Class)+ findAll 0 classes _xs = return classes+ findAll limit classes xs = do+ (classes', new) <- resolve classes Set.empty xs+ if Set.null new+ then return classes'+ else findAll (pred limit) classes' (Set.toList new)+ + Map.keys `fmap` findAll maxDepth Map.empty classNamesToFind++reflectClasses :: [String] -> Java [JavaClass]+reflectClasses classes = do++ (Just clazz) <- getClass "java.lang.Class"+ (Just cMethod) <- getClass "java.lang.reflect.Method"+ (Just cConstr) <- getClass "java.lang.reflect.Constructor"+ (Just cTypeV) <- getClass "java.lang.reflect.TypeVariable"+ (Just cParamT) <- getClass "java.lang.reflect.ParameterizedType"+ (Just cWildT) <- getClass "java.lang.reflect.WildcardType"+ (Just cGenArrT) <- getClass "java.lang.reflect.GenericArrayType"+ (Just cEnum) <- getClass "java.lang.Enum"+ (Just modifiers) <- getClass "java.lang.reflect.Modifier"++ getMethods <- clazz `bindMethod` "getMethods"+ ::= array (object "java.lang.reflect.Method")+ getReturnType <- cMethod `bindMethod` "getReturnType"+ ::= object "java.lang.Class"+ getName <- clazz `bindMethod` "getName"+ ::= string+ getMethodName <- cMethod `bindMethod` "getName"+ ::= string+ getParameters <- cMethod `bindMethod` "getParameterTypes"+ ::= array (object "java.lang.Class")+ getParameters' <- cConstr `bindMethod` "getParameterTypes"+ ::= array (object "java.lang.Class")+ getGenericParametersM <- cMethod `bindMethod` "getGenericParameterTypes"+ ::= array (object "java.lang.reflect.Type")+ getGenericParametersC <- cConstr `bindMethod` "getGenericParameterTypes"+ ::= array (object "java.lang.reflect.Type")+ getGenericReturnType <- cMethod `bindMethod` "getGenericReturnType"+ ::= object "java.lang.reflect.Type"+ getSuperclass <- clazz `bindMethod` "getSuperclass"+ ::= object "java.lang.Class"+ getInterfaces <- clazz `bindMethod` "getInterfaces"+ ::= array (object "java.lang.Class")+ getModifiersC <- clazz `bindMethod` "getModifiers"+ ::= int+ getModifiersM <- cMethod `bindMethod` "getModifiers"+ ::= int+ getConstructors <- clazz `bindMethod` "getConstructors"+ ::= array (object "java.lang.reflect.Constructor")+ getComponentType <- clazz `bindMethod` "getComponentType"+ ::= object "java.lang.Class"+ getEnumConstants <- clazz `bindMethod` "getEnumConstants"+ ::= array (object "java.lang.Object")+ getTypeParameters <- clazz `bindMethod` "getTypeParameters"+ ::= array (object "java.lang.reflect.TypeVariable")+ getTypeParametersC <- cConstr `bindMethod` "getTypeParameters"+ ::= array (object "java.lang.reflect.TypeVariable")+ getTypeParametersM <- cMethod `bindMethod` "getTypeParameters"+ ::= array (object "java.lang.reflect.TypeVariable")++ -- reflect TypeVariables+ getTypeVariableName <- cTypeV `bindMethod` "getName"+ ::= string+ getTypeVariableBounds <- cTypeV `bindMethod` "getBounds"+ ::= array (object "java.lang.reflect.Type")++ -- reflect ParameterizedTypes+ getActualTypeArguments <- cParamT `bindMethod` "getActualTypeArguments"+ ::= array (object "java.lang.reflect.Type")+ getRawType <- cParamT `bindMethod` "getRawType"+ ::= object "java.lang.reflect.Type"+ + -- reflect WildcardTypes+ getLowerBounds <- cWildT `bindMethod` "getLowerBounds"+ ::= array (object "java.lang.reflect.Type")+ getUpperBounds <- cWildT `bindMethod` "getUpperBounds"+ ::= array (object "java.lang.reflect.Type")++ -- reflect GenericArrayTypes+ getGenericComponentType <- cGenArrT `bindMethod` "getGenericComponentType"+ ::= object "java.lang.reflect.Type"++ -- reflect Enum types+ getEnumName <- cEnum `bindMethod` "name"+ ::= string+ getEnumOrdinal <- cEnum `bindMethod` "ordinal"+ ::= int++ isAnnotation <- clazz `bindMethod` "isAnnotation"+ ::= boolean+ isArray <- clazz `bindMethod` "isArray"+ ::= boolean+ isEnum <- clazz `bindMethod` "isEnum"+ ::= boolean+ isInterface <- clazz `bindMethod` "isInterface"+ ::= boolean+ isPrimitive <- clazz `bindMethod` "isPrimitive"+ ::= boolean++ isStatic <- modifiers `bindStaticMethod` "isStatic"+ ::= int --> boolean+ isAbstract <- modifiers `bindStaticMethod` "isAbstract"+ ::= int --> boolean+ isPublic <- modifiers `bindStaticMethod` "isPublic"+ ::= int --> boolean+ isFinal <- modifiers `bindStaticMethod` "isFinal"+ ::= int --> boolean+ isNative <- modifiers `bindStaticMethod` "isNative"+ ::= int --> boolean+ isSynchronized <- modifiers `bindStaticMethod` "isSynchronized"+ ::= int --> boolean++ (Just classLoader) <- getClass "java.lang.ClassLoader"+ getSystemClassLoader <- classLoader `bindStaticMethod` "getSystemClassLoader"+ ::= object "java.lang.ClassLoader"+ (Just systemClassLoader) <- getSystemClassLoader+ (Just loadClass) <- classLoader `getMethod` "loadClass"+ ::= string --> boolean --> object "java.lang.Class"++ let findParentClasses :: JObject -- of type java.lang.Class+ -> Java [JObject]+ findParentClasses clazz = do+ parent <- getSuperclass clazz+ case parent of+ (Just parent) -> do+ parents <- findParentClasses parent+ return $ parent : parents+ _ -> return []+ + reflectType :: JObject -- of type java.lang.Class+ -> Java (Maybe JavaType)+ reflectType javatype = do++ isActuallyPrimitive <- isPrimitive javatype+ isActuallyAnArray <- isArray javatype+ + case undefined of+ _ | isActuallyPrimitive -> do+ stringRepresentation <- toString javatype+ return $ case stringRepresentation of+ "boolean" -> Just JBoolean + "char" -> Just JChar+ "byte" -> Just JByte+ "short" -> Just JShort+ "int" -> Just JInt+ "long" -> Just JLong+ "float" -> Just JFloat+ "double" -> Just JDouble+ "void" -> Nothing+ x -> error ("can't be: " ++ show x) -- these are all primitive types++ _ | isActuallyAnArray -> do+ (Just componentType) <- getComponentType javatype+ reflectType componentType >>= return . Just . JArr . fromJust++ _otherwiseItsAnObjectType -> do+ (Just name) <- getName javatype++ return $ Just $ JObj {+ typeName = name+ }++ reflectTypeParameter :: JObject -- of type java.lang.reflect.TypeVariable<?>+ -> Java JavaTypeParam+ reflectTypeParameter typeParameter = do+ + (Just name) <- getTypeVariableName typeParameter+ (Just bounds) <- getTypeVariableBounds typeParameter++ bounds' <- toList bounds+ >>= mapM (reflectGenericType . fromJust)++ return $ JavaTypeParam {+ paramName = (TyVar name),+ paramBounds = bounds'+ }++ reflectGenericType :: JObject -- of type java.lang.reflect.Type+ -> Java JavaGenericType+ reflectGenericType genericType = do++ isGenericArrayType <- genericType `isInstanceOf` cGenArrT+ isParameterizedType <- genericType `isInstanceOf` cParamT+ isTypeVariable <- genericType `isInstanceOf` cTypeV+ isWildcardType <- genericType `isInstanceOf` cWildT++ case undefined of+ _ | isGenericArrayType -> do+ (Just basetype) <- getGenericComponentType genericType+ reflectedType <- reflectGenericType basetype++ return $ GenericArray {+ jgtComponentType = reflectedType+ }++ _ | isParameterizedType -> do+ (Just typeargs) <- getActualTypeArguments genericType+ (Just basetype) <- getRawType genericType+ isClass <- basetype `isInstanceOf` clazz+ basetypeName <- if isClass+ then getName basetype >>= return . fromJust+ else fail "Type parameterized on a type variable. That was not possible <= Java 8."++ parameters <- toList typeargs >>= mapM (reflectGenericType . fromJust)++ return $ Parameterized {+ jgtBasetype = basetypeName,+ jgtParameters = parameters+ }++ _ | isTypeVariable -> do+ (Just name) <- getTypeVariableName genericType+ + return $ TypeVarReference {+ jgtName = (TyVar name)+ }++ _ | isWildcardType -> do+ (Just lowerBounds) <- getLowerBounds genericType+ (Just bounds) <- getUpperBounds genericType++ lowerBounds' <- toList lowerBounds+ >>= mapM (reflectGenericType . fromJust)+ bounds' <- toList bounds+ >>= mapM (reflectGenericType . fromJust)+ + return $ Wildcard {+ jgtBounds = bounds',+ jgtLowerBounds = lowerBounds'+ }++ _ -> getName genericType >>= return . NotSoGeneric . fromJust+ ++ reflectEnumConstant :: JObject -- of type java.lang.Enum+ -> Java (Int32, String)+ reflectEnumConstant enumConstant = do+ (Just name) <- getEnumName enumConstant+ ordinal <- getEnumOrdinal enumConstant+ return (ordinal, name)++ reflectConstructor :: JObject -- of type java.lang.reflect.Constructor+ -> Java JavaConstructor+ reflectConstructor constructor = do++ parameters <- getParameters' constructor+ >>= maybe (return []) toList+ >>= mapM (fmap fromJust . reflectType . fromJust)++ genericParams <- getGenericParametersC constructor+ >>= maybe (return []) toList+ >>= mapM (reflectGenericType . fromJust)++ typeParams <- getTypeParametersC constructor+ >>= maybe (return []) toList+ >>= mapM (reflectTypeParameter . fromJust)++ return $ JavaConstructor {+ constructorParams = parameters,+ constructorGenericParams = genericParams,+ constructorTypeParams = typeParams+ }++ reflectMethod :: JObject -- of type java.lang.reflect.Method+ -> Java JavaMethod+ reflectMethod method = do++ (Just name) <- getMethodName method+ modifiers <- getModifiersM method++ returnType <- getReturnType method+ >>= maybe (return Nothing) reflectType++ parameters <- getParameters method+ >>= maybe (return []) toList+ >>= mapM (fmap fromJust . reflectType . fromJust)++ genericParams <- getGenericParametersM method+ >>= maybe (return []) toList+ >>= mapM (reflectGenericType . fromJust)++ genericReturnType <- getGenericReturnType method+ >>= reflectGenericType . fromJust+ + typeParams <- getTypeParametersM method+ >>= maybe (return []) toList+ >>= mapM (reflectTypeParameter . fromJust)++ isActuallyStatic <- isStatic modifiers+ isActuallyAbstract <- isAbstract modifiers+ isActuallyPublic <- isPublic modifiers+ isActuallyFinal <- isFinal modifiers+ isActuallyNative <- isNative modifiers+ isActuallySynchronized <- isSynchronized modifiers++ return $ JavaMethod {+ methodName = name,+ methodName' = "", -- filled in later on+ methodParams = parameters,+ methodReturnType = returnType,+ methodGenericParams = genericParams,+ methodGenericReturnType = genericReturnType,+ methodTypeParams = typeParams,+ methodStatic = isActuallyStatic,+ methodAbstract = isActuallyAbstract,+ methodPublic = isActuallyPublic,+ methodFinal = isActuallyFinal,+ methodNative = isActuallyNative,+ methodSynchronized = isActuallySynchronized+ }++ reflectClass :: String -> Java JavaClass+ reflectClass className = do+ + (Just clazz) <- callMethod loadClass systemClassLoader className False+ modifiers <- getModifiersC clazz++ isActuallyAbstract <- isAbstract modifiers+ isActuallyFinal <- isFinal modifiers++ let name = takeClassName className+ packageName = takePackageName className+ + parents <- asObject clazz+ >>= findParentClasses+ >>= mapM (fmap fromJust . getName)++ interfaces <- asObject clazz+ >>= getInterfaces+ >>= maybe (return []) toList+ >>= mapM (getName . maybe undefined id)+ >>= mapM (maybe undefined return)++ methods <- asObject clazz+ >>= getMethods+ >>= maybe (return []) toList+ >>= mapM (maybe undefined reflectMethod)++ constructors <- asObject clazz+ >>= getConstructors+ >>= maybe (return []) toList+ >>= mapM (maybe undefined reflectConstructor)++ parameters <- asObject clazz+ >>= getTypeParameters+ >>= maybe (return []) toList+ >>= mapM (maybe undefined reflectTypeParameter)++ enumConstants <- asObject clazz+ >>= getEnumConstants+ >>= maybe (return []) toList+ >>= mapM (maybe undefined reflectEnumConstant)++ isActuallyEnum <- asObject clazz >>= isEnum+ isActuallyIface <- asObject clazz >>= isInterface+ isActuallyAnn <- asObject clazz >>= isAnnotation++ return $ JavaClass {+ className = name,+ classPackage = packageName,+ classModName = "", -- is filled in later+ classMethods = methods,+ classParents = parents,+ classIfaces = interfaces,+ classConstructors = constructors,+ classTypeParams = parameters,+ classEnum = isActuallyEnum,+ classEnumConstants = enumConstants,+ classIface = isActuallyIface,+ classAnnotation = isActuallyAnn,+ classAbstract = isActuallyAbstract,+ classFinal = isActuallyFinal+ }++ mapM reflectClass classes+
+ src/Foreign/Java/Bindings/Support.cpphs view
@@ -0,0 +1,356 @@+{-# LANGUAGE Haskell2010+ , TypeFamilies+ , FlexibleContexts+ , FlexibleInstances+ , TypeSynonymInstances+ #-}+{-# OPTIONS+ -Wall+ #-}++-- |+-- Module : Foreign.Java.Bindings.Support+-- Copyright : (c) Julian Fleischer 2013+-- License : MIT (See LICENSE file in cabal package)+--+-- Maintainer : julian.fleischer@fu-berlin.de+-- Stability : experimental+-- Portability : non-portable (TypeFamilies)+--+-- This module provides type classes and instances for+-- supporting the high level bindings. This module should+-- not be imported directly.+module Foreign.Java.Bindings.Support where++import Control.Monad.State hiding (void)++import Data.Int+import Data.Word+import Data.Maybe++import Foreign.Ptr+import Foreign.ForeignPtr+import Foreign.C.Types++import Foreign.Java+import Foreign.Java.JavaMonad+import Foreign.Java.Types as T+import qualified Foreign.Java.JNI.Safe as JNI+import qualified Foreign.Java.JNI.Types as Core+++---------------+-- Utilities --+---------------+++object' :: String -> Q+object' = T.object'+++------------------------------+-- Primitive argument types --+------------------------------++class JBoolean a where toBoolean :: a -> Java Bool+class JChar a where toChar :: a -> Java Word16+class JByte a where toByte :: a -> Java Int8+class JShort a where toShort :: a -> Java Int16+class JInt a where toInt :: a -> Java Int32+class JLong a where toLong :: a -> Java Int64+class JFloat a where toFloat :: a -> Java Float+class JDouble a where toDouble :: a -> Java Double+++instance JBoolean Bool where toBoolean = return++instance JChar Char where toChar = return . fromIntegral . fromEnum+instance JChar Int8 where toChar = return . fromIntegral+instance JChar Word16 where toChar = return++instance JByte Int8 where toByte = return++instance JShort Int8 where toShort = return . fromIntegral+instance JShort Word8 where toShort = return . fromIntegral+instance JShort Int16 where toShort = return++instance JInt Int where toInt = return . fromIntegral+instance JInt Int8 where toInt = return . fromIntegral+instance JInt Word8 where toInt = return . fromIntegral+instance JInt Int16 where toInt = return . fromIntegral+instance JInt Word16 where toInt = return . fromIntegral+instance JInt Int32 where toInt = return++instance JLong Int where toLong = return . fromIntegral+instance JLong Int8 where toLong = return . fromIntegral+instance JLong Word8 where toLong = return . fromIntegral+instance JLong Int16 where toLong = return . fromIntegral+instance JLong Word16 where toLong = return . fromIntegral+instance JLong Int32 where toLong = return . fromIntegral+instance JLong Word32 where toLong = return . fromIntegral+instance JLong Int64 where toLong = return++instance JFloat CFloat where toFloat = return . realToFrac+instance JFloat Float where toFloat = return++instance JDouble CDouble where toDouble = return . realToFrac+instance JDouble Double where toDouble = return+++--------------------------+-- Array argument types --+--------------------------++class Array a where+ asMaybeArrayObject :: a -> Java (Maybe JObject)+++----------------------------+-- Primitive result types --+----------------------------++#define PRIMITIVE_RESULT(NAME, TYPE) \+ class NAME ## Result m where {\+ to ## NAME ## Result :: Either JThrowable TYPE -> Java m }\+ ;\+ instance NAME ## Result TYPE where {\+ to ## NAME ## Result = either (\exc -> toString exc >>= fail) return }\+ ;\+ instance NAME ## Result (Either JThrowable TYPE) where {\+ to ## NAME ## Result = return }++-- | The result of a function call that is of type @boolean@.+PRIMITIVE_RESULT(Boolean, Bool)+-- | The result of a function call that is of type @char@.+PRIMITIVE_RESULT(Char, Word16)+-- | The result of a function call that is of type @byte@.+PRIMITIVE_RESULT(Byte, Int8)+-- | The result of a function call that is of type @short@.+PRIMITIVE_RESULT(Short, Int16)+-- | The result of a function call that is of type @int@.+PRIMITIVE_RESULT(Int, Int32)+-- | The result of a function call that is of type @long@.+PRIMITIVE_RESULT(Long, Int64)+-- | The result of a function call that is of type @float@.+PRIMITIVE_RESULT(Float, Float)+-- | The result of a function call that is of type @double@.+PRIMITIVE_RESULT(Double, Double)++-- | The result of a function call that is of type @void@.+class VoidResult m where+ toVoidResult :: Either JThrowable () -> Java m+ +instance VoidResult () where+ toVoidResult = either (\exc -> toString exc >>= fail) return++instance VoidResult (Either JThrowable ()) where+ toVoidResult = return+ +instance VoidResult (Maybe JThrowable) where+ toVoidResult = return . either Just (const Nothing)+++------------------------+-- Array result types --+------------------------++-- | An array result of a function call.+class JavaArray (ArrayResultType m) (ArrayResultComponent m) => ArrayResult m where+ -- | The JVM machine type of the components of the array.+ type ArrayResultType m++ -- | The type of the component of the array as returned by+ -- the low level JNI call.+ type ArrayResultComponent m++ -- | Convert the array to a sophisticated type.+ toArrayResult :: Either JThrowable (Maybe (JArray (ArrayResultType m))) -> Java m++instance ArrayResult a => ArrayResult (Either JThrowable a) where+ type ArrayResultType (Either JThrowable a) = ArrayResultType a+ type ArrayResultComponent (Either JThrowable a) = ArrayResultComponent a++ toArrayResult = either (return . Left) (toArrayResult . Right)++#define ARRAY_RESULT(TYPE, PRIM) \+ instance ArrayResult [TYPE] where {\+ type ArrayResultType [TYPE] = T.PRIM ;\+ type ArrayResultComponent [TYPE] = TYPE ;\+ \+ toArrayResult = either (\exc -> toString exc >>= fail) \+ (maybe (return []) toList) }++ARRAY_RESULT(Bool, Z)+ARRAY_RESULT(Word16, C)+ARRAY_RESULT(Int8, B)+ARRAY_RESULT(Int16, S)+ARRAY_RESULT(Int32, I)+ARRAY_RESULT(Int64, J)+ARRAY_RESULT(Float, F)+ARRAY_RESULT(Double, D)+++instance ArrayResult [Char] where+ type ArrayResultType [Char] = T.C+ type ArrayResultComponent [Char] = Word16++ toArrayResult = either (\exc -> toString exc >>= fail)+ (maybe (return [])+ (fmap (map (toEnum . fromIntegral)) . toList))++instance ArrayResult [String] where+ type ArrayResultType [String] = T.L+ type ArrayResultComponent [String] = Maybe JObject++ toArrayResult =+ either (\exc -> toString exc >>= fail)+ (maybe (return [])+ (\arr -> toList arr >>= mapM (maybe (return "") toString)))++++-----------------------+-- All other objects --+-----------------------+++-- | The result of a function call that is of type @object@.+class ObjectResult m where+ -- | + toObjectResult :: Either JThrowable (Maybe JObject) -> Java m++instance UnsafeCast a => ObjectResult (Value JThrowable a) where+ toObjectResult = either (return . Fail)+ (maybe (return NoValue)+ (fmap Value . unsafeFromJObject))++instance UnsafeCast a => ObjectResult (Either (Maybe JThrowable) a) where+ toObjectResult = either (return . Left . Just)+ (maybe (return (Left Nothing))+ (fmap Right . unsafeFromJObject))++instance UnsafeCast a => ObjectResult (Either JThrowable (Maybe a)) where+ toObjectResult = either (return . Left)+ (fmap Right . maybe (return Nothing)+ (fmap Just . unsafeFromJObject))++instance UnsafeCast a => ObjectResult (Maybe a) where+ toObjectResult = either (\exc -> toString exc >>= fail)+ (maybe (return Nothing)+ (fmap Just . unsafeFromJObject))++instance ObjectResult [Char] where+ toObjectResult = either (\exc -> toString exc >>= fail)+ (maybe (return "null") toString)+++---------------------------------------------------+-- Advanced features (Callbacks, Subtyping, ...) --+---------------------------------------------------+++-- | A convenient alternative to 'isInstanceOf'.+--+-- Minimal complete definition: 'coerce' or 'whenInstanceOf'.+class InstanceOf a where+ type CoercedType a++ -- | Check if the object of type @a@ is an instance+ -- of the type represented by @b@. + instanceOf :: JavaObject o => o -> a -> Java Bool++ -- | Check if the object of type @a@ is an instance+ -- of the type @c@, represented by @b@. If so, it will coerce+ -- the object of type @a@ and pass it to the given action.+ --+ -- If @a@ was an instance of @c@ (where @c@ is represented+ -- by @b@) this function will return @'Just' d@, where @d@ is+ -- the result of the optional computation. If not, 'Nothing'+ -- is returned.+ whenInstanceOf :: JavaObject o => o -> a -> (CoercedType a -> Java d) -> Java (Maybe d)++ -- | Coerces the given object of type @a@ to an object of+ -- @c@, where @c@ is represented by a value of type @b@.+ -- Returns @'Nothing'@ if this is not possible.+ coerce :: JavaObject o => o -> a -> Java (Maybe (CoercedType a))++ instanceOf o t =+ whenInstanceOf o t (return . const ())+ >>= return . maybe False (const True)++ whenInstanceOf o t a =+ coerce o t >>= maybe (return Nothing) (fmap Just . a)++ coerce o t = whenInstanceOf o t return++-- | For INTERNAL use only. Is however not in a hidden module,+-- so that other libraries can link against it.+class UnsafeCast a where+ -- | For INTERNAL use only. Do not use yourself.+ unsafeFromJObject :: JObject -> Java a++++---------------+-- Callbacks --+---------------+++registerCallbacks :: Core.JClass -> Java Bool+-- ^ Yepp. Register callbacks. Do it.+registerCallbacks (Core.JClass ptr) = do+ vm <- getVM+ io $ withForeignPtr ptr $ \clazz -> JNI.registerCallbacks vm clazz+++type WrappedFun = Ptr Core.JVM+ -> Ptr Core.JObjectRef+ -> Ptr Core.JObjectRef+ -> Ptr Core.JObjectRef+ -> IO (Ptr Core.JObjectRef)+++runJava_ :: Ptr Core.JVM -> Java a -> IO a+runJava_ vm f = runStateT (_runJava f) (newJVMState vm) >>= return . fst++foreign import ccall safe "wrapper"+ wrap_ :: WrappedFun -> IO (FunPtr WrappedFun)++foreign export ccall freeFunPtr :: FunPtr WrappedFun -> IO ()++freeFunPtr :: FunPtr WrappedFun -> IO ()+freeFunPtr ptr = freeHaskellFunPtr ptr+++wrap :: Java () -> IO (FunPtr WrappedFun)+wrap f = do++ let func vm _self _method _args = do+ runJava_ vm f+ return nullPtr+ + func' <- wrap_ func++ return func'++intify :: Java () -> IO Int64+intify = fmap (fromIntegral . ptrToIntPtr . castFunPtrToPtr) . wrap+++sushimaki :: String -> Java () -> Java JObject+sushimaki ifaceName func = do+ iface <- getClass ifaceName >>= asObject . fromJust+ (Just clazz) <- getClass "HFunction"+ _success <- registerCallbacks clazz+ makeFunction <- clazz `bindStaticMethod` "makeFunction"+ ::= object "java.lang.Class" --> long --> object "java.lang.Object"+ (Just impl) <- io (intify func) >>= makeFunction (Just iface)+ return impl+++delete :: Core.JObject -> Java ()+delete (Core.JObject ptr) = io $ do+ finalizeForeignPtr ptr+++
+ src/Foreign/Java/Bindings/Typomatic.hs view
@@ -0,0 +1,400 @@+{-# LANGUAGE Haskell2010+ , GeneralizedNewtypeDeriving+ , DeriveDataTypeable+ #-}+{-# OPTIONS+ -Wall+ -fno-warn-name-shadowing+ #-}++-- | INTERNAL module is used to infer Haskell types from Java types.+module Foreign.Java.Bindings.Typomatic (+ runTypomatic,+ typomatic,+ ArgInfo (..),++ dataTName,+ dataCName,+ newtTName,+ newtCName,+ tyclTName+) where++import Foreign.Java.Util+-- import Foreign.Java.Utils+import Foreign.Java.Bindings.JavaTypes++import Control.Monad.State hiding (void)+import qualified Control.Monad.State as State+import Data.Functor.Identity+import Data.Functor ((<$>))++import Data.Generics++import qualified Data.Set as Set+import Data.Set (Set)+import qualified Data.Map as Map+import Data.Map (Map)+import qualified Data.List as List++dataTName, dataCName, newtTName, newtCName, tyclTName :: String -> String++dataTName = (++ "''")+dataCName = id -- (++ "")+newtTName = (++ "'")+newtCName = (++ "'")+tyclTName = id -- (++ "")++-- | This is the information which is ultimately+-- gathered by the use of this module.+data ArgInfo = ArgInfo {+ fSignature :: String,+ fArguments :: [TVar],+ fReturnType :: TVar,+ fArgNames :: [String],+ fJavaSignature :: String,+ fJavaReturnType :: String,+ fJniSignature :: String+ }+++--------------------+-- Type variables --+--------------------++data TVar = TVar String | TVars [TVar]+ deriving (Eq, Ord, Show, Data, Typeable)++printTVar :: TVar -> String+printTVar var = case var of+ (TVar v) -> v+ (TVars vs) -> concat ["(", tail (concatMap ((' ':) . printTVar) vs), ")"]+++---------------+-- Utilities --+---------------++printJniType :: JavaType -> String+printJniType t = case t of+ JBoolean -> "JNI.boolean"+ JChar -> "JNI.char"+ JByte -> "JNI.byte"+ JShort -> "JNI.short"+ JInt -> "JNI.int"+ JLong -> "JNI.long"+ JFloat -> "JNI.float"+ JDouble -> "JNI.double"+ JObj n -> "JNI.object \"" ++ n ++ "\""+ -- arrays are treated as objects:+ JArr c -> "JNIS.object' \"[" ++ printJniRawType c ++ "\""+++printJniRawType :: JavaType -> String+printJniRawType t = case t of+ JBoolean -> "Z"+ JChar -> "C"+ JByte -> "B"+ JShort -> "S"+ JInt -> "I"+ JLong -> "J"+ JFloat -> "F"+ JDouble -> "D"+ JObj n -> 'L' : tr '.' '/' n ++ ";"+ JArr c -> '[' : printJniRawType c+++printJniSignature :: JavaMethod -> String+printJniSignature method = show name ++ " JNI.::= " ++ args ++ ret+ where+ name = methodName method+ args = concatMap ((++ " --> ") . printJniType) (methodParams method)+ ret = maybe "JNI.void" printJniType (methodReturnType method)++++typomatic :: JavaClass -> JavaMethod -> Typomatic ArgInfo+typomatic clazz method_ = do++ let className = classFullName clazz+ classParams = classTypeParams clazz++ -- sanitize tyVars tied to the method by distinguishing+ -- from tyVars tied to the class by adding an apostrophe+ -- to the name of the tyVar if it is tied to the method.+ methodTypeVars = map paramName (methodTypeParams method_)+ safe var@(TyVar str)+ | var `elem` methodTypeVars = TyVar (str ++ "'")+ | otherwise = var+ method = everywhere (mkT safe) method_++ -- the following three functions create the list of+ -- argument parameters, including @this@ (if the method+ -- is not static) and the return type. The return type+ -- is separated later on again.+ thisParam = if null classParams+ then NotSoGeneric className+ else Parameterized {+ jgtBasetype = className,+ jgtParameters = (map (TypeVarReference . paramName) classParams)+ }+ params = (if methodStatic method then [] else [thisParam])+ ++ methodGenericParams method+ ++ [maybe (TypeVarReference (TyVar "()"))+ (const $ methodGenericReturnType method)+ (methodReturnType method)]+ jtypes = (if methodStatic method then [] else [JObj className])+ ++ methodParams method++ -- turns a JavaGenericType definition into type variables.+ -- The names are taken from the monad via 'newVar'.+ tvar param = case jgtType param of+ WildcardT -> do+ name <- newVar+ return $ TVar name+ ParameterizedT -> do+ name <- newVar+ params <- mapM tvar (jgtParameters param)+ return $ TVars $ TVar name : params+ GenericArrayT -> do+ name <- newVar+ return $ TVar name+ TypeVarReferenceT -> do+ let name = (tyVarName (jgtName param))+ return $ TVar name+ NotSoGenericT -> do+ name <- newVar+ return $ TVar name++ -- creates a haskell signature (-> String)+ signature typeVars returnVar = do+ -- retrieve the context and turn each variable into a String.+ contexts <- getContext >>= mapM (\(tvar, context) -> do+ return $ context ++ " " ++ printTVar tvar)++ let argTypes = concatMap ((++ " -> ") . printTVar) typeVars+ -- the final type is wrapped in the Java monad+ returnType = "JNI.Java " ++ printTVar returnVar+ -- finally assemble the conetext.+ context = if null contexts then "" else+ "(" ++ concat (List.intersperse ", " contexts) ++ ") => "+ + -- return the full signature, consisting of the context,+ -- the type of the arguments, and the return type.+ return $ concat [context, argTypes, returnType]++ -- create a java signature (-> String)+ javaSignature = do+ let name = methodName method+ args = map printJavaType $ methodParams method+ return $ name ++ "(" ++ concat (List.intersperse ", " args) ++ ")"+ ++ -- if this is not a static method the first argument+ -- is /this/. This merely pushed the name into the list+ -- of type variable names in the monad.+ when (not $ methodStatic method) (pushVar "this")++ -- get type variables for all arguments, including the+ -- return type (as the return type may be the same as+ -- one of the argument types).+ --+ -- Split the result into arguments and return var again,+ -- since the return variable will get special treatment+ -- henceforth.+ (typeVars, returnVar_) <- breakLast <$> mapM tvar params++ -- augment the return type variable, i.e. if it is not+ -- a type variable at all, replace the variable name by+ -- a constant reference to a specific type.+ --+ -- This is only the case with parameterized type variables+ -- and not-so-generic ones.+ returnVar <- case methodReturnType method of+ Just (JObj typeName) -> case jgtType (methodGenericReturnType method) of+ ParameterizedT -> do+ clazz <- getClass typeName+ let (TVars (TVar _ : ts)) = returnVar_+ return $ TVars (TVar (newtTName (classModName clazz)) : ts)+ NotSoGenericT -> do+ clazz <- getClass typeName+ return $ TVar (newtTName (classModName clazz))+ _ -> return returnVar_+ _ -> return returnVar_++ -- Add contexts for all arguments and augment array types+ let makeContext typeVar jtype = case jtype of+ JObj name -> do+ clazz <- getClass name+ addContext typeVar $ tyclTName $ classModName clazz+ return typeVar+ JArr componentType -> do+ addContext typeVar "JNIS.Array"+ return typeVar+ JBoolean -> do+ addContext typeVar "JNIS.JBoolean"+ return typeVar+ JChar -> do+ addContext typeVar "JNIS.JChar"+ return typeVar+ JByte -> do+ addContext typeVar "JNIS.JByte"+ return typeVar+ JShort -> do+ addContext typeVar "JNIS.JShort"+ return typeVar+ JInt -> do+ addContext typeVar "JNIS.JInt"+ return typeVar+ JLong -> do+ addContext typeVar "JNIS.JLong"+ return typeVar+ JFloat -> do+ addContext typeVar "JNIS.JFloat"+ return typeVar+ JDouble -> do+ addContext typeVar "JNIS.JDouble"+ return typeVar++ -- Here makeContexts is applied (see above). In the same pass a new+ -- set of typeVars (typeVars') is generated, since makeContexts+ -- migth further investigate array and create type variables for+ -- their component types.+ typeVars' <- mapM (uncurry makeContext) (zip typeVars jtypes)++ -- Create contexts for the ultimate return type.+ returnVar' <- case methodReturnType method of+ Nothing -> do+ let tvar = TVar "void"+ addContext tvar "JNIS.VoidResult"+ return tvar+ Just t -> case t of+ JObj _ -> do+ let tvar = TVars [TVar "object", returnVar]+ addContext tvar "JNIS.ObjectResult"+ return tvar+ JArr _ -> do+ let tvar = TVar "array"+ addContext tvar "JNIS.ArrayResult"+ return tvar+ JBoolean -> do+ let tvar = TVar "boolean"+ addContext tvar "JNIS.BooleanResult"+ return tvar+ JChar -> do+ let tvar = TVar "char"+ addContext tvar "JNIS.CharResult"+ return tvar+ JByte -> do+ let tvar = TVar "byte"+ addContext tvar "JNIS.ByteResult"+ return tvar+ JShort -> do+ let tvar = TVar "short"+ addContext tvar "JNIS.ShortResult"+ return tvar+ JInt -> do+ let tvar = TVar "int"+ addContext tvar "JNIS.IntResult"+ return tvar+ JLong -> do+ let tvar = TVar "long"+ addContext tvar "JNIS.LongResult"+ return tvar+ JFloat -> do+ let tvar = TVar "float"+ addContext tvar "JNIS.FloatResult"+ return tvar+ JDouble -> do+ let tvar = TVar "double"+ addContext tvar "JNIS.DoubleResult"+ return tvar++ -- generate the Haskell signature (a String)+ sig <- signature typeVars' returnVar'++ -- generate the Java signature (a String).+ -- This is used for documentation purposed later on+ -- (i.e. inserted as haddock docstring).+ jsig <- javaSignature++ -- generate the names of the arguments+ let argNames = (if methodStatic method then id else ("this":) . init)+ $ zipWith (\_ i -> 'a' : show i) typeVars [(1 :: Integer)..]++ -- assemble and return all the calculated information+ return $ ArgInfo {+ fArguments = typeVars,+ fReturnType = returnVar',+ fArgNames = argNames,+ fSignature = sig,+ fJavaSignature = jsig,+ fJavaReturnType = maybe "void" printJavaType (methodReturnType method),+ fJniSignature = printJniSignature method+ }++--------------------------------------------+-- The following are utilities for the monad+--------------------------------------------++-- | The state of the monad.+data TypomaticState = TypomaticState {+ tVars :: [String],+ tContext :: Set (TVar, String),+ tParams :: [String],+ tClasses :: Map String JavaClass+ }++-- | Retrieve the definition of a class.+--+-- The monad has an internal store of class names+-- and their definitions. See 'tClasses'.+getClass :: String -> Typomatic JavaClass+getClass name = do+ state <- State.get+ return ((tClasses state) Map.! name)++-- | Get the current context as a list.+getContext :: Typomatic [(TVar, String)]+getContext = State.get >>= return . Set.toList . tContext++-- | Add a context for a specific type variable.+addContext :: TVar -> String -> Typomatic ()+addContext tvar string = do+ state <- State.get+ State.put (state {tContext = ((tvar, string) `Set.insert` tContext state)})++-- | Introduce a new name.+--+-- This simply takes the next element in the infinite+-- 'tVars' list and stores the tail back in the monad.+newVar :: Typomatic String+newVar = do+ state <- State.get+ let (v:vs) = tVars state+ State.put (state { tVars = vs})+ return v++-- | Push a new name in the front of the available names.+pushVar :: String -> Typomatic ()+pushVar name = do+ state <- State.get+ State.put (state {tVars = (name : tVars state)})++-- | The monad.+newtype Typomatic a = Typomatic { _runTypomatic :: StateT TypomaticState Identity a }+ deriving (Monad, MonadState TypomaticState, Functor)++-- | Run a computation in the monad.+runTypomatic :: Map String JavaClass -> Typomatic a -> a+runTypomatic classes =+ let state = TypomaticState { -- initial state+ tVars = map (('v':) . show) [(1 :: Integer)..],+ tContext = Set.empty,+ tParams = [],+ tClasses = classes+ } in fst . runIdentity . flip runStateT state . _runTypomatic++++
+ src/Foreign/Java/Control.hs view
@@ -0,0 +1,51 @@+{-# LANGUAGE Haskell2010 #-}+{-# OPTIONS -Wall #-}++-- | Utilities for controlling actions inside the Java monad.+module Foreign.Java.Control where++import Prelude hiding (pred, until)++when :: Monad m => m Bool -> m () -> m ()+-- ^ Execute an action if the given predicate+-- evaluates to 'True'.+when pred action = pred >>= (\p -> if p then action else return ())++unless :: Monad m => m Bool -> m () -> m ()+-- ^ Execute an action if the given predicate+-- evaluates to 'False'.+unless pred action = pred >>= (\p -> if not p then action else return ())++whether :: Monad m => m Bool -> m a -> m a -> m a+-- ^ Execute either the first or the second action,+-- depending on whether the given predicate evaluates+-- to 'True' or 'False'.+whether pred actionIf actionElse = do+ cond <- pred+ if cond then actionIf else actionElse++while :: Monad m => m Bool -> m () -> m ()+-- ^ Run a computation as long as the given predicate+-- evaluates to 'True'.+while pred action = do+ cond <- pred+ if cond then action >> while pred action+ else return ()++for :: Monad m => a -> (a -> m Bool) -> (a -> m a) -> m a+-- ^ Reiterate a computation on a given value as long+-- as a condition is 'True'.+for i pred action = do+ continue <- pred i+ if continue then action i >>= (\i' -> for i' pred action)+ else return i++until :: Monad m => a -> (a -> m (Bool, a)) -> m a+-- ^ Reiterate a computation on a given value until+-- a condition is 'True'.+until i action = do+ (done, result) <- action i+ if done then return result+ else until result action++
+ src/Foreign/Java/IO.hs view
@@ -0,0 +1,44 @@+{-# LANGUAGE Haskell2010+ , TypeSynonymInstances+ , FlexibleInstances+ , UndecidableInstances+ , OverlappingInstances+ #-}+{-# OPTIONS -Wall #-}++-- | +-- Module : Foreign.Java.IO+-- Copyright : (c) Julian Fleischer 2013+-- License : MIT (See LICENSE file in cabal package)+--+-- Maintainer : julian.fleischer@fu-berlin.de+-- Stability : provisional+-- Portability : non-portable (UndecidableInstances, OverlappingInstances)+--+-- Utilities to ease IO operations in the Java monad.+module Foreign.Java.IO where++import Prelude hiding (print)+import Control.Monad.IO.Class+import System.IO hiding (print)+++class PrintLn a where+ -- | Like @'putStrLn' . 'show'@, but with a specialized+ -- version for Strings plus it can be used within any+ -- 'MonadIO' monad (such as IO and Java).+ println :: MonadIO m => a -> m ()++ -- | Like @'putStr' . 'show'@, but with a specialized+ -- version for Strings plus it can be used within any+ -- 'MonadIO' monad (such as IO and Java).+ print :: MonadIO m => a -> m ()++instance PrintLn String where+ println = liftIO . putStrLn+ print x = liftIO (putStr x >> hFlush stdout)++instance Show a => PrintLn a where+ println = println . show+ print = print . show+
src/Foreign/Java/JNI/Types.hs view
@@ -10,21 +10,6 @@ import Foreign (ForeignPtr) -data Z = Z deriving Show-data C = C deriving Show-data B = B deriving Show-data S = S deriving Show-data I = I deriving Show-data J = J deriving Show-data F = F deriving Show-data D = D deriving Show-data L = L String deriving Show-data V = V deriving Show-data A x = A x deriving Show-data X = X deriving Show--data Q = Q String deriving Show- data JVM data JObjectRef data JClassRef
src/Foreign/Java/JNI/core.hs view
@@ -47,18 +47,6 @@ getConstructorID, newObject, --- ** Array creation--newBooleanArray,-newCharArray,-newLongArray,-newIntArray,-newShortArray,-newByteArray,-newFloatArray,-newDoubleArray,-newObjectArray,- -- * Method access JStaticMethodID,@@ -224,11 +212,6 @@ setLibjvmPath, registerCallbacks, --- * Primitive types--Z (Z), C (C), B (B), S (S), I (I), J (J),-D (D), F (F), L (L), V (V), A (A), X (X),- -- * Workarounds for certain platforms runCocoaMain@@ -534,33 +517,6 @@ foreign import ccall %SAFETY% "ffijni.h setJValueString" setJValueString :: Ptr JVM -> Ptr JValues -> CInt -> CString -> IO () -foreign import ccall %SAFETY% "ffijni.h newBooleanArray"- newBooleanArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall %SAFETY% "ffijni.h newCharArray"- newCharArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall %SAFETY% "ffijni.h newLongArray"- newLongArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall %SAFETY% "ffijni.h newIntArray"- newIntArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall %SAFETY% "ffijni.h newShortArray"- newShortArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall %SAFETY% "ffijni.h newByteArray"- newByteArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall %SAFETY% "ffijni.h newFloatArray"- newFloatArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall %SAFETY% "ffijni.h newDoubleArray"- newDoubleArray :: Ptr JVM -> Int32 -> Ptr JObjectRef--foreign import ccall %SAFETY% "ffijni.h newObjectArray"- newObjectArray :: Ptr JVM -> Int32 -> Ptr JClass -> Ptr JObjectRef- foreign import ccall %SAFETY% "ffijni.h newJString" newJString :: Ptr JVM -> CString -> IO (Ptr JObjectRef) @@ -675,7 +631,7 @@ foreign import ccall %SAFETY% "ffijni.h getDebugStatus" getDebugStatus :: IO Bool -foreign import ccall %SAFETY% "ffijni.h setDebugStatus"+foreign import ccall %SAFETY% "ffijni.g setDebugStatus" setDebugStatus :: Bool -> IO () foreign import ccall %SAFETY% "ffijni.h runCocoaMain"
src/Foreign/Java/JavaMonad.hs view
@@ -144,7 +144,7 @@ -- Use one of 'runJava' or 'runJava'' to perform operations in the -- Java monad. newtype Java a = Java { _runJava :: StateT JVMState IO a }- deriving (Monad, MonadState JVMState, Functor, MonadIO)+ deriving (Monad, MonadState JVMState, Functor, MonadIO) -- | INTERNAL Retrieve the 'jvmPtr' from this Java Monads -- State.
+ src/Foreign/Java/Maybe.hs view
@@ -0,0 +1,67 @@+{-# LANGUAGE Haskell2010 #-}+{-# OPTIONS+ -Wall+ -fno-warn-orphans+ #-}++-- |+-- Module : Foreign.Java.Maybe+-- Copyright : (c) Julian Fleischer 2013+-- License : MIT (See LICENSE file in cabal package)+--+-- Maintainer : julian.fleischer@fu-berlin.de+-- Stability : provisional+-- Portability : portable (Haskell2010)+--+-- Every java methods returns in priniciple either Nothing or+-- Just a value. This is quite cumbersome to work with. This module+-- contains utility functions for working with Maybe values in the+-- java monad.+--+-- This module offers the orphan instance (!)+--+-- > instance JavaObject a => JavaObject (Maybe a)+--+-- This instance allows you to apply 'toString' and the like+-- without unwrapping a 'Maybe' value.+--+-- Note that the 'asObject' function provided by this instance+-- is undefined (since @null@ is not an object). This is also the+-- reason why this instance is not included in "Foreign.Java" by+-- default. Invoking it will call @error "NullPointerException"@.+-- In other words: This fine module will bring back all the joy of+-- Java you might miss in Haskell :-)+--+-- 'toString' will return @null@ for @Nothing@.+--+-- 'hashCode' will return @0@ for @Nothing@.+--+-- 'classOf' will return the class for @java.lang.Void@ on @Nothing@,+-- as this is a class for which there gare no object instances. This is+-- only a stopgap and slightly incorrect, as null is not an object,+-- and does therefor not have a class.+module Foreign.Java.Maybe where+++import Foreign.Java+++instance JavaObject a => JavaObject (Maybe a) where++ toString m = case m of+ Just obj -> toString obj+ Nothing -> return "null"++ hashCode m = case m of+ Just obj -> hashCode obj+ Nothing -> return 0++ asObject m = case m of+ Just obj -> asObject obj+ Nothing -> error "NullPointerException"++ classOf m = case m of+ Just obj -> classOf obj+ Nothing -> getClass "java.lang.Void" >>= classOf++
+ src/Foreign/Java/Tutorial.hs view
@@ -0,0 +1,52 @@+module Foreign.Java.Tutorial (++-- * High level bindings+-- $highLevelBindings++-- ** Generating the bindings+-- $generatingTheBindings++-- ** Using the bindings+-- $usingTheBindings++-- ** Calling back into Haskell+-- $callingBackIntoHaskell++-- * Medium level bindings+-- $mediumLevelBindings++-- * Low level bindings+-- $lowLevelBindings+) where++{- $java2haskell++-}++{- $highLevelBindings++-}++{- $generatingTheBindings++-}++{- $usingTheBindings++-}++{- $mediumLevelBindings++ "Foreign.Java"++-}++{- $lowLevelBindings++ "Foreign.Java.JNI.Safe", "Foreign.Java.JNI.Unsafe"++-}++{- $callingBackIntoHaskell++-}
src/Foreign/Java/Types.hs view
@@ -61,6 +61,20 @@ import qualified Foreign.Java.JNI.Types as Core import Foreign.Java.Util +data Z = Z deriving Show+data C = C deriving Show+data B = B deriving Show+data S = S deriving Show+data I = I deriving Show+data J = J deriving Show+data F = F deriving Show+data D = D deriving Show+data L = L String deriving Show+data V = V deriving Show+data A x = A x deriving Show+data X = X deriving Show++data Q = Q String deriving Show boolean = Z char = C
src/Foreign/Java/Value.hs view
@@ -17,20 +17,18 @@ -- nothing, or a special value describing an error condition. module Foreign.Java.Value where -import Foreign.Java.JNI.Types (JThrowable)- -- | A ternary value type to hold one of two possible value types -- or none at all.-data Value a+data Value e a = Value a -- ^ An actual value | NoValue -- ^ No value- | Fail JThrowable -- ^ A value describing the error+ | Fail e -- ^ A value describing the error -- | fold on a 'Value', like 'either' for 'Either' or 'maybe' for 'Maybe'. value :: b -- ^ default value if neither a value nor a fail value is given- -> (JThrowable -> b) -- ^ function to handle a fail value+ -> (e -> b) -- ^ function to handle a fail value -> (a -> b) -- ^ function to handle an actual value- -> Value a -- ^ the value+ -> Value e a -- ^ the value -> b -- ^ the final return value value noValue fail success value = case value of (Value a) -> success a
src/ffijni.c view
@@ -1,6 +1,5 @@ #include <stdio.h> #include <stdlib.h>-#include <stdint.h> #include <string.h> #include "ffijni.h"@@ -79,14 +78,9 @@ #define STR(s) #s #define GLOBAL_REF(VMI, LOCAL, GLOBAL) \- jobject GLOBAL; \- if (LOCAL == NULL) { \- GLOBAL = NULL; \- } else { \- GLOBAL = (*VMI->env)->NewGlobalRef(VMI->env, LOCAL); \- (*VMI->env)->DeleteLocalRef(VMI->env, LOCAL); \- } \- DEBUG2("-> new global ref from local: %p -> %p", LOCAL, GLOBAL)+ jobject GLOBAL = (*VMI->env)->NewGlobalRef(VMI->env, LOCAL); \+ (*VMI->env)->DeleteLocalRef(VMI->env, LOCAL); \+ DEBUG2("-> new global ref from local: %p -> %p", LOCAL, GLOBAL); #ifdef FFIJNI_OSX_FRAMEWORK /* def FFIJNI_OSX_FRAMEWORK */ @@ -201,7 +195,7 @@ jobject JNICALL _callCallback(JNIEnv* env, jobject self, jlong func, jobject method, jobjectArray args) {- WrappedFun funPtr = (WrappedFun) (intptr_t) func;+ WrappedFun funPtr = (WrappedFun) func; DEBUG3("Callback called (func: %d -> %p, method: %p)\m", func, funPtr, method) vm_t vmi; vmi.env = env;@@ -213,7 +207,7 @@ void JNICALL _releaseCallback(JNIEnv* env, jobject self, jlong func) {- WrappedFun funPtr = (WrappedFun) (intptr_t) func;+ WrappedFun funPtr = (WrappedFun) func; DEBUG2("Callback released (func: %d -> %p)", func, funPtr) freeFunPtr(funPtr); }@@ -551,8 +545,12 @@ DEBUG2("callStaticObjectMethod(%p, %p)", clazz, method) jobject objLocal = (*vmi->env)->CallStaticObjectMethodA(vmi->env, clazz, method, args);- GLOBAL_REF(vmi, objLocal, obj)- return obj;+ if (objLocal) {+ GLOBAL_REF(vmi, objLocal, obj)+ return obj;+ } else {+ return NULL;+ } } const char*@@ -562,9 +560,7 @@ jobject string = (*vmi->env)->CallStaticObjectMethodA(vmi->env, clazz, method, args); if (string) {- const char* cstring = jStringToCString(vmi, string);- (*vmi->env)->DeleteLocalRef(vmi->env, string);- return cstring;+ return jStringToCString(vmi, string); } else { return NULL; }@@ -648,8 +644,12 @@ DEBUG2("callObjectMethod(%p, %p)", object, method) jobject objLocal = (*vmi->env)->CallObjectMethodA(vmi->env, object, method, args);- GLOBAL_REF(vmi, objLocal, obj)- return obj;+ if (objLocal) {+ GLOBAL_REF(vmi, objLocal, obj)+ return obj;+ } else {+ return NULL;+ } } const char*@@ -659,9 +659,7 @@ jobject string = (*vmi->env)->CallObjectMethodA(vmi->env, object, method, args); if (string) {- const char* cstring = jStringToCString(vmi, string);- (*vmi->env)->DeleteLocalRef(vmi->env, string);- return cstring;+ return jStringToCString(vmi, string); } else { return NULL; }@@ -782,7 +780,6 @@ getObjectField (vm_t* vmi, jobject object, jfieldID field) { jobject objLocal = (*vmi->env)->GetObjectField(vmi->env, object, field);- GLOBAL_REF(vmi, objLocal, obj) return obj; }@@ -791,9 +788,7 @@ getStringField (vm_t* vmi, jobject object, jfieldID field) { jobject string = (*vmi->env)->GetObjectField(vmi->env, object, field);- const char* cstring = jStringToCString(vmi, string);- (*vmi->env)->DeleteLocalRef(vmi->env, string);- return cstring;+ return jStringToCString(vmi, string); } void@@ -984,78 +979,6 @@ setJValueObject (jvalue* array, int ix, jobject object) { (array + ix)->l = object;-}--jarray-newBooleanArray (vm_t* vmi, jsize size)-{- DEBUG1("newBooleanArray(%d)", size)-- return (*vmi->env)->NewBooleanArray(vmi->env, size);-}--jarray-newLongArray (vm_t* vmi, jsize size)-{- DEBUG1("newLongArray(%d)", size)-- return (*vmi->env)->NewLongArray(vmi->env, size);-}--jarray-newIntArray (vm_t* vmi, jsize size)-{- DEBUG1("newIntArray(%d)", size)-- return (*vmi->env)->NewIntArray(vmi->env, size);-}--jarray-newShortArray (vm_t* vmi, jsize size)-{- DEBUG1("newShortArray(%d)", size)-- return (*vmi->env)->NewShortArray(vmi->env, size);-}--jarray-newByteArray (vm_t* vmi, jsize size)-{- DEBUG1("newByteArray(%d)", size)-- return (*vmi->env)->NewByteArray(vmi->env, size);-}--jarray-newFloatArray (vm_t* vmi, jsize size)-{- DEBUG1("newFloatArray(%d)", size)-- return (*vmi->env)->NewFloatArray(vmi->env, size);-}--jarray-newDoubleArray (vm_t* vmi, jsize size)-{- DEBUG1("newDoubleArray(%d)", size)-- return (*vmi->env)->NewDoubleArray(vmi->env, size);-}--jarray-newCharArray (vm_t* vmi, jsize size)-{- DEBUG1("newCharArray(%d)", size)-- return (*vmi->env)->NewCharArray(vmi->env, size);-}--jarray-newObjectArray (vm_t* vmi, jsize size, jclass elementType)-{- DEBUG2("newObjectArray(%d, %p)", size, elementType)-- return (*vmi->env)->NewObjectArray(vmi->env, size, elementType, NULL); } jobject
src/ffijni.h view
@@ -288,33 +288,6 @@ void setJValueObject (jvalue*, int, jobject); -jarray-newBooleanArray (vm_t*, jsize);--jarray-newLongArray (vm_t*, jsize);--jarray-newIntArray (vm_t*, jsize);--jarray-newShortArray (vm_t*, jsize);--jarray-newByteArray (vm_t*, jsize);--jarray-newFloatArray (vm_t*, jsize);--jarray-newDoubleArray (vm_t*, jsize);--jarray-newCharArray (vm_t*, jsize);--jarray-newObjectArray (vm_t*, jsize, jclass);- jobject newJString (vm_t*, const char*);