<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Pustefix Framework</title>
    <description>The Pustefix Framework is an open-source Java web application framework for developing request-based MVC-style web applications using Spring, XML and XSLT.
</description>
    <link>http://www.pustefix-framework.org/</link>
    <atom:link href="http://www.pustefix-framework.org/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Wed, 09 Nov 2022 10:10:23 +0000</pubDate>
    <lastBuildDate>Wed, 09 Nov 2022 10:10:23 +0000</lastBuildDate>
    <generator>Jekyll v3.9.2</generator>
    
      <item>
        <title>Pustefix 0.22.0 released</title>
        <description>&lt;p&gt;Pustefix 0.22.0 is available now. The main focus of this release was adding support for the new Spring framework version 5.&lt;/p&gt;

&lt;p&gt;For details have a look at the &lt;a href=&quot;/documentation/0.22.x/reference.html#news.0_22_0&quot;&gt;Pustefix reference documentation&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Mon, 09 Oct 2017 10:00:00 +0000</pubDate>
        <link>http://www.pustefix-framework.org/pustefix/2017/10/09/pustefix-0_22_0-released.html</link>
        <guid isPermaLink="true">http://www.pustefix-framework.org/pustefix/2017/10/09/pustefix-0_22_0-released.html</guid>
        
        
        <category>pustefix</category>
        
      </item>
    
      <item>
        <title>Pustefix 0.21.0 released</title>
        <description>&lt;p&gt;Pustefix 0.21.0 is available now. The main focus of this release was switching the framework’s internal logging from Log4j 1 to SLF4J and adding extended support for the most popular logging backends.&lt;/p&gt;

&lt;p&gt;Application developers now can use the logging framework of their choice. It’s recommended to use the SLF4J API together with Logback
or Log4j 2 as logging backend. But Log4j 1 is still supported for backwards compatibility.
For details have a look at the &lt;a href=&quot;/documentation/0.21.x/reference.html#news.0_21_0&quot;&gt;Pustefix reference documentation&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Mon, 07 Aug 2017 10:00:00 +0000</pubDate>
        <link>http://www.pustefix-framework.org/pustefix/2017/08/07/pustefix-0_21_0-released.html</link>
        <guid isPermaLink="true">http://www.pustefix-framework.org/pustefix/2017/08/07/pustefix-0_21_0-released.html</guid>
        
        
        <category>pustefix</category>
        
      </item>
    
      <item>
        <title>New Pustefix homepage</title>
        <description>&lt;p&gt;The new &lt;a href=&quot;http://www.pustefix-framework.org&quot;&gt;Pustefix homepage&lt;/a&gt; went online today. It’s completely hosted on GitHub now, including issue tracking and blog.&lt;/p&gt;

&lt;p&gt;The homepage itself is created using GitHub Pages, the old Trac issue tracker was replaced by the GitHub issue tracker, the Pustefix blog was migrated from Wordpress to GitHub Pages.&lt;/p&gt;
</description>
        <pubDate>Tue, 03 Jan 2017 10:00:00 +0000</pubDate>
        <link>http://www.pustefix-framework.org/pustefix/2017/01/03/new-pustefix-homepage.html</link>
        <guid isPermaLink="true">http://www.pustefix-framework.org/pustefix/2017/01/03/new-pustefix-homepage.html</guid>
        
        
        <category>pustefix</category>
        
      </item>
    
      <item>
        <title>Moved to GitHub</title>
        <description>&lt;p&gt;Pustefix moved from svn to git. The project code now is hosted on &lt;a href=&quot;https://github.com/pustefix-projects/pustefix-framework&quot;&gt;https://github.com/pustefix-projects/pustefix-framework&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The old Pustefix project hosted on sourceforge.net (&lt;a href=&quot;https://sourceforge.net/projects/pustefix/&quot;&gt;https://sourceforge.net/projects/pustefix/&lt;/a&gt;) has been deactivated and
