<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.smart-java.nl &#187; Stephan Oudmaijer</title>
	<atom:link href="http://blog.smart-java.nl/blog/index.php/author/soudmaijer/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.smart-java.nl/blog</link>
	<description>Ordina J-Technologies - Java Blog</description>
	<lastBuildDate>Wed, 05 May 2010 20:06:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>REST made easy with Java EE 6 and JAX-RS 1.1</title>
		<link>http://blog.smart-java.nl/blog/index.php/2010/02/19/rest-made-easy-with-java-ee-6-and-jax-rs-1-1/</link>
		<comments>http://blog.smart-java.nl/blog/index.php/2010/02/19/rest-made-easy-with-java-ee-6-and-jax-rs-1-1/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 06:34:25 +0000</pubDate>
		<dc:creator>Stephan Oudmaijer</dc:creator>
				<category><![CDATA[Java EE]]></category>

		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=893</guid>
		<description><![CDATA[In my previous post I wrote about Spring 3.0 and how Spring MVC enables REST services in Spring 3.0. Java EE 6 adds support for RESTfull services by adding JAX-RS to the specification. In this post I will show how JAX-RS 1.1 will make your life easy when writing RESTfull services for JEE 6. 
GlassFish [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://www.oudmaijer.com/blog/2010/01/16/spring-3-0-rest-services-with-spring-mvc/">my previous post</a> I wrote about Spring 3.0 and how Spring MVC enables REST services in Spring 3.0. Java EE 6 adds support for RESTfull services by adding JAX-RS to the specification. In this post I will show how JAX-RS 1.1 will make your life easy when writing RESTfull services for JEE 6. </p>
<p><a href="https://glassfish.dev.java.net/">GlassFish v3</a> is an open source application server and is the first compatible implementation of the Java EE 6 platform specification. To test the examples in this article I will assume that you use GlassFish (or any other JEE6 enabled application server) to run the examples.</p>
<p><b>Maven2 dependencies</b></p>
<p>Lets start with the Maven dependencies, you can add them all to the <code>pom.xml</code> of your war. I have also included Sun&#8217;s Maven2 repository for downloading the JEE6 dependencies like the javaee-api and Sun&#8217;s JAX-RS 1.1 implementation called Jersey.</p>
<pre><script type="syntaxhighlighter" class="brush: xml">
...
<repository>
    <id>maven2-repository.dev.java.net</id>
    <name>Java.net Repository for Maven</name>
    <url>http://download.java.net/maven/2/</url>
</repository>
...
<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.1.5</version>
    <scope>provided</scope>
</dependency>
...
</script></pre>
<p>Both dependencies are scoped as provided because GlassFish already ships with these libraries. In fact, my war file is not bigger than 22kb. JEE6 allowes developers to package full blown JEE application as a web archive file, there is no need for an enterprise archive anymore. This makes JEE6 applications really light weight. </p>
<p><b>JAX-RS RESTfull services in JEE6</b></p>
<p>JAX-RS supports configuration through annotations, just like the Spring 3.0 REST annotations. Annotations can be added to both classes and methods. Classes in JAX-RS can be POJO`s. One thing about JAX-RS is that it does not integrate well with other JEE specification, for example the JSR-330 annotations for dependency injection are not supported by JAX-RS (yet), but there is a workaround <img src='http://blog.smart-java.nl/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Because of the flexibility of JAX-RS it is possible to annotate EJB SessionBean or CDI components with JAX-RS annotations. So when a bean with JAX-RS annotation is packaged in a war file, the annotations are automatically picked up by the JAX-RS implementation (Jersey in this case). Since EJB3.1 SessionBeans and CDI components support all of the dependency injection features offered by JEE6, JAX-RS now does too! </p>
<p>Below is an example JAX-RS annotated class. The goal of this RESTfull service is to expose two methods of the ProductService through a RESTfull interface. The ProductService is injected using the @Inject annotation. </p>
<p>In JAX-RS the @Path annotation is used to map an URI to a REST service. In the example below I&#8217;ve defined the @Path annotation on the class, this will map all the URIs starting with /product to this class. I also defined the @ManagedBean (CDI) annotation on the class for the @Inject to work properly. </p>
<p>There are two methods within the service which are annotated with @Path, @GET and @Produces. The @Path is the same as with the class, but in this case it maps URI&#8217;s to a method. The URI of a method is relative to URI specified in the @Path annotation<br />
on the class. So the following URLs are mapped in this example:</p>
<li>/product/category/{categoryId} which returns all products in a category</li>
<li>/product/categories which returns all product categories</li>
<p>JAX-WS allowes for mapping HTTP methods like GET, PUT, POST and DELETE to Java methods with the @GET, @PUT, @POST and @DELETE annotations. In this example only the GET method is used. In RESTfull service the HTTP GET is used to retrieve data. To map a GET request to a method you can simply annotate a method with @GET.</p>
<p>The @Produces annotation specifies the Mime-Type of the response data the methods produces. In this example the methods both produce XML data, therefore we need to set the Mime-Type to application/xml. When returning an Object from a method annotated with @Produces, JAX-RS trieds to find an appropriate converter to produces the output. In this case I will use JAXB will to marshall the Objects to XML (see below).</p>
<pre><script type="syntaxhighlighter" class="brush: java">
package com.oudmaijer.webshop.web.rest;

import com.oudmaijer.webshop.domain.Category;
import com.oudmaijer.webshop.domain.Product;
import com.oudmaijer.webshop.service.ProductService;

import javax.annotation.ManagedBean;
import javax.inject.Inject;
import javax.naming.NamingException;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import java.util.List;

/**
 * Rest service for Products.
 * 
<p/>
 * User: sou12983
 * Date: 18-feb-2010
 * Time: 10:15:04
 */
@Path(value = "/product")
@ManagedBean
public class ProductRestlet {

    @Inject
    private ProductService productService;

    /**
     * Returns all the product categories in XML format.
     *
     * @return
     * @throws NamingException
     */
    @GET
    @Path("/categories")
    @Produces("application/xml")
    public List<Category> getCategories() throws NamingException {
        return productService.getCategories();
    }

    /**
     * Returns all the products in a specified category.
     *
     * @param categoryId
     * @return
     * @throws NamingException
     */
    @GET
    @Path("/category/{categoryId}")
    @Produces("application/xml")
    public List<Product> getProducts(@PathParam(value = "categoryId") Long categoryId) throws NamingException {
        return productService.getProducts(categoryId);
    }
}
</script></pre>
<p><b>JAXB marshalling</b></p>
<p>In order for JAXB to marshall the Objects returned, we need to specify JAXB annotations on the Objects returned from the methods.<br />
In this example I&#8217;ve added @XmlRootElement to the returned Objects to simply marshall the entire Object to XML.</p>
<pre><script type="syntaxhighlighter" class="brush: java">
package com.oudmaijer.webshop.domain;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Product {
...
}

package com.oudmaijer.webshop.domain;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Category{
...
}
</script></pre>
<p><b>Adding Jersey to the web deployment descriptor: web.xml</b></p>
<p>For JAX-RS to work we still need to add a Servlet to the web.xml which maps URL&#8217;s to the services. In this case we need to add the JerseyServlet to the web.xml. In the servlet-mapping all /rest/ URL patterns are mapped to Jersey. We can access the REST services using the following URIs: /rest/product/etc.</p>
<pre><script type="syntaxhighlighter" class="brush: xml">
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

<servlet>
    <servlet-name>JerseyServlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>JerseyServlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

</web-app>
</script></pre>
<p><b>Conclusion</b></p>
<p>When building RESTfull services on an JEE6 enabled application server, JAX-RS really makes things easy. You will have to decide for your specific case if you want to use Spring or JAX-RS.</p>
<p><em><a href="http://www.oudmaijer.com/blog/2010/02/19/rest-made-easy-with-java-ee-6-and-jax-rs-1-1/">Orginal article posted here.</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smart-java.nl/blog/index.php/2010/02/19/rest-made-easy-with-java-ee-6-and-jax-rs-1-1/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Spring 3.0: REST services with Spring MVC</title>
		<link>http://blog.smart-java.nl/blog/index.php/2010/01/16/spring-3-0-rest-services-with-spring-mvc/</link>
		<comments>http://blog.smart-java.nl/blog/index.php/2010/01/16/spring-3-0-rest-services-with-spring-mvc/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 12:50:22 +0000</pubDate>
		<dc:creator>Stephan Oudmaijer</dc:creator>
				<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=739</guid>
		<description><![CDATA[Spring 3.0 has support for REST style WebServices, the Spring MVC controllers facilitate the functionality. In this example I will show an example of how to implement a basic REST service that uses XML marshalling to sent information over HTTP. Disclamier: this is not an in depth tutorial for building REST style WebServices.
The Spring MVC [...]]]></description>
			<content:encoded><![CDATA[<p>Spring 3.0 has support for REST style WebServices, the Spring MVC controllers facilitate the functionality. In this example I will show an example of how to implement a basic REST service that uses XML marshalling to sent information over HTTP. Disclamier: this is not an in depth tutorial for building REST style WebServices.</p>
<p><b>The Spring MVC controller</b></p>
<p>The Spring 3.0 REST support relies havily on Spring MVC. We should use the Controller class for implementing a REST style WeService. To declare a Controller I use the Spring annotation based configuration. In this example the ProductRestService class is annotated with @Controller annotation. In order for Spring to pick-up the annotation Spring needs to be configured to scan for annotation (see the Spring configuration section).</p>
<p>REST uses templates that describe the URI to be used to invoke a WebService method. These URI templates can contain variable placeholders which allow for passing information to the WebService. The URI should typically contain all the information required for invoking a WebService method. </p>
<p>The @RequestMapping annotation allowes you to define the URI and HTTP method that are mapped to a method. In this example I have annotated the ProductRestService.getProductById(Long productId) with the @RequestMapping.<br />
The value of the @RequestMapping, in this case: /products/{productId}    , defines the URI that is mapped to this method. The productId variable needs to be defined when invoking the method and will be resolved automatically by Spring MVC with the value from the request URI. You can use the @PathVariable to inject the value of the productId variable directly into a method parameter.</p>
<p>The @ResponseBody annotation tells Spring to marshall the return value of the method to the HTTP response body. Spring allowes you to configure HTTP message converters that take care of conversion of the return value to a format which is accepted by the client. In this example the return value will be marshalled to XML using XStream. </p>
<pre class="brush: java">
package com.oudmaijer.spring.rest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 *  This is an example REST style MVC controller. It serves as an
 *  endpoint for retrieving Product Objects.
 */
@Controller
public class ProductRestService {

    /**
     * This method returns a specific Product. The URI to request a Product is
     * specified in the @RequestMapping.
     *
     * @param productId the identifier of the requested product
     * @return a Product
     */
    @RequestMapping(value="/products/{productId}", method = RequestMethod.GET)
    @ResponseBody
    public Product getProductById(@PathVariable Long productId) {
        Product p = new Product();
        p.setId(productId);
        return p;
    }

}
</pre>
<p><b>Spring configuration</b></p>
<p>The configuration is where all the magic happens. It is important to define the &lt;mvc:annotation-driven /&gt; element at the end of the configuration file or else Spring will not register the marshallingHttpMessageConverter. It took me some time to figure this out ;(</p>
<p>You need to add the MessageConverters to the configuration in order to get the OXM marshalling to work. Spring uses the requests <a target="new" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html">Accept</a> header to determine which converter to use.</p>
<pre><script type="syntaxhighlighter" class="brush: xml">
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

	<!-- Enable annotation scanning. -->
	<context:component-scan base-package="com.oudmaijer.spring.rest" />

	<!-- Define the OXM marshaller which is used to convert the Objects <-> XML. -->
	<bean id="oxmMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller" />

	<bean id="marshallingHttpMessageConverter"
		class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="oxmMarshaller" />
<property name="unmarshaller" ref="oxmMarshaller" />
	</bean>

	<!-- Required for REST services in order to bind the return value to the ResponseBody. -->
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
			<util:list id="beanList">
				<ref bean="marshallingHttpMessageConverter" />
			</util:list>
		</property>
	</bean>

	<!-- Should be defined last! -->
	<mvc:annotation-driven />

</beans>
</script>
</pre>
<p><b>Maven2 dependencies</b></p>
<p>You need to add a couple of Maven2 dependencies to get the project up and running. Below is the entire pom.xml.</p>
<pre><script type="syntaxhighlighter" class="brush: xml">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.oudmaijer.spring.rest</groupId>
    <artifactId>spring-3.0-rest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
    <build>
<plugins>
<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <!-- http://maven.apache.org/plugins/maven-compiler-plugin/ -->
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
            <optional>false</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>3.0.0.RELEASE</version>
            <optional>false</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>3.0.0.RELEASE</version>
            <optional>false</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>3.0.0.RELEASE</version>
            <optional>false</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>3.0.0.RELEASE</version>
            <optional>false</optional>
        </dependency>
        <dependency>
            <groupId>xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.2.2</version>
            <optional>false</optional>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>        
    </dependencies>
</project>
</script></pre>
<p><b>Web deployment descriptor: web.xml</b></p>
<p>Last but not least the web.xml. Since the REST support in Spring is based on Spring MVC you need to define the DispatcherServlet. Make sure to map the correct URL pattern to the DispatcherServlet.</p>
<pre><script type="syntaxhighlighter" class="brush: xml">
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5">
  <display-name>spring-3.0-rest</display-name>
  <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/META-INF/spring/*.xml</param-value>
  </context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <servlet>
      <servlet-name>DispatcherServlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
      </init-param>
  </servlet>
  <servlet-mapping>
      <servlet-name>DispatcherServlet</servlet-name>
      <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>
</script></pre>
<p><b>Invoking the service</b></p>
<p>This example only supports the HTTP GET method. If you want to test or build a client that uses REST WebServices you should use the RestTemplate in Spring. We can easily validate if the example WebService is running by accessing the service through Firefox. This will result in the following response.</p>
<p><img src="http://oudmaijer.com/cms/uploads/images/development/spring-rest/spring-rest.png"/></p>
<p>For more information on REST support in Spring 3.0 please refer to the <a target="_new" href="http://www.springsource.org/documentation">Spring reference documentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smart-java.nl/blog/index.php/2010/01/16/spring-3-0-rest-services-with-spring-mvc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Spring Security 3.0 and CAS 3.3.4 integration</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/12/29/spring-security-3-0-and-cas-3-3-4-integration/</link>
		<comments>http://blog.smart-java.nl/blog/index.php/2009/12/29/spring-security-3-0-and-cas-3-3-4-integration/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 08:43:31 +0000</pubDate>
		<dc:creator>Stephan Oudmaijer</dc:creator>
				<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=608</guid>
		<description><![CDATA[
JA-SIG Central Authentication Service (CAS) is an enterprise level, open-source, single sign on solution with a Java server component and various client libraries written in a multitude of languages including PHP, PL/SQL, Java, .Net, PHP, Perl and more.
Both Spring Security 3.0 and Spring 3.0 where released this month. Spring Security provides excelent support for CAS. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://oudmaijer.com/cms/uploads/images/security/cas/casLogo.jpg"/><br />
JA-SIG Central Authentication Service (CAS) is an enterprise level, open-source, single sign on solution with a Java server component and various client libraries written in a multitude of languages including PHP, PL/SQL, Java, .Net, PHP, Perl and more.</p>
<p>Both Spring Security 3.0 and Spring 3.0 where released this month. Spring Security provides excelent support for CAS. In Spring Security 3.0 a couple of CAS integration components have been changed (renamed). The configuration is also a bit different from Spring Security 2.0.x. </p>
<p><b>How CAS works</b><br />
The CAS Server webapp should be deployed on an application server. Applications can use the CAS Server for the authentication process. CAS only provides authentication and no authorisation. The authorisation should be implemented (using Spring Security) by the applications using the CAS Server. </p>
<p><b>How Spring Security fits in</b><br />
Lets say an user tries to access a protected resource within an application using Spring Security. Spring Security intercepts the request and checks if the user should be authenticated. If so, the user is forwarded tot the CAS login page. The users typically enters his username and password and submits it to the CAS server. If the user was successfully authenticated by CAS, the users will be redirected back to the application where it was accessing a protected resource. The redirect URL now contains a ticket generated by CAS. Spring Security will use this ticket to validate against CAS if the ticket is valid for this user. If so, the user details will be loaded by Spring Security. If the user is also authorised to access the protected resource, access will be granted.</p>
<p><b>Configuration</b><br />
For my demo I use the CAS server webapp version 3.3.4. I have it deployed on Apache Tomcat 6.0.20. In the demo I access the CAS Server using HTTP, this should be HTTPS in a production environment! I have deployed the applications using the following URLs:<br/></p>
<li>The CAS Server web application: http://localhost:8080/cas-server-webapp-3.3.4/</li>
<li>The application using CAS: http://localhost:8080/spring-security-cas/</li>
<p>I use Maven2 for managing my dependencies, the following libraries should be added to the pom.xml.</p>
<p><b>Maven2 dependencies</b></p>
<pre class="brush:xml">
<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-core</artifactId>
		<version>3.0.0.RELEASE</version>
		<optional>false</optional>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>3.0.0.RELEASE</version>
		<optional>false</optional>
	</dependency>
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-core</artifactId>
		<version>3.0.0.RELEASE</version>
		<optional>false</optional>
	</dependency>
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-config</artifactId>
		<version>3.0.0.RELEASE</version>
		<optional>false</optional>
	</dependency>
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-cas-client</artifactId>
		<version>3.0.0.RELEASE</version>
		<optional>false</optional>
	</dependency>
</dependencies>
</pre>
<p><b>Spring Security configuration</b><br />
Please be aware that the Spring Security reference documentation is <a href="http://jira.springframework.org/browse/SEC-1344">not 100% accurate</a> on the CAS integration.</p>
<pre class="brush:xml">
<?xml version="1.0"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">

	<!--
		Enable security, let the casAuthenticationEntryPoint handle all intercepted urls.
		The CAS_FILTER needs to be in the right position within the filter chain.
	-->
	<security:http entry-point-ref="casAuthenticationEntryPoint" auto-config="true">
		<security:intercept-url pattern="/**" access="ROLE_USER"></security:intercept-url>
		<security:custom-filter position="CAS_FILTER" ref="casAuthenticationFilter"></security:custom-filter>
	</security:http>

	<!--
		Required for the casProcessingFilter, so define it explicitly set and
		specify an Id Even though the authenticationManager is created by
		default when namespace based config is used.
	-->
	<security:authentication-manager alias="authenticationManager">
		<security:authentication-provider ref="casAuthenticationProvider"></security:authentication-provider>
	</security:authentication-manager>

	<!--
		This section is used to configure CAS. The service is the
		actual redirect that will be triggered after the CAS login sequence.
	-->
	<bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">
<property name="service" value="http://localhost:8080/spring-security-cas/j_spring_cas_security_check"></property>
<property name="sendRenew" value="false"></property>
	</bean>	

        <!--
		The CAS filter handles the redirect from the CAS server and starts the ticket validation.
	-->
	<bean id="casAuthenticationFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter">
<property name="authenticationManager" ref="authenticationManager"></property>
	</bean>

	<!--
		The entryPoint intercepts all the CAS authentication requests.
		It redirects to the CAS loginUrl for the CAS login page.
	-->
	<bean id="casAuthenticationEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">
<property name="loginUrl" value="http://localhost:8080/cas-server-webapp-3.3.4/login"></property>
<property name="serviceProperties" ref="serviceProperties"></property>
	</bean>

	<!--
		Handles the CAS ticket processing.
	 -->
	<bean id="casAuthenticationProvider" class="org.springframework.security.cas.authentication.CasAuthenticationProvider">
<property name="userDetailsService" ref="userService"></property>
<property name="serviceProperties" ref="serviceProperties"></property>
<property name="ticketValidator">
			<bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
				<constructor-arg index="0" value="http://localhost:8080/cas-server-webapp-3.3.4"></constructor>
			</bean>
		</property>
<property name="key" value="cas"></property>
	</bean>

	<!--
		The users available for this application.
	-->
	<security:user-service id="userService">
		<security:user name="user" password="user" authorities="ROLE_USER"></security:user>
	</security:user-service>
</beans>
</pre>
<p><b>web.xml</b></p>
<pre class="brush:xml">
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>webapp</display-name>

	<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-security.xml</param-value>
	</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>
</pre>
<p>Thats it, try it yourself!</p>
<p><i>Original article posted at: <a href="http://oudmaijer.com/cms/index.php?mact=News,cntnt01,detail,0&#038;cntnt01articleid=21&#038;cntnt01returnid=57">http://oudmaijer.com</a></i></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smart-java.nl/blog/index.php/2009/12/29/spring-security-3-0-and-cas-3-3-4-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A lot of exciting new stuff in december: Spring 3.0 &amp; Java EE 6</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/12/21/a-lot-of-new-stuff-in-december/</link>
		<comments>http://blog.smart-java.nl/blog/index.php/2009/12/21/a-lot-of-new-stuff-in-december/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 13:28:13 +0000</pubDate>
		<dc:creator>Stephan Oudmaijer</dc:creator>
				<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=598</guid>
		<description><![CDATA[The last month of 2009 has brought some exciting Java news, both Java EE 6 and Spring 3.0 have become final this month!
Spring Framework 3.0 GA
Spring 3.0 GA is compatible with Java EE 6 final in terms of runtime environments now (e.g. on GlassFish v3 as released last week) and supports JPA 2.0 final already [...]]]></description>
			<content:encoded><![CDATA[<p>The last month of 2009 has brought some exciting Java news, both Java EE 6 and Spring 3.0 have become final this month!</p>
<p><strong><a href="http://blog.springsource.com/2009/12/16/spring-framework-3-0-goes-ga/" target="_self">Spring Framework 3.0 GA</a></strong></p>
<p>Spring 3.0 GA is compatible with Java EE 6 final in terms of runtime environments now (e.g. on GlassFish v3 as released last week) and supports JPA 2.0 final already (e.g. using EclipseLink 2.0). We also support the newly introduced <a onclick="javascript:urchinTracker('/outbound/java.sun.com');" href="http://java.sun.com/javaee/6/docs/api/javax/annotation/ManagedBean.html">@ManagedBean</a> (JSR-250 v1.1) annotation for component scanning now, which nicely complements our <a onclick="javascript:urchinTracker('/outbound/java.sun.com');" href="http://java.sun.com/javaee/6/docs/api/javax/inject/Inject.html">@Inject</a> (JSR-330) support for annotation-driven dependency injection.</p>
<p><strong>* Spring expression language (SpEL):</strong> a core expression parser for use in bean definitions, allowing for references to nested bean structures (e.g. properties of other beans) as well as to environmental data structures (e.g. system property values) through a common #{…} syntax in property values.</p>
<p>* <strong>Extended support for annotation-based components:</strong> now with the notion of configuration classes and annotated factory methods (as known from Spring JavaConfig). Spring also allows for injecting configuration values through @Value expressions now, referring to configuration settings via dynamic #{…} expressions or static ${…} placeholders.</p>
<p>* <strong>Powerful stereotype model:</strong> allows for creating &#8217;shortcut&#8217; annotations through the use of meta-annotations, e.g. for default scopes and default transactional characteristics on custom stereotypes. Imagine a custom @MyService annotation indicating @Service, @Scope(&#8220;request&#8221;) and @Transactional(readOnly=true) through a single annotation.</p>
<p>* <strong>Standardized dependency injection annotations:</strong> Spring 3.0 comes with full support for the JSR-330 specification for Dependency Injection in Java – annotation-driven injection via @Inject and its associated qualifier and provider model, as an alternative to Spring&#8217;s own @Autowired and co.</p>
<p>* <strong>Declarative model validation based on constraint annotations:</strong> Spring-style setup of a JSR-303 Bean Validation provider (such as Hibernate Validator 4.0). Comes with an annotation-driven validation option in Spring MVC, exposing a unified view on constraint violations through Spring’s binding result facility.</p>
<p>* <strong>Enhanced binding and annotation-driven formatting</strong>: Converter and Formatter SPIs as an alternative to standard PropertyEditors. Formatting may be driven by annotations in a style similar to JSR-303 constraints, e.g. using @DateTimeFormat. Also, check out the new mvc namespace for convenient setup of formatting and validation in Spring MVC.</p>
<p>* <strong>Comprehensive REST support:</strong> native REST capabilities in Spring MVC, such as REST-style request mappings, URI variable extraction through @PathVariable parameters, and view resolution driven by content negotiation. Client-side REST support is available in the form of a RestTemplate class.</p>
<p>* <strong>Rich native Portlet 2.0 support:</strong> Spring MVC fully supports Portlet 2.0 environments and Portlet 2.0’s new event and resource request model. Includes specialized mapping facilities for typical portlet request characteristics: @ActionMapping, @RenderMapping, @ResourceMapping, @EventMapping.</p>
<p>* <strong>Object/XML Mapping (OXM):</strong> as known from Spring Web Services, now in Spring Framework core. Marshalling and Unmarshaller abstractions with out-of-the-box support for JAXB 2, Castor, etc. Comes with integration options for XML payloads in Spring MVC and Spring JMS.</p>
<p>* <strong>Next-generation scheduling capabilities:</strong> new TaskScheduler and Trigger mechanisms with first-class cron support. Spring 3.0 comes with a convenient task namespace and also supports @Async and @Scheduled annotations now. This can be executed on top of native thread pools or server-managed thread pools.</p>
<p><strong><a href="http://jcp.org/en/jsr/detail?id=316" target="_blank">Java EE 6</a></strong></p>
<p>From <a href="http://weblogs.java.net/blog/robc/archive/2009/12/01/java-ee-6-platform-approved-today">Roberto Chinnici&#8217;s weblog</a>:</p>
<p><em>With the closing of the final approval ballot earlier today, it is now official: the JCP Executive Committee has given a green light to the release of the Java EE 6 platform specification. The final release will happen on December 10, when <a href="https://glassfish.dev.java.net/">GlassFish v3</a> will be available. For more details of the ballot, with comments from several EC members, please refer to <a href="http://jcp.org/en/jsr/results?id=5025" target="_blank">the JCP web site</a>. Of course the excitement of the event drove me to watch live the ballot close at midnight PT and <a href="https://twitter.com/robc2/status/6229390753" target="_blank">tweet</a> about it!</em></p>
<p><em>Several other Java EE component JSRs were approved at the same time: Servlet 3.0, JPA 2.0, EJB 3.1, Connector 1.6, CDI 1.0. All other components, be they full JSRs or maintenance releases (MRs, for insiders), had been previously approved. I should also mention here that, being part of the platform JSR (JSR-316) the Java EE 6 Web Profile too was approved, and so was the Managed Beans 1.0 specification I talked about in prior blog entries. So, yes, now we really have profiles in Java EE: let&#8217;s put them to good use!</em></p>
<p><em>We are going to have more white papers, tutorials, etc. coming up for the final release in a few days. In the meantime, even a casual perusal of the <a href="http://javadoc.glassfish.org/javaee6/apidoc/" target="_blank">javadocs</a> will show a number of new APIs in key areas: JAX-RS, Dependency Injection, CDI, Bean Validation. I see a bright future for these APIs, and fully expect them to become key components of Java EE applications in the coming years. I also happen to think that the level of integration that we achieved between these new APIs and some of the existing ones represents a valuable principle that can guide the evolution of Java EE going forward; certainly I expect future Java EE APIs to be held to the same strict criteria for integration with the rest of the platform that JAX-RS, Bean Validation and CDI were held to in this release.</em></p>
<p>Java EE 6 includes:</p>
<ul>
<li>Java Persistency API 2.0</li>
<li>JavaServer Faces 2.0</li>
<li>Enterprise JavaBeans 3.1</li>
<li>Servlet 3.0</li>
<li>Context and Dependecy Injection (a.k.a. WebBeans)</li>
<li>Dependency Injection (@Inject)</li>
<li>JAX-RS</li>
<li>Web Profile</li>
<li>and much more&#8230;</li>
</ul>
<p>See also this article for more information: <a href="http://java.sun.com/developer/technicalArticles/JavaEE/JavaEE6Overview.html" target="_blank">http://java.sun.com/developer/technicalArticles/JavaEE/JavaEE6Overview.html</a></p>
<p>So if you are bored during the christmas holiday, you can try out the new Java EE 6 features using <a href="https://glassfish.dev.java.net/downloads/v3-final.html">GlassFish v3</a> and <a href="http://netbeans.org/downloads/index.html">NetBeans 6.8</a>. But also <a href="http://www.jetbrains.com/idea/whatsnew/index.html#Java_EE_6_Support" target="_blank">IntelliJ 9 </a>and Eclipse 3.5.1 feature Java EE 6 support.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smart-java.nl/blog/index.php/2009/12/21/a-lot-of-new-stuff-in-december/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaOne 2009 started!</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/06/02/javaone-2009-started/</link>
		<comments>http://blog.smart-java.nl/blog/index.php/2009/06/02/javaone-2009-started/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 15:47:01 +0000</pubDate>
		<dc:creator>Stephan Oudmaijer</dc:creator>
				<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=396</guid>
		<description><![CDATA[JavaOne 2009 has just started. The worlds leading Java conference will be held from 2-5 June in San Franciso (US). If you are interested you can follow the general sessions via the JavaOne homepage, due to the time difference in Europe you can watch and listen to the general sessions around dinner time. Check it [...]]]></description>
			<content:encoded><![CDATA[<p>JavaOne 2009 has just started. The worlds leading Java conference will be held from 2-5 June in San Franciso (US). If you are interested you can follow the general sessions via the JavaOne homepage, due to the time difference in Europe you can watch and listen to the general sessions around dinner time. Check it out: <a href="http://java.sun.com/javaone/">http://java.sun.com/javaone/</a></p>
<p>I`ve just finished watching the opening session which contained a lot of promotion for JavaFX. Sony talked about Java enabling interactive Blu-ray applications. Verizon anounced a partnership with Sun for  applications for their wireless network.</p>
<p>Larry Allison, CEO of Oracle, was the last guest speaker. He talked about how excited he was about the Oracle takeover of Sun and Java being the key platform for current and future Oracle (Fusion) products. He also mentioned that Sun and Oracle maybe hitting the mobile/nettop market and launching a Google Android alike platform.</p>
<p>I`ll be posting some JavaOne updates this week.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smart-java.nl/blog/index.php/2009/06/02/javaone-2009-started/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>What is OSGi? (short version)</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/05/29/what-is-osgi-short-version/</link>
		<comments>http://blog.smart-java.nl/blog/index.php/2009/05/29/what-is-osgi-short-version/#comments</comments>
		<pubDate>Fri, 29 May 2009 07:36:15 +0000</pubDate>
		<dc:creator>Stephan Oudmaijer</dc:creator>
				<category><![CDATA[Java language]]></category>

		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=394</guid>
		<description><![CDATA[Since modularisation is a hot topic for Java 7, most developers by now should have a basic understanding about what OSGi is. But I often get the question; What is OSGi?
OSGi is The Dynamic Module System for Java[TM]. OSGi enables Java applications to become modulair and express dependencies on (versions of) other modules. Which means [...]]]></description>
			<content:encoded><![CDATA[<p>Since modularisation is a hot topic for Java 7, most developers by now should have a basic understanding about what OSGi is. But I often get the question; What is OSGi?</p>
<p>OSGi is The Dynamic Module System for Java[TM]. OSGi enables Java applications to become modulair and express dependencies on (versions of) other modules. Which means that your application no longer depend on the classloader (not) taking care of dependencies. There are a number of issues OSGi addresses, but I wont even bother writing them down here since Peter Kriens has an excellent blog post about <a href="http://www.osgi.org/blog/2008_12_01_archive.html">those issues</a>.</p>
<p>Java 7, and in particular JSR294, also tries to solve the modularisation problem. The expert group is working with the OSGi alliance to implement modularisation in Java, but they still have a long way to go. If you are interested in the progress of the expert group you can follow the <a href="http://altair.cs.oswego.edu/pipermail/jsr294-modularity-eg/">JSR294 EG mailing list</a>.</p>
<p>Below is a list of resources about OSGi:</p>
<ul>
<li>http://www.infoq.com/presentations/osgi-the-foundation</li>
<li>http://www.infoq.com/presentations/colyer-server-side-osgi</li>
<li>http://www.infoq.com/presentations/dm-Server-Rod-Johnson</li>
<li>http://www.osgi.org/blog/2008_12_01_archive.html</li>
<li>http://www.theserverside.com/tt/articles/article.tss?l=MigratingPathToOSGi</li>
</ul>
<p>Now you know!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smart-java.nl/blog/index.php/2009/05/29/what-is-osgi-short-version/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Oracle neemt Sun over</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/04/20/oracle-neemt-sun-over/</link>
		<comments>http://blog.smart-java.nl/blog/index.php/2009/04/20/oracle-neemt-sun-over/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 17:10:29 +0000</pubDate>
		<dc:creator>Stephan Oudmaijer</dc:creator>
				<category><![CDATA[Algemeen]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=375</guid>
		<description><![CDATA[Oracle en Sun hebben een akkoord bereikt over de overname van Sun door Oracle. Lange tijd leek het erop dat IBM een van de belangrijkste kanshebber was om Sun over te nemen. Echter konden IBM en Sun het niet eens worden over de voorwaarden waaronder de deal door zou gaan en de prijs per aandeel. [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle en Sun hebben een akkoord bereikt over de overname van Sun door Oracle. Lange tijd leek het erop dat IBM een van de belangrijkste kanshebber was om Sun over te nemen. Echter konden IBM en Sun het niet eens worden over de voorwaarden waaronder de deal door zou gaan en de prijs per aandeel. Oracle betaalt de aandeelhouders van Sun $9.50 per aandeel, hetgeen neerkomt op een deal van $7.4 billion dollar. Dat is  $0.10 per aandeel meer dan IBM bereid was om neer te tellen.</p>
<p>De overname van Sun door Oracle levert wel een aantal interessante vraagstukken op, wat gaat Oracle bijvoorbeeld doen met Java? Op dit moment is er nogal wat onenigheid over het Java Community Proces (JCP), het standardisatie proces voor Java. Velen hopen dat Oracle de JCP nu echt open zal maken. Anderen zeggen dat er <a href="http://www.jroller.com/scolebourne/entry/the_jcp_doesn_t_exist">geen sprake</a> van een inspraak proces is. Aan de andere kant, misschien is het wel niet in het belang van Oracle om Java nog opener te maken om het zodoende concurrent IBM lastiger te maken?</p>
<p>Verder zijn er nog NetBeans en  GlassFish? Aangezien Oracle BEA heeft overgenomen, bekend van o.a. de applicatie server WebLogic, is er bij Oracle een overschot aan applicatie servers ontstaan. Zelfde geldt voor ontwikkelomgeving NetBeans vs JDeveloper, zullen beide naast elkaar blijven bestaan of worden ze samengevoegd?</p>
<p>Daarnaast is Oracle plotsklaps eigenaar geworden van MySQL, door velen gezien als het open source alternatief voor Oracle. Moeten we ons nu gaan verdiepen in PostgreSQL? <img src='http://blog.smart-java.nl/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><em>Voor het orginele persbericht zie: http://www.oracle.com/corporate/press/2009_april/018363.htm</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smart-java.nl/blog/index.php/2009/04/20/oracle-neemt-sun-over/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>IBM wil Sun overnemen?</title>
		<link>http://blog.smart-java.nl/blog/index.php/2009/03/18/ibm-wil-sun-overnemen/</link>
		<comments>http://blog.smart-java.nl/blog/index.php/2009/03/18/ibm-wil-sun-overnemen/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 17:10:04 +0000</pubDate>
		<dc:creator>Stephan Oudmaijer</dc:creator>
				<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://blog.smart-java.nl/blog/?p=333</guid>
		<description><![CDATA[Het is nog geen 1 april, maar toen ik vanmorgen het onderstaande bericht las moest ik toch echt even denken aan een 1 april grap. In hoeverre dit waar is?
IBM onderhandelt met Sun Microsystems over een overname. Big Blue zou 6,5 miljard dollar voor Sun op tafel willen leggen en met de overname zijn positie [...]]]></description>
			<content:encoded><![CDATA[<p>Het is nog geen 1 april, maar toen ik vanmorgen het onderstaande bericht las moest ik toch echt even denken aan een 1 april grap. In hoeverre dit waar is?</p>
<p class="lead"><em>IBM onderhandelt met Sun Microsystems over een overname. Big Blue zou 6,5 miljard dollar voor Sun op tafel willen leggen en met de overname zijn positie op de internet-, software- en telecommunicatiemarkt willen versterken.</em></p>
<p><em>De twee Amerikaanse bedrijven zouden deze week al tot een overeenkomst kunnen komen, <a title="WSJ -- IBM in Talks to Buy Sun in Bid to Add to Web Heft" href="http://online.wsj.com/article/SB123735970806267921.html" target="_self">meldt</a> The Wall Street Journal. De krant weet echter ook te melden dat er nog niets is beslist en dat de onderhandelingen ook zonder succes afgebroken kunnen worden. Sun heeft moeite om winst te maken en zou al meerdere bedrijven over een acquisitie gepolst hebben, maar tot nu toe zonder succes: onder andere HP zou Sun al de deur hebben gewezen. Voor IBM zou het de grootste overname in zijn geschiedenis zijn. Vorig jaar <a title="Tweakers.net -- IBM trekt 5 miljard dollar uit voor overname Cognos" href="http://tweakers.net/nieuws/50328/ibm-trekt-5-miljard-dollar-uit-voor-overname-cognos.html">betaalde</a> het computerbedrijf 5 miljard dollar om het in <em>business intelligence</em> gespecialiseerde Cognos in te lijven.</em></p>
<p><em>Met Sun in de gelederen zou IBM zijn omzet voor bijna een derde uit hardware halen, waar het zich de afgelopen jaren juist meer op software en diensten richtte. Verder hebben de multinationals een nogal verschillende bedrijfscultuur: het in 1982 opgerichte Sun richt zich vooral op innovatie, terwijl het uit 1911 stammende International Business Machines zich met name op de vraag in de markt oriënteert. Aan de andere kant zijn er de nodige overeenkomsten: de band met Microsoft en Intel is bij beide bedrijven niet sterk en zowel IBM als Sun leunen zwaar op Linux en Java.</em></p>
<p>Bron: http://tweakers.net/nieuws/59083/ibm-wil-sun-microsystems-overnemen.html</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.smart-java.nl/blog/index.php/2009/03/18/ibm-wil-sun-overnemen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
