j2hs (empty) → 0.9
raw patch · 14 files changed
+6321/−0 lines, 14 filesdep +basedep +bimapdep +containersbuild-type:Customsetup-changed
Dependencies added: base, bimap, containers, directory, filepath, haskell-reflect, hinduce-missingh, java-bridge, java-bridge-extras, java-reflect, mtl, multimap, named-records, split, strings, syb, transformers
Files
- LICENSE +18/−0
- Setup.hs +137/−0
- dist/build/j2hs/j2hs-tmp/Bindings.hs +119/−0
- dist/build/j2hs/j2hs-tmp/Java2Haskell.hs +352/−0
- dist/build/j2hs/j2hs-tmp/Main.hs +146/−0
- dist/build/j2hs/j2hs-tmp/Translate.hs +344/−0
- j2hs.cabal +51/−0
- src/Bindings.hss +163/−0
- src/Java2Haskell.hss +324/−0
- src/JavaSE6.hs +3800/−0
- src/Main.hss +141/−0
- src/Options.hs +29/−0
- src/Translate.hss +286/−0
- src/Typomatic.hs +411/−0
+ LICENSE view
@@ -0,0 +1,18 @@+Permission is hereby granted, free of charge, to any person obtaining+a copy of this software and associated documentation files (the "Software"),+to deal in the Software without restriction, including without limitation+the rights to use, copy, modify, merge, publish, distribute, sublicense,+and/or sell copies of the Software, and to permit persons to whom the+Software is furnished to do so, subject to the following conditions:++The above copyright notice and this permission notice shall be included+in all copies or substantial portions of the Software.++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER+DEALINGS IN THE SOFTWARE.+
+ Setup.hs view
@@ -0,0 +1,137 @@+{-# LANGUAGE Haskell2010+ , ScopedTypeVariables+ #-}+{-# OPTIONS+ -Wall+ -fno-warn-missing-signatures+ -fno-warn-name-shadowing+ #-}++import Prelude+import qualified Prelude as P++import Data.List++import Distribution.PackageDescription+import Distribution.Simple+import Distribution.Simple.LocalBuildInfo+import Distribution.Simple.PreProcess++import System.Environment+import System.FilePath++import Text.Printf++import Language.Preprocessor.Cpphs+++main = do+ args <- getArgs++ let hooks = simpleUserHooks {+ hookedPreProcessors = [ ("hss", transformHss)+ , ("cpphs", transformCpphs) ]+ }++ defaultMainWithHooksArgs hooks args+++transformCpphs :: BuildInfo -> LocalBuildInfo -> PreProcessor+transformCpphs _ _ = PreProcessor True $ \(inDir, inFile) (outDir, outFile) _ -> do+ source <- readFile (inDir </> inFile)++ _ <- printf "Preprocessing (CPPHS) %s -> %s\n"+ (inDir </> inFile) (outDir </> outFile)++ let options = defaultCpphsOptions {+ boolopts = (defaultBoolOptions { ansi = True })+ }++ runCpphs options (inDir </> inFile) source+ >>= writeFile (outDir </> outFile)+++transformHss :: BuildInfo -> LocalBuildInfo -> PreProcessor+-- ^ Transforms a *.hss file containing TriString-literals ("""triString""")+-- into an ordinary *.hs file.+transformHss _ _ = PreProcessor True $ \(inDir, inFile) (outDir, outFile) _ -> do+ source <- readFile (inDir </> inFile)++ _ <- printf "Preprocessing (HSS) %s -> %s\n"+ (inDir </> inFile) (outDir </> outFile)++ writeFile (outDir </> outFile) (doProcessHss inFile source)+++-- | The actual processing of 'transformHss'. No advanced method of parsing+-- have been used in order to reduce the dependencies of the Setup script+-- and to now blow it up by a whole combinator library or auto generated code.+--+-- Every triString is replaced by the concatenation of ordinary haskell+-- strings. Code embedded in curly braces (introduced by a hash sign) is+-- embedded literally. LINE pragmas keep the line numbers consistent.+doProcessHss file = processHss (1 :: Int)+ where+ processHss n xs = case xs of+ ('"':'"':'"':xs) -> triString n xs+ ('{':'-':xs) -> '{' : '-' : comment n (1 :: Int) xs+ ('"':xs) -> '"' : string n xs+ ('\n':xs) -> '\n' : processHss (succ n) xs+ (x:xs) -> x : processHss n xs+ "" -> ""+ where+ triString n xs = case breakIt xs of+ (str, xs) -> concat [ "((\\_ -> let { __ = "+ , "\n{-# LINE ", show n, " ", show file, " #-}\n"+ , sanitizeIt (mkTriString str)+ , "\n{-# LINE ", show n', " ", show file, " #-}\n"+ , "} in __) undefined)"+ , processHss n' xs ]+ where n' = n + length (filter (== '\n') str)++ breakIt xs = case xs of+ ('"':'"':'"':xs) -> ("", xs)+ (x:xs) -> case breakIt xs of (y, ys) -> (x : y, ys)+ "" -> ("", "")++ sanitizeIt xs = case xs of+ ('\\':'\\':'n':xs) -> sanitizeIt xs+ (x:xs) -> x : sanitizeIt xs+ "" -> ""++ mkTriString xs = "concat [\"" ++ process string ++ "\"]"+ where+ string = concat $ intersperse "\\n" lines+ process xs = case xs of+ ('#':'{':xs) -> case break (== '}') xs of+ (ls, (_:rs)) -> "\", (" ++ ls ++ "), \"" ++ process rs+ _ -> error "could not match closing curly brace"+ ('"':xs) -> '\\' : '"' : process xs+ (x:xs) -> x : process xs+ [] -> []+ lines = case P.lines xs of+ ("":lines) -> map (dedent (indent lines)) lines+ (line:[]) -> [line]+ lines@(_:lines') -> map (dedent (indent lines')) lines+ [] -> []+ indent xs = case xs of+ [] -> 0+ _ -> minimum $ map (length . takeWhile (== ' ')) xs+ dedent n line = case splitAt n line of+ (ls, rs) -> dropWhile (== ' ') ls ++ rs++ comment l 1 ('-':'}':xs) = '-' : '}' : processHss l xs+ comment l n xs = case xs of+ ('{':'-':xs) -> '{' : '-' : comment l (succ n) xs+ ('-':'}':xs) -> '-' : '}' : comment l (pred n) xs+ ('\n':xs) -> '\n' : comment (succ l) n xs+ (x:xs) -> x : comment l n xs+ "" -> ""++ string l xs = case xs of+ ('\\':'"':xs) -> '\\' : '"' : string l xs+ ('"':xs) -> '"' : processHss l xs+ (x:xs) -> x : string l xs+ "" -> ""++
+ dist/build/j2hs/j2hs-tmp/Bindings.hs view
@@ -0,0 +1,119 @@+{-# LANGUAGE Haskell2010 #-}+{-# OPTIONS -Wall #-}++-- | Functions for generating glue code between Haskell and Java.+module Bindings (++ -- * Create Haskell glue code from Java definitions+ printJavaPackageModule,+ printJavaClassModule,+ printJavaClassBootfile,+ printJavaClassModule',+ printJavaClassBootfile',++ ) where++import Translate+import Foreign.Java.Utils+import Language.Java.Reflect.Types++import Data.Map (Map)++imports :: String+-- ^ Imports of all auto generated java code files.+imports = ((\_ -> let { __ = +{-# LINE 24 "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 as JNIS\nimport Data.Functor ((<$>))\n"]+{-# LINE 31 "Bindings.hss" #-}+} in __) undefined)++classInfoSignature :: String+-- ^ +classInfoSignature = "Prelude.String"++classInfo' :: JavaClass -> String+-- ^ +classInfo' clazz = className clazz++packageInfo' :: String -> a -> String+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 50 "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 62 "Bindings.hss" #-}+} in __) undefined)+ where moduleDeclarations = pkgModDecl classInfo classes+ moduleImports = pkgModImports classInfo classes+ moduleExports = 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 73 "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 87 "Bindings.hss" #-}+} in __) undefined)+ where bootfileDeclarations = classBootDecl classInfo clazz+ bootfileImports = classBootImports classInfo clazz+ moduleDeclarations = classModDecl classInfo clazz+ moduleImports = classModImports classInfo clazz+ moduleExports = 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 = ((\_ -> let { __ = +{-# LINE 100 "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 111 "Bindings.hss" #-}+} in __) undefined)+ where bootfileDeclarations = classBootDecl classInfo clazz+ bootfileImports = classBootImports classInfo clazz+ bootfileExports = 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 = ((\_ -> let { __ = +{-# LINE 122 "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 135 "Bindings.hss" #-}+} in __) undefined)+ where bootfileDeclarations = classBootDecl' classInfo clazz+ bootfileImports = classBootImports' classInfo clazz+ moduleDeclarations = classModDecl' classInfo clazz+ moduleImports = classModImports' classInfo clazz+ moduleExports = 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 = ((\_ -> let { __ = +{-# LINE 148 "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 159 "Bindings.hss" #-}+} in __) undefined)+ where bootfileDeclarations = classBootDecl' classInfo clazz+ bootfileImports = classBootImports' classInfo clazz+ bootfileExports = classBootExports' classInfo clazz+
+ dist/build/j2hs/j2hs-tmp/Java2Haskell.hs view
@@ -0,0 +1,352 @@+{-# LANGUAGE Haskell2010+ #-}+{-# OPTIONS+ -Wall+ -fno-warn-name-shadowing+ #-}++{- | The @j2hs@ command - create Haskell bindings for Java classes.+ +-}+module Java2Haskell where++import Prelude hiding (print)++import Options+import Bindings+import Utils++import Foreign.Java+import Foreign.Java.Utils+import Foreign.Java.IO++import Language.Java.Reflect++import Data.NamedRecord+import qualified Data.List as L+import Data.Strings++import Data.Generics++import Data.Bimap (Bimap)+import Data.Map (Map)+import Data.MultiMap (MultiMap)+import Data.Set (Set)+import qualified Data.Map as Map+import qualified Data.Set as Set+import qualified Data.MultiMap as MultiMap++import Control.Monad+import Control.Monad.IO.Class++import System.Directory+import System.FilePath+import System.IO hiding (print)+import System.Exit++ifVerbose+ :: MonadIO m+ => Options+ -> String+ -> m ()+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 reflectDump_ = opts `get` optLoadReflectDump+ reflectDump <- if null reflectDump_+ then return Nothing+ else canonicalizePath reflectDump_ >>= return . Just++ let classpath' = concat $ L.intersperse ":" classpath+ indent = (" " ++)++ ifVerbose opts ((\_ -> let { __ = +{-# LINE 70 "Java2Haskell.hss" #-}+concat ["Classpath:\n", (concatMap (\x -> " " ++ x ++ "\n") (classpath)), ""]+{-# LINE 72 "Java2Haskell.hss" #-}+} in __) undefined)+ print "Initializing JVM..."+ initJava [((\_ -> let { __ = +{-# LINE 74 "Java2Haskell.hss" #-}+concat ["-Djava.class.path=", (classpath'), ""]+{-# LINE 74 "Java2Haskell.hss" #-}+} in __) undefined)]+ println " Done."+ + unless (null args) $ runJava $ do+ io $ do+ ifVerbose opts ((\_ -> let { __ = +{-# LINE 79 "Java2Haskell.hss" #-}+concat ["Target Directory:\n ", (targetDir), "\n"]+{-# LINE 82 "Java2Haskell.hss" #-}+} in __) undefined)+ createDirectoryIfMissing True targetDir+ setCurrentDirectory targetDir+ + ifVerbose opts ((\_ -> let { __ = +{-# LINE 86 "Java2Haskell.hss" #-}+concat ["Looking for Java classes:\n", (concatMap (\x -> " " ++ x ++ "\n") args), ""]+{-# LINE 88 "Java2Haskell.hss" #-}+} in __) undefined)++ -- Gather all classes that need to be translated+ print "Looking up classes..."+ classes <- findClasses (opts `get` optSearchDepth) args++ println ((\_ -> let { __ = +{-# LINE 94 "Java2Haskell.hss" #-}+concat [" ", (show $ length classes), " found."]+{-# LINE 94 "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 String String+ 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 from packages to classes+ classesByPackage :: MultiMap String String+ classesByPackage = MultiMap.fromList+ $ map (\clazz -> (fst $ splitClassName clazz, clazz)) classes++ -- The list of hidden modules+ hiddenModules = map (++ "__") $ Map.elems classModules++ classInfo <- gatherClassInfo opts reflectDump classModules++ findJavaCore classesByPackage classInfo++ when (opts `get` optOnlyReflect) $ io $ do+ mapM_ println $ Map.elems classInfo+ exitSuccess++ generateModules opts classInfo classesByPackage classModules packageModules hiddenModules++ return ()++{-+findJavaCore2+ :: Map String JavaClass+ -> Java ()+findJavaCore2 classInfo = do++ let classes = +-}++findJavaCore+ :: MultiMap String String+ -> Map String JavaClass+ -> Java ()+findJavaCore classesByPackage classInfo = do++ let packageDependencies :: Map String (Set String)+ packageDependencies = Map.map findDependencies (MultiMap.toMap classesByPackage)+ where+ findDependencies classes = Set.fromList packageDependencies+ where+ dependencies = concatMap (classDependencies . (classInfo Map.!)) classes+ packageDependencies = map (fst . splitClassName) dependencies++ resolve :: Set String -> Set String+ resolve = Set.fromList . concatMap (Set.toList . (packageDependencies Map.!)) . Set.toList++ fullPackageDependencies = Map.map (exhaustively resolve) packageDependencies++ coreJava = intersections (Map.elems fullPackageDependencies)++ println (show $ Set.size coreJava)+ println (Set.toList coreJava)++ forM_ (Map.toList fullPackageDependencies) $ \(pkg, deps) -> do+ let deps' = (deps Set.\\ coreJava)+ print ((\_ -> let { __ = +{-# LINE 185 "Java2Haskell.hss" #-}+concat ["", (pkg), ", ", (show $ Set.size deps'), " (", (show $ Set.size deps), ") dependencies:\n "]+{-# LINE 187 "Java2Haskell.hss" #-}+} in __) undefined)+ println $ Set.toList deps'+++-- Gather information about classes via Reflection+-- or (depending on the opts set) from a dump file.+gatherClassInfo+ :: Options+ -> Maybe FilePath+ -> Map String String+ -> Java (Map String JavaClass)+gatherClassInfo opts reflectDump classModules = do++ print ((\_ -> let { __ = +{-# LINE 200 "Java2Haskell.hss" #-}+concat ["Gathering refection information..."]+{-# LINE 200 "Java2Haskell.hss" #-}+} in __) undefined)+ let classNames = Map.keys classModules+ updName name clazz = (name, clazz { classModName = classModules Map.! name })++ getClassInfo :: Java (Map String JavaClass)+ getClassInfo = Map.fromList+ `fmap` map (uncurry updName)+ `fmap` zip classNames+ `fmap` everywhere (mkT (\(TyVar v) -> TyVar ('_':v)))+ `fmap` reflectClasses classNames++ readClassInfo :: String -> Java (Map String JavaClass)+ readClassInfo reflectFile = io $ do+ file <- openFile reflectFile ReadMode+ contents <- hGetContents file+ let contents' = read contents+ result <- contents' `seq` return contents'+ hClose file+ return result+ + classInfo <- maybe getClassInfo (\f -> print " (from dump)" >> readClassInfo f) reflectDump+ println " Done."++ unless (null (opts `get` optSaveReflectDump)) $ io $ do+ file <- openFile (opts `get` optSaveReflectDump) WriteMode+ print ((\_ -> let { __ = +{-# LINE 225 "Java2Haskell.hss" #-}+concat ["Saving dump of reflection info..."]+{-# LINE 225 "Java2Haskell.hss" #-}+} in __) undefined)+ hPutStr file (show classInfo)+ println " Done."+ hClose file++ return classInfo+++-- This creates a graphviz file which can be used to+-- visualize inter-package dependencies+visualizeDependencies+ :: Map String (Set String)+ -> IO ()+visualizeDependencies packageDependencies = do++ file <- openFile "dependencies.neato" WriteMode+ hPutStrLn file ((\_ -> let { __ = +{-# LINE 241 "Java2Haskell.hss" #-}+concat ["digraph G {\n overlap = false;"]+{-# LINE 241 "Java2Haskell.hss" #-}+} in __) undefined)++ forM_ (Map.toList packageDependencies) $ \(pkg, deps) -> do+ forM_ (Set.toList deps) $ \dep -> do+ let augment = map (\x -> if x == '.' then '_' else x)+ pkg' = augment pkg+ dep' = augment dep+ hPutStr file ((\_ -> let { __ = +{-# LINE 248 "Java2Haskell.hss" #-}+concat [" ", (pkg'), " -> ", (dep'), "\n"]+{-# LINE 248 "Java2Haskell.hss" #-}+} in __) undefined)++ hPutStrLn file ((\_ -> let { __ = +{-# LINE 250 "Java2Haskell.hss" #-}+concat ["}"]+{-# LINE 250 "Java2Haskell.hss" #-}+} in __) undefined)+ hClose file++-- This actually creates the Haskell module files+generateModules+ :: Options+ -> Map String JavaClass+ -> MultiMap String String+ -> Map String String+ -> Bimap CaseInsensitiveString CaseInsensitiveString+ -> [String]+ -> Java ()+generateModules opts classInfo classesByPackage classModules packageModules hiddenModules = do++ println ((\_ -> let { __ = +{-# LINE 264 "Java2Haskell.hss" #-}+concat ["Generating modules for ", (show $ Map.size classModules), " classes in ", (show $ xSize packageModules), " packages..."]+{-# LINE 265 "Java2Haskell.hss" #-}+} in __) undefined)++ -- A list of all modules+ let allModules = xKeysR packageModules ++ Map.elems classModules++ -- 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 308 "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 322 "Java2Haskell.hss" #-}+} in __) undefined)+ hClose cabalFile+
+ dist/build/j2hs/j2hs-tmp/Main.hs view
@@ -0,0 +1,146 @@+{-# LANGUAGE Haskell2010 #-}+{-# OPTIONS+ -Wall+ -fno-warn-missing-signatures+ -fno-warn-name-shadowing+ #-}++module Main where++import Options+import JavaSE6+import Java2Haskell++import Foreign.Java.Utils+import Foreign.Java.JNI (javaBridgeVersion)++import System.Console.GetOpt+import System.Environment (getArgs, getProgName)++import Data.NamedRecord+import Data.List+import Data.List.Split+import Data.Word+++versionInfo = ((\_ -> let { __ = +{-# LINE 26 "Main.hss" #-}+concat ["Java <-> Haskell Bindings Generator (using java-bridge ", (javaBridgeVersion), ")"]+{-# LINE 27 "Main.hss" #-}+} in __) undefined)++helpText = ((\_ -> let { __ = +{-# LINE 29 "Main.hss" #-}+concat ["\n"]+{-# LINE 31 "Main.hss" #-}+} in __) undefined)++-- | The flags (needed for the options list / GetOpt).+data Flag = Help+ | Version+ | Packages [String]+ | Classpath [String]+ | SearchDepth Word32+ | TargetDirectory String+ | SaveReflectDump String+ | LoadReflectDump 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 "D" ["dump-reflection-info"] (ReqArg SaveReflectDump "")+ "Dump reflection information into the file specified by -r.",++ Option "L" ["load-reflection-dump"] (ReqArg LoadReflectDump "")+ "Load a reflection dump instead of looking it up.",++ Option "X" ["java-se"] (NoArg CompleteSE6)+ "Completely translate Java SE.",++ Option "F" ["filtered"] (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+ SaveReflectDump f -> opts `set` optSaveReflectDump := f+ LoadReflectDump f -> opts `set` optLoadReflectDump := f+ 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 -- arg are currently unused+ | opts `get` optShowHelp = do+ progName <- getProgName+ putStrLn (usageInfo ((\_ -> let { __ = +{-# LINE 120 "Main.hss" #-}+concat ["", (versionInfo), "\n\nUsage: ", (progName), " [options]\n\n", (helpText), "\n"]+{-# LINE 126 "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 133 "Main.hss" #-}+concat ["No command given. Use `", (progName), " help' for help.\n"]+{-# LINE 135 "Main.hss" #-}+} in __) undefined)+ where+ justJava = ("java" `isPrefixOf`)+ minimal name = pkg `elem` (opts `get` optPackages)+ where (pkg, _) = splitClassName name++
+ dist/build/j2hs/j2hs-tmp/Translate.hs view
@@ -0,0 +1,344 @@+{-# LANGUAGE Haskell2010 #-}++module Translate where++import Typomatic++import Foreign.Java.Utils+import Data.Map (Map)++import Language.Haskell.Reflect+import Language.Java.Reflect++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 25 "Translate.hss" #-}+concat [" -- * ", (show t), "s\n", (b), ""]+{-# LINE 25 "Translate.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 34 "Translate.hss" #-}+concat [" ", (dataTName haskName), " (..),\n"]+{-# LINE 34 "Translate.hss" #-}+} in __) undefined)+ in ((\_ -> let { __ = +{-# LINE 35 "Translate.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 41 "Translate.hss" #-}+} in __) undefined)+++pkgModImports :: Map String JavaClass -> [JavaClass] -> String+pkgModImports info classes = concatMap (format . classModName) classes+ where format modName = ((\_ -> let { __ = +{-# LINE 46 "Translate.hss" #-}+concat ["import ", (modName), "__ hiding (info')\n"]+{-# LINE 46 "Translate.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 66 "Translate.hss" #-}+concat ["import qualified ", (package), "\n"]+{-# LINE 66 "Translate.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 71 "Translate.hss" #-}+concat ["classModImports in Foreign.Java.Bindings.Java2Haskell - class definition not found"]+{-# LINE 73 "Translate.hss" #-}+} in __) undefined)) id+++classBootDecl :: Map String JavaClass -> JavaClass -> String+classBootDecl info clazz = ((\_ -> let { __ = +{-# LINE 77 "Translate.hss" #-}+concat [""]+{-# LINE 78 "Translate.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 94 "Translate.hss" #-}+concat ["", (name), " :: ", (signature), "\n", (name), " = Prelude.undefined\n"]+{-# LINE 97 "Translate.hss" #-}+} in __) undefined)+ | otherwise = ((\_ -> let { __ = +{-# LINE 98 "Translate.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 108 "Translate.hss" #-}+} in __) undefined)+ where+ arrayTypes+-- | any isArrayType (methodParams method) = True+ | (Just ret) <- fst (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 127 "Translate.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 132 "Translate.hss" #-}+} in __) undefined)+ thisArg = if isStatic then "" else ((\_ -> let { __ = +{-# LINE 133 "Translate.hss" #-}+concat [" ", (head args), "' <- JNI.asObject ", (head args), "\n"]+{-# LINE 133 "Translate.hss" #-}+} in __) undefined)+ readArgs = concatMap ((" " ++). uncurry readArg) (zip argsNotThis (map fst $ methodParams method))+ readArg name jtype = case jtype of+ JBoolean -> ((\_ -> let { __ = +{-# LINE 136 "Translate.hss" #-}+concat ["", (name), "' <- JNIS.toBoolean ", (name), "\n"]+{-# LINE 136 "Translate.hss" #-}+} in __) undefined)+ JChar -> ((\_ -> let { __ = +{-# LINE 137 "Translate.hss" #-}+concat ["", (name), "' <- JNIS.toChar ", (name), "\n"]+{-# LINE 137 "Translate.hss" #-}+} in __) undefined)+ JByte -> ((\_ -> let { __ = +{-# LINE 138 "Translate.hss" #-}+concat ["", (name), "' <- JNIS.toByte ", (name), "\n"]+{-# LINE 138 "Translate.hss" #-}+} in __) undefined)+ JShort -> ((\_ -> let { __ = +{-# LINE 139 "Translate.hss" #-}+concat ["", (name), "' <- JNIS.toShort ", (name), "\n"]+{-# LINE 139 "Translate.hss" #-}+} in __) undefined)+ JInt -> ((\_ -> let { __ = +{-# LINE 140 "Translate.hss" #-}+concat ["", (name), "' <- JNIS.toInt ", (name), "\n"]+{-# LINE 140 "Translate.hss" #-}+} in __) undefined)+ JLong -> ((\_ -> let { __ = +{-# LINE 141 "Translate.hss" #-}+concat ["", (name), "' <- JNIS.toLong ", (name), "\n"]+{-# LINE 141 "Translate.hss" #-}+} in __) undefined)+ JFloat -> ((\_ -> let { __ = +{-# LINE 142 "Translate.hss" #-}+concat ["", (name), "' <- JNIS.toFloat ", (name), "\n"]+{-# LINE 142 "Translate.hss" #-}+} in __) undefined)+ JDouble -> ((\_ -> let { __ = +{-# LINE 143 "Translate.hss" #-}+concat ["", (name), "' <- JNIS.toDouble ", (name), "\n"]+{-# LINE 143 "Translate.hss" #-}+} in __) undefined)+ JObj _ -> ((\_ -> let { __ = +{-# LINE 144 "Translate.hss" #-}+concat ["", (name), "' <- Prelude.Just <$> JNI.asObject ", (name), "\n"]+{-# LINE 144 "Translate.hss" #-}+} in __) undefined)+ JArr _ -> ((\_ -> let { __ = +{-# LINE 145 "Translate.hss" #-}+concat ["", (name), "' <- JNIS.asMaybeArrayObject ", (name), "\n"]+{-# LINE 145 "Translate.hss" #-}+} in __) undefined)+ convertResult = ("JNIS." ++) $ case fst (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 176 "Translate.hss" #-}+concat [" ", (tyclTName haskName), ",\n ", (dataTName haskName), " (..),\n ", (newtTName haskName), " ", (if classEnum clazz then "(..)" else ""), ",\n"]+{-# LINE 180 "Translate.hss" #-}+} in __) undefined)+ where+ haskName = takeClassName $ classModName clazz+ javaName = className clazz+++classBootExports' :: Map String JavaClass -> JavaClass -> String+classBootExports' info clazz = ((\_ -> let { __ = +{-# LINE 187 "Translate.hss" #-}+concat [" ", (tyclTName haskName), ",\n ", (dataTName haskName), " (..),\n ", (newtTName haskName), ",\n"]+{-# LINE 191 "Translate.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 201 "Translate.hss" #-}+concat ["import qualified ", (modName), "__\n"]+{-# LINE 201 "Translate.hss" #-}+} in __) undefined)+ supertypes = map (check . flip Map.lookup info)+ $ Set.toList+ $ Set.fromList (classParents clazz ++ classIfaces clazz)+ check = maybe (error ((\_ -> let { __ = +{-# LINE 205 "Translate.hss" #-}+concat ["classBootImports' in Foreign.Java.Bindings.Java2Haskell - class definition not found"]+{-# LINE 207 "Translate.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 216 "Translate.hss" #-}+concat ["class ", (tyclTDecl), "\ndata ", (newtTDecl), " = ", (enumConstants), "\ndata ", (dataTDecl), " = ", (dataCDecl), "\n"]+{-# LINE 220 "Translate.hss" #-}+} in __) undefined)+ | otherwise = ((\_ -> let { __ = +{-# LINE 221 "Translate.hss" #-}+concat ["class ", (tyclTDecl), "\nnewtype ", (newtTDecl), " = ", (newtCDecl), " JNI.JObject\ndata ", (dataTDecl), " = ", (dataCDecl), "\n"]+{-# LINE 225 "Translate.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 233 "Translate.hss" #-}+concat ["(JNI.JavaObject this", (context), ") => ", (tyclTName baseName), " this"]+{-# LINE 233 "Translate.hss" #-}+} in __) undefined)+ context = concatMap parentContext (classParents clazz)+ parentContext parent = ((\_ -> let { __ = +{-# LINE 235 "Translate.hss" #-}+concat [", ", (qualifiedName), " this"]+{-# LINE 235 "Translate.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 245 "Translate.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 252 "Translate.hss" #-}+} in __) undefined)+ | otherwise = ((\_ -> let { __ = +{-# LINE 253 "Translate.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 269 "Translate.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 279 "Translate.hss" #-}+concat ["instance ", (qualifiedName), " (", (newtTDecl), ")\n"]+{-# LINE 281 "Translate.hss" #-}+} in __) undefined)+ where parentClass = info Map.! parent+ modName = classModName parentClass+ qualifiedName = modName ++ "__." ++ (tyclTName $ takeClassName modName)++
+ j2hs.cabal view
@@ -0,0 +1,51 @@+name: j2hs+version: 0.9++license: MIT+license-file: LICENSE++author: Julian Fleischer <julian.fleischer@fu-berlin.de>+maintainer: Julian Fleischer <julian.fleischer@fu-berlin.de>++stability: experimental+category: Foreign, Java, JVM, FFI Tools++cabal-version: >= 1.8++synopsis: j2hs+description: j2hs++build-type: Custom+++Executable j2hs++ hs-source-dirs: src+ main-is: Main.hs++ other-modules: Options+ , Java2Haskell+ , JavaSE6+ , Translate+ , Typomatic+ , Bindings++ build-depends: base >= 4.5 && < 5+ , hinduce-missingh+ , java-bridge == 0.9+ , java-bridge-extras == 0.9+ , java-reflect == 0.9+ , haskell-reflect == 0.9+ , split >= 0.2.1.1+ , named-records >= 0.5+ , filepath >= 1.3+ , directory >= 1.1.0.2+ , containers >= 0.4.2.1+ , bimap >= 0.2.4+ , multimap >= 1.2+ , syb >= 0.3.6.1+ , strings >= 1.1+ , mtl >= 2.1.1+ , transformers >= 0.3++
+ src/Bindings.hss view
@@ -0,0 +1,163 @@+{-# LANGUAGE Haskell2010 #-}+{-# OPTIONS -Wall #-}++-- | Functions for generating glue code between Haskell and Java.+module Bindings (++ -- * Create Haskell glue code from Java definitions+ printJavaPackageModule,+ printJavaClassModule,+ printJavaClassBootfile,+ printJavaClassModule',+ printJavaClassBootfile',++ ) where++import Translate+import Foreign.Java.Utils+import Language.Java.Reflect.Types++import Data.Map (Map)++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 as JNIS+ import Data.Functor ((<$>))+ """++classInfoSignature :: String+-- ^ +classInfoSignature = "Prelude.String"++classInfo' :: JavaClass -> String+-- ^ +classInfo' clazz = className clazz++packageInfo' :: String -> a -> String+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 = pkgModDecl classInfo classes+ moduleImports = pkgModImports classInfo classes+ moduleExports = 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 = classBootDecl classInfo clazz+ bootfileImports = classBootImports classInfo clazz+ moduleDeclarations = classModDecl classInfo clazz+ moduleImports = classModImports classInfo clazz+ moduleExports = 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 = classBootDecl classInfo clazz+ bootfileImports = classBootImports classInfo clazz+ bootfileExports = 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 = classBootDecl' classInfo clazz+ bootfileImports = classBootImports' classInfo clazz+ moduleDeclarations = classModDecl' classInfo clazz+ moduleImports = classModImports' classInfo clazz+ moduleExports = 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 = classBootDecl' classInfo clazz+ bootfileImports = classBootImports' classInfo clazz+ bootfileExports = classBootExports' classInfo clazz+
+ src/Java2Haskell.hss view
@@ -0,0 +1,324 @@+{-# LANGUAGE Haskell2010+ #-}+{-# OPTIONS+ -Wall+ -fno-warn-name-shadowing+ #-}++{- | The @j2hs@ command - create Haskell bindings for Java classes.+ +-}+module Java2Haskell where++import Prelude hiding (print)++import Options+import Bindings+import Utils++import Foreign.Java+import Foreign.Java.Utils+import Foreign.Java.IO++import Language.Java.Reflect++import Data.NamedRecord+import qualified Data.List as L+import Data.Strings++import Data.Generics++import Data.Bimap (Bimap)+import Data.Map (Map)+import Data.MultiMap (MultiMap)+import Data.Set (Set)+import qualified Data.Map as Map+import qualified Data.Set as Set+import qualified Data.MultiMap as MultiMap++import Control.Monad+import Control.Monad.IO.Class++import System.Directory+import System.FilePath+import System.IO hiding (print)+import System.Exit++ifVerbose+ :: MonadIO m+ => Options+ -> String+ -> m ()+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 reflectDump_ = opts `get` optLoadReflectDump+ reflectDump <- if null reflectDump_+ then return Nothing+ else canonicalizePath reflectDump_ >>= return . Just++ 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 <- findClasses (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 String String+ 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 from packages to classes+ classesByPackage :: MultiMap String String+ classesByPackage = MultiMap.fromList+ $ map (\clazz -> (fst $ splitClassName clazz, clazz)) classes++ -- The list of hidden modules+ hiddenModules = map (++ "__") $ Map.elems classModules++ classInfo <- gatherClassInfo opts reflectDump classModules++ findJavaCore classesByPackage classInfo++ when (opts `get` optOnlyReflect) $ io $ do+ mapM_ println $ Map.elems classInfo+ exitSuccess++ generateModules opts classInfo classesByPackage classModules packageModules hiddenModules++ return ()++{-+findJavaCore2+ :: Map String JavaClass+ -> Java ()+findJavaCore2 classInfo = do++ let classes = +-}++findJavaCore+ :: MultiMap String String+ -> Map String JavaClass+ -> Java ()+findJavaCore classesByPackage classInfo = do++ let packageDependencies :: Map String (Set String)+ packageDependencies = Map.map findDependencies (MultiMap.toMap classesByPackage)+ where+ findDependencies classes = Set.fromList packageDependencies+ where+ dependencies = concatMap (classDependencies . (classInfo Map.!)) classes+ packageDependencies = map (fst . splitClassName) dependencies++ resolve :: Set String -> Set String+ resolve = Set.fromList . concatMap (Set.toList . (packageDependencies Map.!)) . Set.toList++ fullPackageDependencies = Map.map (exhaustively resolve) packageDependencies++ coreJava = intersections (Map.elems fullPackageDependencies)++ println (show $ Set.size coreJava)+ println (Set.toList coreJava)++ forM_ (Map.toList fullPackageDependencies) $ \(pkg, deps) -> do+ let deps' = (deps Set.\\ coreJava)+ print """+ #{pkg}, #{show $ Set.size deps'} (#{show $ Set.size deps}) dependencies:+ """+ println $ Set.toList deps'+++-- Gather information about classes via Reflection+-- or (depending on the opts set) from a dump file.+gatherClassInfo+ :: Options+ -> Maybe FilePath+ -> Map String String+ -> Java (Map String JavaClass)+gatherClassInfo opts reflectDump classModules = do++ print """Gathering refection information..."""+ let classNames = Map.keys classModules+ updName name clazz = (name, clazz { classModName = classModules Map.! name })++ getClassInfo :: Java (Map String JavaClass)+ getClassInfo = Map.fromList+ `fmap` map (uncurry updName)+ `fmap` zip classNames+ `fmap` everywhere (mkT (\(TyVar v) -> TyVar ('_':v)))+ `fmap` reflectClasses classNames++ readClassInfo :: String -> Java (Map String JavaClass)+ readClassInfo reflectFile = io $ do+ file <- openFile reflectFile ReadMode+ contents <- hGetContents file+ let contents' = read contents+ result <- contents' `seq` return contents'+ hClose file+ return result+ + classInfo <- maybe getClassInfo (\f -> print " (from dump)" >> readClassInfo f) reflectDump+ println " Done."++ unless (null (opts `get` optSaveReflectDump)) $ io $ do+ file <- openFile (opts `get` optSaveReflectDump) WriteMode+ print """Saving dump of reflection info..."""+ hPutStr file (show classInfo)+ println " Done."+ hClose file++ return classInfo+++-- This creates a graphviz file which can be used to+-- visualize inter-package dependencies+visualizeDependencies+ :: Map String (Set String)+ -> IO ()+visualizeDependencies packageDependencies = do++ file <- openFile "dependencies.neato" WriteMode+ hPutStrLn file """digraph G {\n overlap = false;"""++ forM_ (Map.toList packageDependencies) $ \(pkg, deps) -> do+ forM_ (Set.toList deps) $ \dep -> do+ let augment = map (\x -> if x == '.' then '_' else x)+ pkg' = augment pkg+ dep' = augment dep+ hPutStr file """ #{pkg'} -> #{dep'}\n"""++ hPutStrLn file """}"""+ hClose file++-- This actually creates the Haskell module files+generateModules+ :: Options+ -> Map String JavaClass+ -> MultiMap String String+ -> Map String String+ -> Bimap CaseInsensitiveString CaseInsensitiveString+ -> [String]+ -> Java ()+generateModules opts classInfo classesByPackage classModules packageModules hiddenModules = do++ println """Generating modules for #{show $ Map.size classModules} classes in \+ #{show $ xSize packageModules} packages..."""++ -- A list of all modules+ let allModules = xKeysR packageModules ++ Map.elems classModules++ -- 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+
+ src/JavaSE6.hs view
@@ -0,0 +1,3800 @@+{-# LANGUAGE Haskell2010 #-}++module 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/Main.hss view
@@ -0,0 +1,141 @@+{-# LANGUAGE Haskell2010 #-}+{-# OPTIONS+ -Wall+ -fno-warn-missing-signatures+ -fno-warn-name-shadowing+ #-}++module Main where++import Options+import JavaSE6+import Java2Haskell++import Foreign.Java.Utils+import Foreign.Java.JNI (javaBridgeVersion)++import System.Console.GetOpt+import System.Environment (getArgs, getProgName)++import Data.NamedRecord+import Data.List+import Data.List.Split+import Data.Word+++versionInfo = """+ Java <-> Haskell Bindings Generator (using java-bridge #{javaBridgeVersion})"""++helpText = """+ + """++-- | The flags (needed for the options list / GetOpt).+data Flag = Help+ | Version+ | Packages [String]+ | Classpath [String]+ | SearchDepth Word32+ | TargetDirectory String+ | SaveReflectDump String+ | LoadReflectDump 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 "D" ["dump-reflection-info"] (ReqArg SaveReflectDump "")+ "Dump reflection information into the file specified by -r.",++ Option "L" ["load-reflection-dump"] (ReqArg LoadReflectDump "")+ "Load a reflection dump instead of looking it up.",++ Option "X" ["java-se"] (NoArg CompleteSE6)+ "Completely translate Java SE.",++ Option "F" ["filtered"] (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+ SaveReflectDump f -> opts `set` optSaveReflectDump := f+ LoadReflectDump f -> opts `set` optLoadReflectDump := f+ 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 -- arg are currently unused+ | opts `get` optShowHelp = do+ progName <- getProgName+ putStrLn (usageInfo """+ #{versionInfo}+ + Usage: #{progName} [options]+ + #{helpText}+ """ 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++
+ src/Options.hs view
@@ -0,0 +1,29 @@+{-# LANGUAGE Haskell2010+ , TemplateHaskell+ #-}++module Options where++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+ `has` "optSaveReflectDump" := ""+ `has` "optLoadReflectDump" := ""+
+ src/Translate.hss view
@@ -0,0 +1,286 @@+{-# LANGUAGE Haskell2010 #-}++module Translate where++import Typomatic++import Foreign.Java.Utils+import Data.Map (Map)++import Language.Haskell.Reflect+import Language.Java.Reflect++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) <- fst (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 (map fst $ 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 fst (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/Typomatic.hs view
@@ -0,0 +1,411 @@+{-# LANGUAGE Haskell2010+ , GeneralizedNewtypeDeriving+ , DeriveDataTypeable+ #-}+{-# OPTIONS+ -Wall+ -fno-warn-name-shadowing+ #-}++-- | INTERNAL module is used to infer Haskell types from Java types.+module Typomatic (+ runTypomatic,+ typomatic,+ ArgInfo (..),++ dataTName,+ dataCName,+ newtTName,+ newtCName,+ tyclTName+) where++import Language.Java.Reflect++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+ }++tr :: Eq a => a -> a -> [a] -> [a]+tr a b (x:xs)+ | a == x = b : tr a b xs+ | otherwise = x : tr a b xs+tr _ _ [] = []++breakLast :: [a] -> ([a], a)+breakLast [a] = ([], a)+breakLast (a:as) =+ let (init', last') = breakLast as+ in (a:init', last')+breakLast _ = error "Foreign.Java.Util.breakLast: empty list"+++--------------------+-- 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) (map fst $ methodParams method)+ ret = maybe "JNI.void" printJniType (fst $ 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])+ ++ map snd (methodParams method)+ ++ [maybe (TypeVarReference (TyVar "()"))+ (const $ snd $ methodReturnType method)+ (fst $ methodReturnType method)]+ jtypes = (if methodStatic method then [] else [JObj className])+ ++ map fst (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 $ map fst $ 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 fst (methodReturnType method) of+ Just (JObj typeName) -> case jgtType (snd $ methodReturnType 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 fst (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 (fst $ 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++++