the code (&lt;a href=&quot;https://svn.code.sf.net/p/pustefix/code&quot;&gt;https://svn.code.sf.net/p/pustefix/code&lt;/a&gt;) will be only available indefinitely for back reference.&lt;/p&gt;
</description>
        <pubDate>Thu, 02 Jun 2016 10:00:00 +0000</pubDate>
        <link>http://www.pustefix-framework.org/pustefix/2016/06/02/move-to-git.html</link>
        <guid isPermaLink="true">http://www.pustefix-framework.org/pustefix/2016/06/02/move-to-git.html</guid>
        
        
        <category>pustefix</category>
        
      </item>
    
      <item>
        <title>Tenant-aware bean proxying</title>
        <description>&lt;p&gt;In the last blog entry I showed how you can make Spring automatically create and manage an own bean instance per tenant using the tenant scope. Another use case within multitenant applications is using different beans (with different configuration or implementation, but common base class or interface) for different tenants.&lt;/p&gt;

&lt;p&gt;Whereas the idea of the tenant scope is to inject a proxy object which delegates to an own bean instance of the same class (automatically managed for each tenant), now we inject a proxy object which delegates to other Spring managed beans (only needing a common interface or base class to be able to create a JDK proxy or CGLIB based proxy class).&lt;/p&gt;

&lt;p&gt;With Spring’s ProxyFactoryBean you can easily create AOP proxies. The AOP invocation target can be set using a TargetSource. Pustefix provides a custom TargetSource implementation, which returns the target bean for the currently set tenant.&lt;/p&gt;

&lt;p&gt;Let’s continue the Counter example from the last blog entry. We inject the counter bean into the web layer to increment the counter on each submit:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;  &lt;span class=&quot;nd&quot;&gt;@Autowired&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Counter&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;handleSubmittedData&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Context&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;IWrapper&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wrapper&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Now we want different Counter instances for different countries, but this time we also want different beans, having different implementation classes sharing a common Counter interface. Here you can see how the proxy bean is configured:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-xml&quot; data-lang=&quot;xml&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;counter&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;org.springframework.aop.framework.ProxyFactoryBean&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;targetSource&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;org.pustefixframework.container.spring.beans.TenantTargetSource&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;targets&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;nt&quot;&gt;&amp;lt;map&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;entry&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;DE&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
              &lt;span class=&quot;nt&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mypackage.CounterImpl&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/entry&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;entry&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;US&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
              &lt;span class=&quot;nt&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mypackage.OtherCounterImpl&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/entry&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;nt&quot;&gt;&amp;lt;/map&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Pustefix also provide a custom ProxyFactoryBean implementation internally relying on the TenantTargetSource implementation, which makes the configuration a little bit shorter:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-xml&quot; data-lang=&quot;xml&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;counter&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;org.pustefixframework.container.spring.beans.TenantProxyFactoryBean&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;targets&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;map&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;entry&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;DE&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;nt&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mypackage.CounterImpl&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/entry&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;entry&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;key=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;US&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;nt&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mypackage.OtherCounterImpl&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/entry&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/map&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This feature will be available with Pustefix 0.18.48.&lt;/p&gt;
</description>
        <pubDate>Fri, 21 Jun 2013 10:57:00 +0000</pubDate>
        <link>http://www.pustefix-framework.org/pustefix/2013/06/21/tenant-bean-proxy.html</link>
        <guid isPermaLink="true">http://www.pustefix-framework.org/pustefix/2013/06/21/tenant-bean-proxy.html</guid>
        
        
        <category>pustefix</category>
        
      </item>
    
      <item>
        <title>Multitenant Spring beans in Pustefix</title>
        <description>&lt;p&gt;Pustefix’s multitenancy support lets you create applications serving multiple tenants (e.g. countries) and languages within a single application instance. So far multitenancy in Pustefix focused on the view layer, helping you create internationalized pages composed of tenant/language-dependent content and resources.&lt;/p&gt;

&lt;p&gt;In the next step we want to extend Pustefix’s application logic layer with multitenant capabilities. Looking at a usual Pustefix application’s Spring configuration we normally see a lot of singleton scoped beans implemented with a concrete application instance in mind. Making such an application multitenant means that such a bean will be shared between the tenants. Imagine a simple counter bean backing a website request counter. It will count the total number of requests, independent of the tenant. But what, if you want to have an own counter for each supported tenant?&lt;/p&gt;

&lt;p&gt;You could create multiple counter beans, manage them in a map keyed by the tenant name and programmatically select the according counter within the request processing logic. But wouldn’t it be much nicer, if you don’t have to care about the tenants in your code and let Spring automatically manage this for you?&lt;/p&gt;

&lt;p&gt;The solution is the implementation of an own tenant-aware Spring scope. Giving a Spring bean tenant scope, will mean that an own instance of this bean will be created and managed for each tenant. Injecting the bean as dependency will work similar to session-scoped beans: Spring will inject a proxy bean, which will delegate method calls to the appropriate instance associated with the current tenant.&lt;/p&gt;

&lt;p&gt;A bean can be made tenant-scoped by setting the according scope attribute within the Spring configuration:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-xml&quot; data-lang=&quot;xml&quot;&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;counter&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mypackage.Counter&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;scope=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tenant&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;aop:scoped-proxy/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Using the bean, e.g. in an IHandler, is straightforward:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;  &lt;span class=&quot;nd&quot;&gt;@Autowired&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Counter&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;handleSubmittedData&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Context&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;IWrapper&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wrapper&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This feature will be available with Pustefix 0.18.44.&lt;/p&gt;

&lt;p&gt;The next step will be the transparent injection of different tenant-depending bean instances (e.g. differently configured instances of the same class or different implementations of a common interface) using Spring’s ProxyFactoryBean together with a tenant-aware TargetSource implementation.&lt;/p&gt;

</description>
        <pubDate>Tue, 09 Apr 2013 14:40:00 +0000</pubDate>
        <link>http://www.pustefix-framework.org/pustefix/2013/04/09/multitenant-spring-beans.html</link>
        <guid isPermaLink="true">http://www.pustefix-framework.org/pustefix/2013/04/09/multitenant-spring-beans.html</guid>
        
        
        <category>pustefix</category>
        
      </item>
    
      <item>
        <title>Finding things</title>
        <description>&lt;p&gt;This blog has been sleeping for almost a year. So it’s time to breathe new life into it. Let’s start where the last blog entry ended.&lt;/p&gt;

&lt;p&gt;Finding things is still an issue. The more complex the application, the greater the need for a simple way to dive into the application, keeping track of where things are located and thus helping you to understand how they interact. Therefor Pustefix 0.18.38 implements a full text search as part of the in-webapp development tooling.&lt;/p&gt;

&lt;p&gt;Some developers might argue that they’re having their IDE and nerdy command line tools, so there’s no need for another search tool. This is almost correct, if you stay within the Java world. But developing a complex view composed of thousands of XML and XSL fragments, located in different modules (available in different forms, like zipped archive or RCS checkout), will require that your IDE is accordingly configured to search all these different locations.&lt;/p&gt;

&lt;p&gt;The Pustefix in-webapp full text search is a simple solution to search you webapp without having to use and configure an IDE, e.g. if you just want to test an application without having to set up an IDE project, or if you’re an frontend/view developer who wants to stay with the favored text editor. Besides it’s useful for debugging, e.g. if resource changes on the file system aren’t picked up by the webapp, you can verify from where resources are loaded, etc.&lt;/p&gt;

&lt;p&gt;The full text search supports searching the webapp, modules and the classpath based on file name patterns and matching text lines using regular expressions. The search can be found on the pfxinternals page (e.g. local URL: http://localhost:8080/pfxinternals/search).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/pfxinternals-search.png&quot; alt=&quot;Pustefix internals - Full text search&quot; /&gt;&lt;/p&gt;

</description>
        <pubDate>Tue, 19 Feb 2013 14:24:00 +0000</pubDate>
        <link>http://www.pustefix-framework.org/pustefix/2013/02/19/finding-things.html</link>
        <guid isPermaLink="true">http://www.pustefix-framework.org/pustefix/2013/02/19/finding-things.html</guid>
        
        
        <category>pustefix</category>
        
      </item>
    
      <item>
        <title>Where the deuce is this template?</title>
        <description>&lt;p&gt;Having highly modularized applications together with Pustefix’s multi-level XSL transformations sometimes can be a little bit annoying, e.g. if you want to reproduce a view bug and you don’t have a clue how the HTML output is produced and where the involved XSL templates come from.&lt;/p&gt;

&lt;p&gt;Therefor Pustefix (since 0.18.10) can visualize the so-called target dependency model, showing you how the XSL stylesheets on each transformation level are composed, which XSL transforms which XML, what XML parts and images are included, etc.&lt;/p&gt;

&lt;p&gt;Besides showing the dependency model Pustefix also lists the XSL templates available on the selected transformation level. All XML/XSL files can be directly viewed/downloaded (even if coming from a module archive).&lt;/p&gt;

&lt;p&gt;This view is generated as part of the pfxinternals page (e.g. locally accessible in development mode under http://localhost:8080/pfxinternals/targets).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/pfxinternals-targets1.png&quot; alt=&quot;Pustefix internals - Targets 1&quot; /&gt;
&lt;img src=&quot;/assets/pfxinternals-targets2.png&quot; alt=&quot;Pustefix interanls - Targets 2&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 29 Feb 2012 11:54:00 +0000</pubDate>
        <link>http://www.pustefix-framework.org/pustefix/2012/02/29/where-is-the-template.html</link>
        <guid isPermaLink="true">http://www.pustefix-framework.org/pustefix/2012/02/29/where-is-the-template.html</guid>
        
        
        <category>pustefix</category>
        
      </item>
    
      <item>
        <title>Pustefix discontinues OSGi work</title>
        <description>&lt;p&gt;More than 2 years ago we started to add OSGi-support to Pustefix. In September 2009 we officially released Pustefix 1.0.0, see an excerpt of the annonuncement:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Pustefix 1.0.0 has been released. This groundbreaking new release offers full OSGi support, i.e. Pustefix not just can be run inside an OSGi runtime, but Pustefix itself is built on the principles of OSGi, empowering you to modularize all aspects of a webapplication (business logic, view components, etc.) using an OSGi service based extension point mechanism.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Today we officially postpone OSGi support. Actually development stood still for more than a year because of the lack of adoption by our user community. To be honest we have to state that our OSGi experiment has failed and there are evident reasons.&lt;/p&gt;

&lt;p&gt;I still think OSGi is a great technology and I’m sure there are a lot of use cases where OSGi already works very well, but the web application development scenarios targeted by Pustefix do not fit (yet).&lt;/p&gt;

&lt;p&gt;In a way OSGi offers much more than we need, and at the same time not enough to make it worth paying the price for the effort of introducing a new programming model, a more complex development process and managing the various pitfalls when developing within an environment which itself is not yet ready for OSGi (infrastructure, tools, third party libraries, etc.).&lt;/p&gt;

&lt;p&gt;But postponed is not abandoned and we’re looking forward to the modularization support coming with JDK 8, Project Jigsaw and JSR 294.&lt;/p&gt;

&lt;p&gt;Starting from today the Pustefix main development will take place in the SVN trunk again. The OSGi implementation was moved to a branch and will be further available for backreference.&lt;/p&gt;
</description>
        <pubDate>Fri, 16 Sep 2011 09:50:00 +0000</pubDate>
        <link>http://www.pustefix-framework.org/pustefix/2011/09/16/discontinue-osgi.html</link>
        <guid isPermaLink="true">http://www.pustefix-framework.org/pustefix/2011/09/16/discontinue-osgi.html</guid>
        
        
        <category>pustefix</category>
        
      </item>
    
      <item>
        <title>Pustefix ready for Java SE 7 and dropping support for Java 1.5</title>
        <description>&lt;p&gt;Starting with version 0.18 Pustefix will no longer officially support Java SE 1.5 or older (nearly 5 years public availability of Java SE 1.6 should have been enough time for upgrading existing applications).&lt;/p&gt;

&lt;p&gt;One reason for dropping support is the proprietary annotation processing in 1.5 (Sun’s deprecated apt tool) and the new standardized way in 1.6 (JSR269 Pluggable Annotation Processing API and JSR199 Java Compiler API), which will replace the apt tool in upcoming Pustefix releases.&lt;/p&gt;

&lt;p&gt;Switching to the new annotation processing standard Pustefix now is also ready for upcoming Java releases. In general Java SE 7 can be already used with older Pustefix versions. I have only encountered a problem with Pustefix’s JAXWS/AJAX services, which will be fixed in the next 0.18 release (whereas it’s recommended to use the lightweight JSON services instead anyway).&lt;/p&gt;

&lt;p&gt;If you still want to use JAXWS/AJAX services with older Pustefix versions and Java 1.7, you will have to upgrade to a newer JAXWS version, because the used JAXWS version stumbles accross the new getSuppressed() property in java.lang.Throwable when generating Exception beans. Additionally you will have to adapt the tools.jar Maven dependency because the java.vendor property used to activate the dependency profile changed from “Sun Microsystems Inc.” to “Oracle Corporation”.&lt;/p&gt;
</description>
        <pubDate>Thu, 15 Sep 2011 15:59:00 +0000</pubDate>
        <link>http://www.pustefix-framework.org/pustefix/2011/09/15/drop-java-5.html</link>
        <guid isPermaLink="true">http://www.pustefix-framework.org/pustefix/2011/09/15/drop-java-5.html</guid>
        
        
        <category>pustefix</category>
        
      </item>
    
  </channel>
</rss>
