Skip to content
Skip to breadcrumbs
Skip to header menu
Skip to action menu
Skip to quick search
Quick Search
Browse
Pages
Blog
Labels
Attachments
Mail
Advanced
What’s New
Space Directory
Feed Builder
Keyboard Shortcuts
Confluence Gadgets
Log In
Sign Up
Dashboard
Groovy
Copy Page
You are not logged in. Any changes you make will be marked as
anonymous
. You may want to
Log In
if you already have an account. You can also
Sign Up
for a new account.
This page is being edited by
.
Paragraph
Paragraph
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Preformatted
Quote
Bold
Italic
Underline
More colours
Strikethrough
Subscript
Superscript
Monospace
Clear Formatting
Bullet list
Numbered list
Outdent
Indent
Align left
Align center
Align right
Link
Table
Insert
Insert Content
Image
Link
Attachment
Symbol
Emoticon
Wiki Markup
Horizontal rule
tinymce.confluence.insert_menu.macro_desc
Info
JIRA Issue
Status
Gallery
Tasklist
Table of Contents
Other Macros
Page Layout
No Layout
Two column (simple)
Two column (simple, left sidebar)
Two column (simple, right sidebar)
Three column (simple)
Two column
Two column (left sidebar)
Two column (right sidebar)
Three column
Three column (left and right sidebars)
Undo
Redo
Find/Replace
Keyboard Shortcuts Help
<h1>Rationale</h1><p>Groovy has become a pretty complete package with more than just the language itself, but also with several useful APIs and wrappers to simplify the life of developers, dealing with Ant, Swing, XML, JDBC, command-line, and more. The main groovy-all JAR has reached over 4MB, preventing, for example, usage in an applet, as the time to load the JAR is too long. Recognizing that nobody needs everything in Groovy, it is time we rework the Groovy source organization, deliverables, project build, and more. However, this is a "big bang" kind of change that needs a good level of discipline to get through properly, as several key steps will have to be made.</p><h1>Key steps</h1><p>Having a modular system means that:</p><ul><li><strong>sources will have to be reorganized</strong>: this is where a DVCS system will be especially useful</li><li><strong>modules will have to be created</strong>: as source code is being reorganized, modules will be created, but will need to be built using a multi-module approach</li></ul><p>A good approach will be to follow some baby steps:</p><ul><li>providing a new build which will support multiple modules in the future</li><li>migrating to a DVCS system to ease the migration</li><li>progressively migrate one module at a time, to avoid any breakage</li></ul><h2>Build System</h2><p>The major options for modular build systems are:</p><ul><li>gradle</li><li>mvn (+gmaven)</li></ul><p>A concensus is emerging that Gradle should be our new build infrastructure. A Gradle replacement for the current Ant build will be created over the next few weeks. This can then be evolved into a multi-project build once the module structure is decided.</p><p>We'll also need to ensure that our toolset will properly support a Gradle build infrastructure:</p><ul><li>IDEs: IntelliJ IDEA supports Gradle out of the box, for instance</li><li>CI: continuous integration servers should be able to build a Gradle-poweed build of Groovy</li></ul><h2>Source reorganization and repository</h2><h3>Move to a DVCS system: Git</h3><p>To help with external contributions, and also to ease the work of source code reorganization, it'll be interesting to move to a different source code repository, moving from Subversion to a distributed source control system. Git is the choice made for DVCS at Codehaus, so we'll migrate to Git as part of the process.</p><p>Here again, we need to ensure that tool support is okay with Git:</p><ul><li>IDEs: IntelliJ IDEA offers a great support of Git, the command-line is also usable, of course. Eclipse has some support for Git.</li><li>FishEye: FishEye is pretty handy for navigating in the source's history. We need to check that the issues of FishEye support for Git are fixed.</li><li>CI: the continuous integration servers should be able to checkout the source code from Git. Codehaus' Bamboo already has suypport for Git.</li></ul><h3>Base structure</h3><p>The current SVN structure does not really follow standards. For example, groovy-core, a separately release component (at the moment, hope to change), is located at: <a class="external-link" href="http://svn.codehaus.org/groovy/trunk/groovy/groovy-core/" rel="nofollow">http://svn.codehaus.org/groovy/trunk/groovy/groovy-core/</a><br /> This should really be something like:<br /> The modules listed above would be listed under: <a class="external-link" href="http://svn.codehaus.org/groovy/core/trunk/" rel="nofollow">http://svn.codehaus.org/groovy/core/trunk/</a><module><br /> And they would be release together. Completely optional projects, like the native support, ide support, etc. should be located at: <a class="external-link" href="http://svn.codehaus.org/groovy/" rel="nofollow">http://svn.codehaus.org/groovy/</a><project>/trunk</p><p>Such a structure will ensure the core modules follow the same lifecycle as groovy-core, whereas external modules cans still be evolved independently, and don't need to be released alongside Groovy releases.</p><p>There should perhaps be three levels of module:</p><ol><li>Core</li><li>Non-core, centrally supported</li><li>Others</li></ol><p>Core modules are those needed for the core set of functionality to work. Whether these are shipped as a single jar or a set of jars is up for debate. Everything in this category should be held in the central Git master repository.</p><p>Non-core, centrally supported should be in separate Git repositories, not in the Groovy master. They should though be managed from Codehaus in tight-knit collaboration with the master core repository.</p><p>Others are modules held by whom and wherever they are held. These might be managed using Bazaar, Mercurial, or Git – there is no need to impose Git as a tool unless they are to migrate into one of the two above centrally managed in which case they must migrate to use Git.</p><p>There should be a central index of core modules, non-core centrally managed modules and of any other modules people care to register with the index.</p><h2>Other considerations</h2><h3>OSGi</h3><p>Since we've made Groovy's deliverables be proper OSGi bundles, we need to persue our efforts, and make sure the core modules are also valid OSGi bundles, also marking dependencies between core modules, and external dependencies.</p><h3>DefaultGroovyMethods registration</h3><p>Some modules (swing, sql) also provide their own DefaultGroovyMethods. We'll need to figure out a way for these modules to register their own DGM methods, such as a META-INF/services technique.</p><h3>Capabilities support</h3><p>An old JIRA issue we may consider: <a class="external-link" href="http://jira.codehaus.org/browse/GROOVY-2422" rel="nofollow">http://jira.codehaus.org/browse/GROOVY-2422</a><br /> The idea is to provide a "capabilities" mechanism to Groovy, to know which features are supported in the current Groovy version.<br /> Inspired by this issue, we could at least provide some utility class (for instance in GroovySystem) where we could discover the existing modules available on the classpath.</p><h1>Modules</h1><h2>Proposed structure</h2><p>Here's a module structure we could follow. We shouldn't multiplicate the number of modules to a useless high number, but focus on core functionality, and ensure a pure core will be small enough to be easily embeddable and downloadable (for applets, mobile devices such as Android, etc.)</p><ul><li>groovy-core</li><li>modules<ul><li>test</li><li>jmx</li><li>swing</li><li>xml</li><li>sql</li><li>web</li><li>template</li><li>integration<ul><li>bean-scripting-framework</li><li>javax.script</li></ul></li><li>tools<ul><li>groovydoc</li><li>shell</li><li>console</li><li>java2groovy</li></ul></li></ul></li></ul><h2>Issues to be aware of</h2><p>Certain classes would naturally belong to certain modules, but are sometimes used in core, etc.</p><p>A good example of this is GroovyTestCase and GroovyShellTestCase. These two classes would naturally go into the test module, but it means the core module would depend on test, but test would already depend on core. So, so far, in the following approach, I've kept these base classes (not very heavyweight anyway) in core, but we'll have to figure out a good way to migrate them in their respective module.</p><p>Another example is the java2groovy tool (not very much used, may perhaps be discarded at some point). It belongs to its own module, under some tools meta-module, but the trick with this tool is that it also contributes some batch scripts so one can run the tool from the command-line easily. For the normal distribution, anyway, we can embed those scripts, so that shouldn't be critical.</p><p>An important thing to consider is DefaultGroovyMethods. There are already some work done in that area to split methods related to SQL/JDBC and for Swing. So these additional DGM methods will naturally go in their respective modules (ie. sql and swing), but that means we need to provide a mechanism for discovering and registering such methods, for example with some META-INF/services discovery mechanism.</p><p>The modules proposed here are more or less coarse-grained modules, in order to keep things simple, and to try to regroup things by big functionality. But some things may be split furthermore. For instance, we could put CliBuilder into its own class, and the same for AntBuilder (although those two are really just one class each!). It may be interesting to do so, also because these classes need additional dependencies (respectively commons-cli and ant). Speaking of splitting those builders into their respective modules, we could even regroup such builders into some meta-builder module.</p><p>The groupings below are done per functionality, so even if some utility class like groovy.util.GroovyMBean is in groovy.util, I moved it to the jmx module. Ultimately, it'd certainly be nicer to move such classes into their proper packages, following a deprecation strategy.</p><h2>More detailed regroupment of classes into each module</h2><p>I've created a little Groovy script to list / group all the Java and Groovy classes per package. Afterwards, I've moved the packages and some individual classes to form modules according to their respective feature set.</p><hr /><h3>Module: groovy-core</h3><h5>Package: groovy.beans</h5><ul class="alternate"><li>Bindable.java</li><li>BindableASTTransformation.java</li><li>Vetoable.java</li><li>VetoableASTTransformation.java</li></ul><h5>Package: groovy.grape</h5><ul class="alternate"><li>GrabAnnotationTransformation.java</li><li>Grape.java</li><li>GrapeEngine.java</li><li>GrapeIvy.groovy</li></ul><h5>Package: groovy.io</h5><ul class="alternate"><li>EncodingAwareBufferedWriter.java</li><li>GroovyPrintStream.java</li><li>GroovyPrintWriter.java</li><li>PlatformLineWriter.java</li></ul><h5>Package: groovy.lang</h5><ul class="alternate"><li>AdaptingMetaClass.java</li><li>BenchmarkInterceptor.java</li><li>Binding.java</li><li>Buildable.java</li><li>Category.java</li><li>Closure.java</li><li>ClosureException.java</li><li>ClosureInvokingMethod.java</li><li>Delegate.java</li><li>DelegatingMetaClass.java</li><li>DeprecationException.java</li><li>EmptyRange.java</li><li>ExpandoMetaClass.java</li><li>ExpandoMetaClassCreationHandle.java</li><li>Grab.java</li><li>GrabConfig.java</li><li>GrabExclude.java</li><li>GrabResolver.java</li><li>Grapes.java</li><li>GroovyClassLoader.java</li><li>GroovyCodeSource.java</li><li>GroovyInterceptable.java</li><li>GroovyLogTestCase.groovy</li><li>GroovyObject.java</li><li>GroovyObjectSupport.java</li><li>GroovyResourceLoader.java</li><li>GroovyRuntimeException.java</li><li>GroovyShell.java</li><li>GroovySystem.java</li><li>GString.java</li><li>IllegalPropertyAccessException.java</li><li>Immutable.java</li><li>IncorrectClosureArgumentsException.java</li><li>Interceptor.java</li><li>IntRange.java</li><li>Lazy.java</li><li>MetaArrayLengthProperty.java</li><li>MetaBeanProperty.java</li><li>MetaClass.java</li><li>MetaClassImpl.java</li><li>MetaClassRegistry.java</li><li>MetaClassRegistryChangeEvent.java</li><li>MetaClassRegistryChangeEventListener.java</li><li>MetaExpandoProperty.java</li><li>MetaMethod.java</li><li>MetaObjectProtocol.java</li><li>MetaProperty.java</li><li>MissingClassException.java</li><li>MissingFieldException.java</li><li>MissingMethodException.java</li><li>MissingPropertyException.java</li><li>Mixin.java</li><li>MutableMetaClass.java</li><li>Newify.java</li><li>NonEmptySequence.java</li><li>ObjectRange.java</li><li>PackageScope.java</li><li>ParameterArray.java</li><li>PropertyAccessInterceptor.java</li><li>PropertyValue.java</li><li>ProxyMetaClass.java</li><li>Range.java</li><li>ReadOnlyPropertyException.java</li><li>Reference.java</li><li>Script.java</li><li>Sequence.java</li><li>Singleton.java</li><li>SpreadListEvaluatingException.java</li><li>SpreadMap.java</li><li>SpreadMapEvaluatingException.java</li><li>StringWriterIOException.java</li><li>TracingInterceptor.java</li><li>Tuple.java</li><li>Writable.java</li></ul><h5>Package: groovy.security</h5><ul class="alternate"><li>GroovyCodeSourcePermission.java</li></ul><h5>Package: groovy.time</h5><ul class="alternate"><li>BaseDuration.java</li><li>DatumDependentDuration.java</li><li>Duration.java</li><li>TimeCategory.java</li><li>TimeDatumDependentDuration.java</li><li>TimeDuration.java</li></ul><h5>Package: org.codehaus.groovy.ant</h5><ul class="alternate"><li>AntProjectPropertiesDelegate.java</li><li>CompileTaskSupport.java</li><li>FileIterator.java</li><li>FileScanner.java</li><li>GenerateStubsTask.java</li><li>Groovy.java</li><li>Groovyc.java</li><li>GroovycTask.java</li><li>Groovydoc.java</li><li>LoggingHelper.java</li><li>RootLoaderRef.java</li><li>UberCompileTask.java</li><li>VerifyClass.java</li></ul><h5>Package: org.codehaus.groovy.antlr</h5><ul class="alternate"><li>AntlrASTProcessor.java</li><li>AntlrASTProcessSnippets.java</li><li>AntlrParserPlugin.java</li><li>AntlrParserPluginFactory.java</li><li>ASTParserException.java</li><li>ASTRuntimeException.java</li><li>EnumHelper.java</li><li>GroovySourceAST.java</li><li>GroovySourceToken.java</li></ul><h5>Package: org.codehaus.groovy.antlr.parser</h5><ul class="alternate"><li>GroovyLexer.java</li><li>GroovyRecognizer.java</li><li>GroovyTokenTypes.java</li><li>SourceBuffer.java</li><li>SourceInfo.java</li></ul><h5>Package: org.codehaus.groovy.antlr.treewalker</h5><ul class="alternate"><li>CompositeVisitor.java</li><li>FlatNodeListTraversal.java</li><li>MindMapPrinter.java</li><li>NodeAsHTMLPrinter.java</li><li>NodeCollector.java</li><li>NodePrinter.java</li><li>PreOrderTraversal.java</li><li>SourceCodeTraversal.java</li><li>SourcePrinter.java</li><li>TraversalHelper.java</li><li>Visitor.java</li><li>VisitorAdapter.java</li><li>UnicodeEscapingReader.java</li></ul><h5>Package: org.codehaus.groovy.ast</h5><ul class="alternate"><li>AnnotatedNode.java</li><li>AnnotationNode.java</li><li>ASTNode.java</li></ul><h5>Package: org.codehaus.groovy.ast.builder</h5><ul class="alternate"><li>AstBuilder.groovy</li><li>AstBuilderTransformation.groovy</li><li>AstSpecificationCompiler.groovy</li><li>AstStringCompiler.groovy</li><li>ClassCodeExpressionTransformer.java</li><li>ClassCodeVisitorSupport.java</li><li>ClassHelper.java</li><li>ClassNode.java</li><li>CodeVisitorSupport.java</li><li>CompileUnit.java</li><li>ConstructorNode.java</li><li>DynamicVariable.java</li></ul><h5>Package: org.codehaus.groovy.ast.expr</h5><ul class="alternate"><li>AnnotationConstantExpression.java</li><li>ArgumentListExpression.java</li><li>ArrayExpression.java</li><li>AttributeExpression.java</li><li>BinaryExpression.java</li><li>BitwiseNegationExpression.java</li><li>BooleanExpression.java</li><li>CastExpression.java</li><li>ClassExpression.java</li><li>ClosureExpression.java</li><li>ClosureListExpression.java</li><li>ConstantExpression.java</li><li>ConstructorCallExpression.java</li><li>DeclarationExpression.java</li><li>ElvisOperatorExpression.java</li><li>EmptyExpression.java</li><li>Expression.java</li><li>ExpressionTransformer.java</li><li>FieldExpression.java</li><li>GStringExpression.java</li><li>ListExpression.java</li><li>MapEntryExpression.java</li><li>MapExpression.java</li><li>MethodCallExpression.java</li><li>MethodPointerExpression.java</li><li>NamedArgumentListExpression.java</li><li>NotExpression.java</li><li>PostfixExpression.java</li><li>PrefixExpression.java</li><li>PropertyExpression.java</li><li>RangeExpression.java</li><li>RegexExpression.java</li><li>SpreadExpression.java</li><li>SpreadMapExpression.java</li><li>StaticMethodCallExpression.java</li><li>TernaryExpression.java</li><li>TupleExpression.java</li><li>UnaryMinusExpression.java</li><li>UnaryPlusExpression.java</li><li>VariableExpression.java</li><li>FieldNode.java</li><li>GenericsType.java</li><li>GroovyClassVisitor.java</li><li>GroovyCodeVisitor.java</li><li>ImportNode.java</li><li>InnerClassNode.java</li><li>InterfaceHelperClassNode.java</li><li>MethodNode.java</li><li>MixinASTTransformation.java</li><li>MixinNode.java</li><li>ModuleNode.java</li><li>PackageNode.java</li><li>Parameter.java</li><li>PropertyNode.java</li></ul><h5>Package: org.codehaus.groovy.ast.stmt</h5><ul class="alternate"><li>AssertStatement.java</li><li>BlockStatement.java</li><li>BreakStatement.java</li><li>CaseStatement.java</li><li>CatchStatement.java</li><li>ContinueStatement.java</li><li>DoWhileStatement.java</li><li>EmptyStatement.java</li><li>ExpressionStatement.java</li><li>ForStatement.java</li><li>IfStatement.java</li><li>ReturnStatement.java</li><li>Statement.java</li><li>SwitchStatement.java</li><li>SynchronizedStatement.java</li><li>ThrowStatement.java</li><li>TryCatchStatement.java</li><li>WhileStatement.java</li><li>Variable.java</li><li>VariableScope.java</li></ul><h5>Package: org.codehaus.groovy.binding</h5><ul class="alternate"><li>AbstractFullBinding.java</li><li>AggregateBinding.java</li><li>BindingProxy.java</li><li>BindingUpdatable.java</li><li>BindPath.java</li><li>ClosureSourceBinding.java</li><li>ClosureTriggerBinding.java</li><li>EventTriggerBinding.java</li><li>FullBinding.java</li><li>MutualPropertyBinding.java</li><li>PropertyBinding.java</li><li>PropertyChangeProxyTargetBinding.java</li><li>PropertyPathFullBinding.java</li><li>SourceBinding.java</li><li>SwingTimerTriggerBinding.java</li><li>TargetBinding.java</li><li>TriggerBinding.java</li></ul><h5>Package: org.codehaus.groovy.classgen</h5><ul class="alternate"><li>AnnotationVisitor.java</li><li>AsmClassGenerator.java</li><li>BytecodeExpression.java</li><li>BytecodeHelper.java</li><li>BytecodeInstruction.java</li><li>BytecodeSequence.java</li><li>ClassCompletionVerifier.java</li><li>ClassGenerator.java</li><li>ClassGeneratorException.java</li><li>CompileStack.java</li><li>DummyClassGenerator.java</li><li>EnumVisitor.java</li><li>ExtendedVerifier.java</li><li>genArrayAccess.groovy</li><li>genArrays.groovy</li><li>genDgmMath.groovy</li><li>GeneratorContext.java</li><li>genMathModification.groovy</li><li>GroovyCompilerVersion.java</li><li>InnerClassVisitor.java</li><li>MethodCaller.java</li><li>MethodCallerMultiAdapter.java</li><li>ReturnAdder.java</li><li>RuntimeIncompleteClassException.java</li><li>Variable.java</li><li>VariableScopeVisitor.java</li><li>Verifier.java</li><li>VerifierCodeVisitor.java</li></ul><h5>Package: org.codehaus.groovy.control</h5><ul class="alternate"><li>CompilationFailedException.java</li><li>CompilationUnit.java</li><li>CompilePhase.java</li><li>CompilerConfiguration.java</li><li>ConfigurationException.java</li><li>ErrorCollector.java</li><li>GenericsVisitor.java</li><li>HasCleanup.java</li></ul><h5>Package: org.codehaus.groovy.control.io</h5><ul class="alternate"><li>AbstractReaderSource.java</li><li>FileReaderSource.java</li><li>InputStreamReaderSource.java</li><li>NullWriter.java</li><li>ReaderSource.java</li><li>StringReaderSource.java</li><li>URLReaderSource.java</li><li>Janitor.java</li><li>LabelVerifier.java</li></ul><h5>Package: org.codehaus.groovy.control.messages</h5><ul class="alternate"><li>ExceptionMessage.java</li><li>LocatedMessage.java</li><li>Message.java</li><li>SimpleMessage.java</li><li>SyntaxErrorMessage.java</li><li>WarningMessage.java</li><li>MultipleCompilationErrorsException.java</li><li>OptimizerVisitor.java</li><li>ParserPlugin.java</li><li>ParserPluginFactory.java</li><li>Phases.java</li><li>ProcessingUnit.java</li><li>ResolveVisitor.java</li><li>SourceUnit.java</li><li>StaticImportVisitor.java</li><li>GroovyBugError.java</li></ul><h5>Package: org.codehaus.groovy.tools.ast</h5><ul class="alternate"><li>TranformTestHelper.groovy</li><li>Compiler.java</li><li>DgmConverter.java</li><li>ErrorReporter.java</li><li>FileSystemCompiler.java</li><li>GrapeMain.groovy</li><li>GroovyClass.java</li></ul><h5>Package: org.codehaus.groovy.tools.gse</h5><ul class="alternate"><li>DependencyTracker.java</li><li>StringSetMap.java</li></ul><h5>Package: org.codehaus.groovy.tools.javac</h5><ul class="alternate"><li>JavaAwareCompilationUnit.java</li><li>JavaAwareResolveVisitor.java</li><li>JavacCompilerFactory.java</li><li>JavacJavaCompiler.java</li><li>JavaCompiler.java</li><li>JavaCompilerFactory.java</li><li>JavaStubCompilationUnit.java</li><li>JavaStubGenerator.java</li><li>LoaderConfiguration.java</li><li>RootLoader.java</li></ul><h5>Package: org.codehaus.groovy.transform</h5><ul class="alternate"><li>ASTTransformation.java</li><li>ASTTransformationCollectorCodeVisitor.java</li><li>ASTTransformationVisitor.java</li><li>CategoryASTTransformation.java</li><li>DelegateASTTransformation.java</li><li>GroovyASTTransformation.java</li><li>GroovyASTTransformationClass.java</li><li>ImmutableASTTransformation.java</li><li>LazyASTTransformation.java</li><li>NewifyASTTransformation.java</li><li>PackageScopeASTTransformation.java</li></ul><h5>Package: org.codehaus.groovy.transform.powerassert</h5><ul class="alternate"><li>AssertionRenderer.java</li><li>AssertionRewriter.java</li><li>AssertionTransformation.java</li><li>AssertionVerifier.java</li><li>PowerAssertionError.java</li><li>SourceText.java</li><li>SourceTextNotAvailableException.java</li><li>StatementReplacingVisitorSupport.java</li><li>TruthExpressionRewriter.java</li><li>Value.java</li><li>ValueRecorder.java</li><li>SingletonASTTransformation.java</li></ul><h5>Package: org.codehaus.groovy.util</h5><ul class="alternate"><li>AbstractConcurrentDoubleKeyMap.java</li><li>AbstractConcurrentMap.java</li><li>AbstractConcurrentMapBase.java</li><li>ComplexKeyHashMap.java</li><li>DoubleKeyHashMap.java</li><li>FastArray.java</li><li>Finalizable.java</li><li>HashCodeHelper.java</li><li>LazyReference.java</li><li>LockableObject.java</li><li>ManagedConcurrentMap.java</li><li>ManagedDoubleKeyMap.java</li><li>ManagedLinkedList.java</li><li>ManagedReference.java</li><li>Reference.java</li><li>ReferenceBundle.java</li><li>ReferenceManager.java</li><li>ReferenceType.java</li><li>ReleaseInfo.java</li><li>SingleKeyHashMap.java</li><li>TripleKeyHashMap.java</li></ul><h5>Package: org.codehaus.groovy.runtime.typehandling</h5><ul class="alternate"><li>BigDecimalMath.java</li><li>BigIntegerMath.java</li><li>ClassDistance.java</li><li>DefaultTypeTransformation.java</li><li>FloatingPointMath.java</li><li>GroovyCastException.java</li><li>IntegerMath.java</li><li>LongMath.java</li><li>NumberMath.java</li><li>NumberMathModificationInfo.java</li></ul><h5>Package: org.codehaus.groovy.runtime.wrappers</h5><ul class="alternate"><li>BooleanWrapper.java</li><li>ByteWrapper.java</li><li>CharWrapper.java</li><li>DoubleWrapper.java</li><li>FloatWrapper.java</li><li>GroovyObjectWrapper.java</li><li>IntWrapper.java</li><li>LongWrapper.java</li><li>PojoWrapper.java</li><li>ShortWrapper.java</li><li>Wrapper.java</li><li>WritableFile.java</li><li>XmlGroovyMethods.java</li></ul><h5>Package: org.codehaus.groovy.syntax</h5><ul class="alternate"><li>ASTHelper.java</li><li>CSTNode.java</li><li>Numbers.java</li><li>ParserException.java</li><li>ReadException.java</li><li>Reduction.java</li><li>RuntimeParserException.java</li><li>SyntaxException.java</li><li>Token.java</li><li>TokenException.java</li><li>TokenMismatchException.java</li><li>Types.java</li></ul><h5>Package: org.codehaus.groovy.reflection</h5><ul class="alternate"><li>CachedClass.java</li><li>CachedConstructor.java</li><li>CachedField.java</li><li>CachedMethod.java</li><li>ClassInfo.java</li><li>ClassLoaderForClassArtifacts.java</li><li>GeneratedMetaMethod.java</li><li>handlegen.groovy</li><li>MethodHandle.java</li><li>MethodHandleFactory.java</li><li>MixinInMetaClass.java</li><li>ParameterTypes.java</li><li>ReflectionCache.java</li><li>ReflectionUtils.java</li></ul><h5>Package: org.codehaus.groovy.reflection.stdclasses</h5><ul class="alternate"><li>ArrayCachedClass.java</li><li>BigDecimalCachedClass.java</li><li>BigIntegerCachedClass.java</li><li>BooleanCachedClass.java</li><li>ByteCachedClass.java</li><li>CachedClosureClass.java</li><li>CharacterCachedClass.java</li><li>DoubleCachedClass.java</li><li>FloatCachedClass.java</li><li>IntegerCachedClass.java</li><li>LongCachedClass.java</li><li>NumberCachedClass.java</li><li>ObjectCachedClass.java</li><li>ShortCachedClass.java</li><li>StringCachedClass.java</li><li>SunClassLoader.java</li></ul><h5>Package: org.codehaus.groovy.runtime</h5><ul class="alternate"><li>ArrayUtil.java</li></ul><h5>Package: org.codehaus.groovy.runtime.callsite</h5><ul class="alternate"><li>AbstractCallSite.java</li><li>CallSite.java</li><li>CallSiteArray.java</li><li>CallSiteAwareMetaMethod.java</li><li>CallSiteClassLoader.java</li><li>CallSiteGenerator.java</li><li>ClassMetaClassGetPropertySite.java</li><li>ConstructorMetaClassSite.java</li><li>ConstructorMetaMethodSite.java</li><li>ConstructorSite.java</li><li>DummyCallSite.java</li><li>GetEffectivePogoFieldSite.java</li><li>GetEffectivePogoPropertySite.java</li><li>GetEffectivePojoFieldSite.java</li><li>GetEffectivePojoPropertySite.java</li><li>GroovySunClassLoader.java</li><li>MetaClassConstructorSite.java</li><li>MetaClassSite.java</li><li>MetaMethodSite.java</li><li>NullCallSite.java</li><li>PerInstancePojoMetaClassSite.java</li><li>PogoGetPropertySite.java</li><li>PogoInterceptableSite.java</li><li>PogoMetaClassGetPropertySite.java</li><li>PogoMetaClassSite.java</li><li>PogoMetaMethodSite.java</li><li>PojoMetaClassGetPropertySite.java</li><li>PojoMetaClassSite.java</li><li>PojoMetaMethodSite.java</li><li>StaticMetaClassSite.java</li><li>StaticMetaMethodSite.java</li><li>ClassExtender.java</li><li>ConversionHandler.java</li><li>ConvertedClosure.java</li><li>ConvertedMap.java</li><li>CurriedClosure.java</li><li>DefaultCachedMethodKey.java</li><li>DefaultGroovyMethods.java</li><li>DefaultGroovyMethodsSupport.java</li><li>DefaultGroovyStaticMethods.java</li><li>DefaultMethodKey.java</li></ul><h5>Package: org.codehaus.groovy.runtime.dgmimpl.arrays</h5><ul class="alternate"><li>ArrayGetAtMetaMethod.java</li><li>ArrayMetaMethod.java</li><li>ArrayPutAtMetaMethod.java</li><li>BooleanArrayGetAtMetaMethod.java</li><li>BooleanArrayPutAtMetaMethod.java</li><li>ByteArrayGetAtMetaMethod.java</li><li>ByteArrayPutAtMetaMethod.java</li><li>CharacterArrayGetAtMetaMethod.java</li><li>CharacterArrayPutAtMetaMethod.java</li><li>DoubleArrayGetAtMetaMethod.java</li><li>DoubleArrayPutAtMetaMethod.java</li><li>FloatArrayGetAtMetaMethod.java</li><li>FloatArrayPutAtMetaMethod.java</li><li>IntegerArrayGetAtMetaMethod.java</li><li>IntegerArrayPutAtMetaMethod.java</li><li>LongArrayGetAtMetaMethod.java</li><li>LongArrayPutAtMetaMethod.java</li><li>ObjectArrayGetAtMetaMethod.java</li><li>ObjectArrayPutAtMetaMethod.java</li><li>ShortArrayGetAtMetaMethod.java</li><li>ShortArrayPutAtMetaMethod.java</li><li>NumberNumberDiv.java</li><li>NumberNumberMetaMethod.java</li><li>NumberNumberMinus.java</li><li>NumberNumberMultiply.java</li><li>NumberNumberPlus.java</li><li>FlushingStreamWriter.java</li><li>GeneratedClosure.java</li><li>GroovyCategorySupport.java</li><li>GStringImpl.java</li><li>HandleMetaClass.java</li><li>InvokerHelper.java</li><li>InvokerInvocationException.java</li><li>IteratorClosureAdapter.java</li></ul><h5>Package: org.codehaus.groovy.runtime.metaclass</h5><ul class="alternate"><li>ClosureMetaClass.java</li><li>ClosureMetaMethod.java</li><li>ClosureStaticMetaMethod.java</li><li>ConcurrentReaderHashMap.java</li><li>MemoryAwareConcurrentReadMap.java</li><li>MetaClassRegistryImpl.java</li><li>MetaMethodIndex.java</li><li>MethodHelper.java</li><li>MethodSelectionException.java</li><li>MissingMethodExceptionNoStack.java</li><li>MissingMethodExecutionFailed.java</li><li>MissingPropertyExceptionNoStack.java</li><li>MixedInMetaClass.java</li><li>MixinInstanceMetaMethod.java</li><li>MixinInstanceMetaProperty.java</li><li>NewInstanceMetaMethod.java</li><li>NewMetaMethod.java</li><li>NewStaticMetaMethod.java</li><li>OwnedMetaClass.java</li><li>ReflectionMetaMethod.java</li><li>ReflectorLoader.java</li><li>TemporaryMethodKey.java</li><li>ThreadManagedMetaBeanProperty.java</li><li>TransformMetaMethod.java</li><li>MetaClassHelper.java</li><li>MethodClosure.java</li><li>MethodKey.java</li><li>MethodRankHelper.java</li><li>NullObject.java</li><li>ReflectionMethodInvoker.java</li><li>Reflector.java</li><li>RegexSupport.java</li><li>ReverseListIterator.java</li><li>ScriptBytecodeAdapter.java</li><li>ScriptReference.java</li><li>ScriptTestAdapter.java</li><li>StackTraceUtils.java</li><li>StringBufferWriter.java</li><li>TimeCategory.java</li></ul><h5>Package: groovy.util</h5><ul class="alternate"><li>AbstractFactory.java</li><li>AllTestSuite.java</li><li>AntBuilder.java</li><li>BuilderSupport.java</li><li>CharsetToolkit.java</li><li>CliBuilder.groovy</li><li>ClosureComparator.java</li><li>ConfigObject.groovy</li><li>ConfigSlurper.groovy</li><li>Eval.java</li><li>Expando.java</li><li>Factory.java</li><li>FactoryBuilderSupport.java</li><li>FileNameByRegexFinder.groovy</li><li>FileNameFinder.groovy</li><li>GroovyCollections.java</li><li>GroovyLog.java</li><li>GroovyScriptEngine.java</li><li>GroovyShellTestCase.groovy</li><li>GroovyTestCase.java</li><li>GroovyTestSuite.java</li><li>IFileNameFinder.java</li><li>IndentPrinter.java</li><li>MapEntry.java</li><li>Node.java</li><li>NodeBuilder.java</li><li>NodeList.java</li><li>NodePrinter.java</li><li>ObjectGraphBuilder.java</li><li>ObservableList.java</li><li>ObservableMap.java</li><li>OrderBy.java</li><li>PermutationGenerator.java</li><li>Proxy.java</li><li>ProxyGenerator.java</li><li>ResourceConnector.java</li><li>ResourceException.java</li><li>ScriptException.java</li></ul><h5>Package: org.codehaus.groovy.vmplugin.v4</h5><ul class="alternate"><li>Java4.java</li></ul><h5>Package: org.codehaus.groovy.vmplugin.v5</h5><ul class="alternate"><li>Java5.java</li><li>JUnit4Utils.java</li><li>PluginDefaultGroovyMethods.java</li><li>TestNgUtils.java</li><li>VMPlugin.java</li><li>VMPluginFactory.java</li></ul><hr /><h3>Module: test</h3><h5>Package: groovy.mock</h5><h5>Package: groovy.mock.interceptor</h5><ul class="alternate"><li>Demand.groovy</li><li>LooseExpectation.groovy</li><li>MockFor.groovy</li><li>MockInterceptor.groovy</li><li>MockProxyMetaClass.java</li><li>StrictExpectation.groovy</li><li>StubFor.groovy</li></ul><hr /><h3>Module: jmx</h3><h5>Package: groovy.jmx</h5><h5>Package: groovy.jmx.builder</h5><ul class="alternate"><li>JmxAttributeInfoManager.groovy</li><li>JmxBeanExportFactory.groovy</li><li>JmxBeanFactory.groovy</li><li>JmxBeanInfoManager.groovy</li><li>JmxBeansFactory.groovy</li><li>JmxBuilder.groovy</li><li>JmxBuilderException.java</li><li>JmxBuilderModelMBean.java</li><li>JmxBuilderTools.groovy</li><li>JmxClientConnectorFactory.groovy</li><li>JmxEmitterFactory.groovy</li><li>JmxEventEmitter.java</li><li>JmxEventEmitterMBean.java</li><li>JmxEventListener.java</li><li>JmxListenerFactory.groovy</li><li>JmxMetaMapBuilder.groovy</li><li>JmxOperationInfoManager.groovy</li><li>JmxServerConnectorFactory.groovy</li><li>JmxTimerFactory.groovy</li></ul><h5>Package: groovy.util</h5><ul class="alternate"><li>GroovyMBean.java</li></ul><hr /><h3>Module: swing</h3><h5>Package: groovy.model</h5><ul class="alternate"><li>ClosureModel.java</li><li>DefaultTableColumn.java</li><li>DefaultTableModel.java</li><li>FormModel.java</li><li>NestedValueModel.java</li><li>PropertyModel.java</li><li>ValueHolder.java</li><li>ValueModel.java</li></ul><h5>Package: groovy.swing</h5><h5>Package: groovy.swing.binding</h5><ul class="alternate"><li>AbstractButtonProperties.java</li><li>AbstractSyntheticBinding.java</li><li>AbstractSyntheticMetaMethods.groovy</li><li>JComboBoxMetaMethods.groovy</li><li>JComboBoxProperties.java</li><li>JComponentProperties.java</li><li>JScrollBarProperties.java</li><li>JSliderProperties.java</li><li>JSpinnerProperties.java</li><li>JTableMetaMethods.groovy</li><li>JTableProperties.java</li><li>JTextComponentProperties.java</li></ul><h5>Package: groovy.swing.factory</h5><ul class="alternate"><li>ActionFactory.groovy</li><li>BeanFactory.groovy</li><li>BevelBorderFactory.groovy</li><li>BindFactory.groovy</li><li>BindGroupFactory.groovy</li><li>BindProxyFactory.groovy</li><li>BoxFactory.groovy</li><li>BoxLayoutFactory.groovy</li><li>ButtonGroupFactory.groovy</li><li>CollectionFactory.groovy</li><li>ComboBoxFactory.groovy</li><li>ComponentFactory.groovy</li><li>CompoundBorderFactory.groovy</li><li>DialogFactory.groovy</li><li>EmptyBorderFactory.groovy</li><li>EtchedBorderFactory.groovy</li><li>FormattedTextFactory.groovy</li><li>FrameFactory.groovy</li><li>GridBagFactory.groovy</li><li>ImageIconFactory.groovy</li><li>InternalFrameFactory.groovy</li><li>LayoutFactory.groovy</li><li>LineBorderFactory.groovy</li><li>ListFactory.groovy</li><li>MapFactory.groovy</li><li>MatteBorderFactory.groovy</li><li>RendererFactory.groovy</li><li>RichActionWidgetFactory.groovy</li><li>RootPaneContainerFactory.groovy</li><li>ScrollPaneFactory.groovy</li><li>SeparatorFactory.groovy</li><li>SplitPaneFactory.groovy</li><li>SwingBorderFactory.groovy</li><li>TabbedPaneFactory.groovy</li><li>TableFactory.groovy</li><li>TableLayoutFactory.groovy</li><li>TableModelFactory.groovy</li><li>TextArgWidgetFactory.groovy</li><li>TitledBorderFactory.groovy</li><li>WidgetFactory.groovy</li><li>WindowFactory.groovy</li></ul><h5>Package: groovy.swing.impl</h5><ul class="alternate"><li>ClosureRenderer.java</li><li>ComponentFacade.java</li><li>ContainerFacade.java</li><li>DefaultAction.java</li><li>Startable.java</li><li>TableLayout.java</li><li>TableLayoutCell.java</li><li>TableLayoutRow.java</li><li>LookAndFeelHelper.groovy</li><li>SwingBuilder.groovy</li></ul><h5>Package: org.codehaus.groovy.runtime.metaclass</h5><ul class="alternate"><li>SwingGroovyMethods.java</li></ul><hr /><h3>Module: xml</h3><h5>Package: groovy.util.slurpersupport</h5><ul class="alternate"><li>Attribute.java</li><li>Attributes.java</li><li>FilteredAttributes.java</li><li>FilteredNodeChildren.java</li><li>GPathResult.java</li><li>NoChildren.java</li><li>Node.java</li><li>NodeChild.java</li><li>NodeChildren.java</li><li>NodeIterator.java</li><li>ReplacementNode.java</li><li>XmlNodePrinter.java</li><li>XmlParser.java</li><li>XmlSlurper.java</li></ul><h5>Package: groovy.xml</h5><h5>Package: groovy.xml.dom</h5><ul class="alternate"><li>DOMCategory.java</li><li>DOMUtil.java</li><li>DOMBuilder.java</li><li>Entity.groovy</li><li>FactorySupport.java</li><li>MarkupBuilder.java</li><li>MarkupBuilderHelper.java</li><li>Namespace.java</li><li>NamespaceBuilder.java</li><li>NamespaceBuilderSupport.java</li><li>QName.java</li><li>SAXBuilder.java</li><li>StaxBuilder.groovy</li><li>StreamingDOMBuilder.groovy</li><li>StreamingMarkupBuilder.groovy</li></ul><h5>Package: groovy.xml.streamingmarkupsupport</h5><ul class="alternate"><li>AbstractStreamingBuilder.groovy</li><li>BaseMarkupBuilder.java</li><li>Builder.java</li><li>StreamingMarkupWriter.java</li><li>StreamingSAXBuilder.groovy</li><li>XmlUtil.java</li></ul><h5>Package: org.codehaus.groovy.tools.xml</h5><ul class="alternate"><li>DomToGroovy.java</li></ul><hr /><h3>Module: sql</h3><h5>Package: groovy.sql</h5><ul class="alternate"><li>CallResultSet.java</li><li>DataSet.java</li><li>ExpandedVariable.java</li><li>GroovyResultSet.java</li><li>GroovyResultSetExtension.java</li><li>GroovyResultSetProxy.java</li><li>GroovyRowResult.java</li><li>InOutParameter.java</li><li>InParameter.java</li><li>OutParameter.java</li><li>ResultSetMetaDataWrapper.java</li><li>ResultSetOutParameter.java</li><li>Sql.java</li><li>SqlOrderByVisitor.java</li><li>SqlWhereVisitor.java</li></ul><h5>Package: org.codehaus.groovy.runtime.metaclass</h5><ul class="alternate"><li>SqlGroovyMethods.java</li></ul><hr /><h3>Module: web</h3><h5>Package: groovy.servlet</h5><ul class="alternate"><li>AbstractHttpServlet.java</li><li>GroovyServlet.java</li><li>ServletBinding.java</li><li>ServletCategory.java</li><li>TemplateServlet.java</li></ul><hr /><h3>Module: template-engine</h3><h5>Package: groovy.text</h5><ul class="alternate"><li>GStringTemplateEngine.java</li><li>SimpleTemplateEngine.java</li><li>Template.java</li><li>TemplateEngine.java</li><li>XmlTemplateEngine.java</li></ul><hr /><h3>Module: bean-scripting-framework</h3><h5>Package: org.codehaus.groovy.bsf</h5><ul class="alternate"><li>CachingGroovyEngine.java</li><li>GroovyEngine.java</li></ul><hr /><h3>Module: javax.script (jsr-223)</h3><h5>Package: org.codehaus.groovy.jsr223</h5><ul class="alternate"><li>GroovyCompiledScript.java</li><li>GroovyScriptEngineFactory.java</li><li>GroovyScriptEngineImpl.java</li></ul><hr /><h3>Module: groovydoc</h3><h5>Package: org.codehaus.groovy.tools.groovydoc</h5><ul class="alternate"><li>ClasspathResourceManager.java</li><li>ExternalGroovyClassDoc.java</li><li>FileOutputTool.java</li><li>FileSystemResourceManager.java</li><li>GroovyDocTemplateEngine.java</li><li>GroovyDocTool.java</li><li>GroovyDocWriter.java</li><li>GroovyRootDocBuilder.java</li></ul><h5>Package: org.codehaus.groovy.tools.groovydoc.gstringTemplates.topLevel</h5><ul class="alternate"><li>LinkArgument.java</li><li>MockOutputTool.java</li><li>OutputTool.java</li><li>ResourceManager.java</li><li>SimpleGroovyAnnotationRef.java</li><li>SimpleGroovyClassDoc.java</li><li>SimpleGroovyClassDocAssembler.java</li><li>SimpleGroovyConstructorDoc.java</li><li>SimpleGroovyDoc.java</li><li>SimpleGroovyExecutableMemberDoc.java</li><li>SimpleGroovyFieldDoc.java</li><li>SimpleGroovyMemberDoc.java</li><li>SimpleGroovyMethodDoc.java</li><li>SimpleGroovyPackageDoc.java</li><li>SimpleGroovyParameter.java</li><li>SimpleGroovyProgramElementDoc.java</li><li>SimpleGroovyRootDoc.java</li><li>SimpleGroovyTag.java</li><li>SimpleGroovyType.java</li><li>GroovyStarter.java</li></ul><h5>Package: org.codehaus.groovy.groovydoc</h5><ul class="alternate"><li>GroovyAnnotationRef.java</li><li>GroovyClassDoc.java</li><li>GroovyConstructorDoc.java</li><li>GroovyDoc.java</li><li>GroovyDocErrorReporter.java</li><li>GroovyExecutableMemberDoc.java</li><li>GroovyFieldDoc.java</li><li>GroovyMemberDoc.java</li><li>GroovyMethodDoc.java</li><li>GroovyPackageDoc.java</li><li>GroovyParameter.java</li><li>GroovyProgramElementDoc.java</li><li>GroovyRootDoc.java</li><li>GroovyTag.java</li><li>GroovyType.java</li><li>GroovyException.java</li><li>GroovyExceptionInterface.java</li></ul><hr /><h3>Module: shell</h3><h5>Package: org.codehaus.groovy.tools.shell</h5><ul class="alternate"><li>BufferManager.groovy</li><li>Command.groovy</li><li>CommandAlias.groovy</li><li>CommandRegistry.groovy</li><li>CommandSupport.groovy</li><li>ComplexCommandSupport.groovy</li><li>ExitNotification.groovy</li><li>Groovysh.groovy</li><li>InteractiveShellRunner.groovy</li><li>Interpreter.groovy</li><li>IO.java</li><li>Main.groovy</li><li>Parser.groovy</li><li>Shell.groovy</li><li>ShellRunner.groovy</li></ul><h5>Package: org.codehaus.groovy.tools.shell.commands</h5><ul class="alternate"><li>AliasCommand.groovy</li><li>ClearCommand.groovy</li><li>DisplayCommand.groovy</li><li>EditCommand.groovy</li><li>ExitCommand.groovy</li><li>HelpCommand.groovy</li><li>HistoryCommand.groovy</li><li>ImportCommand.groovy</li><li>InspectCommand.groovy</li><li>LoadCommand.groovy</li><li>PurgeCommand.groovy</li><li>RecordCommand.groovy</li><li>RegisterCommand.groovy</li><li>SaveCommand.groovy</li><li>SetCommand.groovy</li><li>ShadowCommand.groovy</li><li>ShowCommand.groovy</li></ul><h5>Package: org.codehaus.groovy.tools.shell.util</h5><ul class="alternate"><li>ClassNameCompletor.groovy</li><li>HelpFormatter.groovy</li><li>Logger.java</li><li>MessageSource.java</li><li>NoExitSecurityManager.java</li><li>Preferences.java</li><li>SimpleCompletor.java</li><li>XmlCommandRegistrar.groovy</li></ul><hr /><h3>Module: console</h3><h5>Package: groovy.inspect</h5><ul class="alternate"><li>Inspector.java</li></ul><h5>Package: groovy.inspect.swingui</h5><ul class="alternate"><li>AstBrowser.groovy</li><li>AstBrowserProperties.groovy</li><li>ObjectBrowser.groovy</li><li>ScriptToTreeNodeAdapter.groovy</li><li>TableMap.java</li><li>TableSorter.java</li></ul><h5>Package: groovy.ui</h5><ul class="alternate"><li>Console.groovy</li><li>ConsoleActions.groovy</li><li>ConsoleApplet.groovy</li><li>ConsoleSupport.java</li><li>ConsoleTextEditor.java</li><li>ConsoleView.groovy</li><li>GroovyMain.java</li><li>GroovySocketServer.java</li><li>HistoryRecord.groovy</li></ul><h5>Package: groovy.ui.icons</h5><ul class="alternate"><li>InteractiveShell.java</li><li>OutputTransforms.groovy</li><li>SystemOutputInterceptor.java</li></ul><h5>Package: groovy.ui.text</h5><ul class="alternate"><li>AutoIndentAction.groovy</li><li>FindReplaceUtility.java</li><li>GroovyFilter.java</li><li>StructuredSyntaxDocumentFilter.java</li><li>StructuredSyntaxHandler.java</li><li>StructuredSyntaxResources.java</li><li>TextEditor.java</li><li>TextUndoManager.java</li></ul><h5>Package: groovy.ui.view</h5><ul class="alternate"><li>BasicContentPane.groovy</li><li>BasicMenuBar.groovy</li><li>BasicStatusBar.groovy</li><li>BasicToolBar.groovy</li><li>Defaults.groovy</li><li>GTKDefaults.groovy</li><li>MacOSXDefaults.groovy</li><li>MacOSXMenuBar.groovy</li><li>WindowsDefaults.groovy</li></ul><hr /><h3>Module: java2groovy</h3><h5>Package: org.codehaus.groovy.antlr.java</h5><ul class="alternate"><li>Groovifier.java</li><li>Java2GroovyConverter.java</li><li>Java2GroovyMain.java</li><li>JavaLexer.java</li><li>JavaRecognizer.java</li><li>JavaTokenTypes.java</li><li>PreJava2GroovyConverter.java</li><li>LexerFrame.java</li><li>LineColumn.java</li><li>Main.java</li></ul>
Please type the word appearing in the picture.
Attachments
Labels
Location
Watch this page
< Edit
Preview >
Loading…
Save
Cancel
Next hint
search
attachments
weblink
advanced