File Release Notes and Changelog
Release Name: 0.6
Notes:
To use Coinjema in your project:
1. Include the coinjema-core.jar file in your project's classpath.
2. Download AspectJ 1.5 (or higher) and copy the aspectjrt.jar to your project's classpath.
Copy the aspectjtools.jar to your Ant's home /lib directory.
3. If you don't use Ant to compile your project, you can compile using AspectJ's compiler, but
you are on your own to figure that out.
4. Also download Groovy and include the embeddable jar in your project's classpath.
5. when compiling your project with AspectJ's compiler, include the coinjema-core.jar in the
"aspect path".
6. See the tiny sample app (in directory /sampleProject) for an example of an Ant build file
that does this.
7. Annotate your classes that you want to receive automatic dependency-injection with the
@CoinjemaObject annotation.
8. Annotate these classes' dependency injection methods with @CoinjemaDependency.
9. Optional: add constructor(s) to your class that take a CoinjemaContext object as the last
parameter. No implementation is required for Coinjema's purposes.
10. See the sample app for an example, as well as all the test cases (available in coinjema's CVS repository).
==========================================================================
Coinjema version 0.6 is the first Beta release of Coinjema.
===========================================================================
Coinjema version 0.4 is a fully working release, though still not production-ready.
===========================================================================
Coinjema version 0.3 is the first alpha release for Coinjema. It is not yet intended to be
considered production-ready, but there shouldn't be drastic changes in how Coinjema works going
forward. This release may be of some interest to users who wish to experiment or wish to explore
alternative Dependency Injection techniques. Also, any feedback from those who play around
with Coinjema is highly welcome.
Changes:
<html><head>
<link rel="StyleSheet" type="text/css" href="coinjema.css"/>
<link rel="StyleSheet" type="text/css" href="menu.css"/>
<script language="Javascript" src="functions.js" type="text/javascript"></script>
<title>Coinjema</title></head>
<body>
<div class="menubar_space_holder" style="width:100%;z-index:0;visibility:hidden">This space left intentionally blank</div>
<div id="menubar" class="menubar" style="position:fixed; width:100%; left:0px;top:0px;z-index:2">
<div class="page-header"><div class="sourceforge_logo"><A href="https://sourceforge.net"> <IMG src="https://sourceforge.net/sflogo.php?group_id=140644&type=5" width="210" height="62" border="0" alt="SourceForge.net Logo" /></A></div>
<div class="sourceforge_logo"><A href="http://www.yourkit.com"> <IMG src="/images/yjp.gif" border="0" alt="YourKit Logo" /></A></div>
<span class="title">Coinjema Home</span>
</div>
<div id="Home_menu" onmouseover="javascript:enterMenu('Home')" onmouseout="javascript:exitMenu('Home')" class="menuHeader">
<a href="index.html">Home</a>
</div>
<div id="Project_menu" onmouseover="javascript:enterMenu('Project')" onmouseout="javascript:exitMenu('Project')" class="menuHeader">
Project
</div>
<div id="Project" class="menu" style="position:fixed; left:9em; top:8em; z-index:5; visibility: hidden;" onmouseover="javascript:enterMenu('Project')" onmouseout="javascript:exitMenu('Project')">
<a class="item" href="https://sourceforge.net/projects/coinjema">Project Home</a>
<a class="item" href="https://sourceforge.net/project/showfiles.php?group_id=140644">Download</a>
</div>
<div id="Documentation_menu" onmouseover="javascript:enterMenu('Documentation')" onmouseout="javascript:exitMenu('Documentation')" class="menuHeader">
Documentation
</div>
<div id="Documentation" class="menu" style="position:fixed; left:18em; top:8em; z-index:5; visibility: hidden;" onmouseover="javascript:enterMenu('Documentation')" onmouseout="javascript:exitMenu('Documentation')">
<a class="item" href="overview.html">Overview</a>
<a class="item" href="faq.html">FAQ</a>
<a class="item" href="whats_new.html">What's New</a>
<a class="item" href="https://sourceforge.net/docman/display_doc.php?docid=28814&group_id=140644">What You'll Need</a>
<a class="item" href="Coinjema_Contract.html">How To Use Coinjema</a>
<a class="item" href="Coinjema_Contexts.html">What is a Coinjema Context?</a>
<a class="item" href="TheAnnotations.html">The Annotations
<a class="item" href="redirectEvaluator.html">The Redirect Evaluator</a>
<a class="item" href="supported_file_formats.html">Supported Config File Formats</a>
<a class="item" href="objectsProvided.html">Script Variables</a>
<a class="item" href="coinjema_properties.html">Base Configuration Options</a>
<a class="item" href="developerNotes.html">Developer notes</a>
<a class="item" href="api/index.html">JavaDocs</a>
</div>
</div>
<div class="news">
<a name="version-0.6"></a><div class="title">New In Version 0.6</div>
<div class="item"><h4>Optional Annotations</h4>
<div class="text">The <code>@CoinjemaObject</code> annotation is now optional. <a href="TheAnnotations.html">Instead
of annotating your classes</a>, you can create a simple aspect in which you define all your
classes that Coinjema should handle like so:
<div class="oneLinerCodeBlock">declare parents : MyClass implements ContextOriented;</div>
The <code>@CoinjemaDependency</code> is now also optional. Instead, all
"set" methods that take a single parameter will be treated as potential injection sites into
your class, and coinjema will look for a resource named [ClassName].[MethodName] or [injectedClassname].
Coinjema will assume a default value exists if it doesn't find the resource.</div>
</div>
<div class="item"><h4>Inheritable Property Files</h4>
<div class="text">Property files will be able to <a href="supported_file_formats.html">inherit from property files</a> in
parent contexts, so rather than having to create property files with all the same
properties for each context, each context can just have the properties that they
want changed.</div>
</div>
<div class="item"><h4>Dependency Type Configurable</h4>
<div class="text">Now all dependencies can be <a href="supported_file_formats.html#file_endings">defined to be global, per Class, or per Object</a>. By appending
.perClass or .perObj to the dependency name (ie, filename for a typical setup), you can change
the way a dependency is treated.</div>
</div>
<div class="item"><h4>Logging</h4>
<div class="text">Coinjema now uses jdk logging for message outputs, with some very <a href="coinjema_properties.html">simple configuration options</a>
available from the coinjema.properties file.</div>
</div>
<div class="item"><h4>Auto Context Tracking</h4>
<div class="text">Coinjema has an annotation that lets you tell it specific methods/classes that should track context.
It used to automatically track contexts through all coinjema classes, but that turned out to be a performance killer.
Now, Coinjema adds some <a href="Coinjema_Contexts.html#tracking">auto tracking</a> back in by tracking context through classes that are instantiated with a
CoinjemaContext object because I have found that the only reason one creates objects with specific context objects
is because it is a gateway object to a new context, and everything underneath that object needs to be run
within the new context. This makes obsolete almost all uses of the <span class="code">@CoinjemaContextTrack</span>
annotation.</div>
</div>
<div class="item"><h4>Thread-Based Context Setting</h4>
<div class="text">The current context can be <a href="Coinjema_Contexts.html#tracking">programmatically set on a thread</a> now and works well so long as
programmers are careful to pop/push contexts correctly.</div>
</div>
<div class="item"><h4>Correct Ordering for Inheriting context objects</h4>
<div class="text">Coinjema intercepts constructor calls. Previously, this meant that if your class inherits from
another coinjema object, that class would be initialized before it's constructor function was even entered. This is now
fixed and Coinjema will wait for the end of the initially called constructor before mucking about with your object. This means
you can correctly apply default dependency values by setting them in your constructors.</div>
</div>
<a name="version-0.5"></a><div class="title">New In Version 0.5</div>
<div class="item"><h4>Redirect to other Context</h4>
<div class="text">The <em>.redirect</em> format now supports redirection to a specific
other context. For instance, instead of just pointing to
<code>TemplateService</code>, one can now point to
<code>contextA/contextB/TemplateService</code>, if desired.</div>
</div>
<div class="item"><h4>New Registry API</h4>
<div class="text">Groovy scripts can now access shared dependencies directly and the context root
via the new <a href="objectsProvided.html">Registry</a> reference.</div>
</div>
<div class="item"><h4>Coinjema Properties</h4>
<div class="text">Coinjema now offers some <a href="coinjema_properties.html">basic
configuration options</a> that effect how
Coinjema runs. A new <em>coinjema.properties</em> file can be placed in any context
directory. The properties will be inherited from parent contexts, so only those
properties to be overridden need to be in the file.</div>
</div>
<div class="item"><h4>Context Tracking Annotation</h4>
<div class="text">Previously, Coinjema tracked the current context through all your
Coinjema Objects. From experience using Coinjema, this appears highly wasteful, as
most of your objects do not need to be tracked, and furthermore, an application will
typically have a "gateway" that offers entrance into the guts of your code where you
know what context you want to switch to. The new annotation allows developers to
specify where Coinjema should watch for context changes.</div>
</div>
</body>
</html>