<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- 
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License. 
-->
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Frequently Asked Questions</title>
    <meta name="description" content="Apache Wink -- Frequently Asked Questions">
    <meta name="author" content="dev@wink.apache.org">

    <META http-equiv="Content-Type" content="text/html;charset=UTF-8" />
    <META name="Keywords" content="Apache Wink JSR-237 REST JavaEE6 JAX-RS" />
    <META name="Owner" content="dev@wink.apache.org" />
    <META name="Robots" content="index, follow" />
    <META name="Security" content="Public" />
    <META name="DC.Rights" content="Copyright &copy; 2009-2013, The Apache Software Foundation" />

    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
    <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

    <!-- Le styles -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="assets/bootstrap/css/bootstrap.min.css" rel="stylesheet">
    <link href="assets/bootstrap/css/bootstrap-responsive.min.css" rel="stylesheet">
    <style type="text/css">
      body {
        padding-top: 60px;
        padding-bottom: 40px;
      }
    </style>

    <!-- Le fav and touch icons -->
    <link rel="shortcut icon" href="images/wink.png">
    <link rel="shortcut icon" href="images/favicon.ico">
    <link rel="apple-touch-icon" href="images/apple-touch-icon-iphone.png" />
    <link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-ipad.png" />
    <link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-iphone-retina.png" />
    <link rel="apple-touch-icon" sizes="144x144" href="images/apple-touch-icon-ipad-retina.png" />
  </head>

  <body>
    <div class="navbar navbar-inverse navbar-fixed-top">
      <div class="navbar-inner fill">
          <div class="container">
            <!--<a class="brand" href="index.html"><img src="images/favicon.ico" width="15%" height="15%"/></a>-->

            <ul class="nav">
              <li class="active"><a href="index.html">Home</a></li>
              <li class="active"><a href="news.html">News</a></li>
              <li class="active"><a href="downloads.html">Downloads</a></li>
              <li class="active"><a href="documentation.html">Documentation</a></li>
              <li class="active"><a href="community.html">Community</a></li>
              <li class="active"><a href="source.html">Source</a></li>
              <li class="active"><a href="faq.html">FAQ</a></li>
              <li class="active"><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
              <li class="active"><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
              <li class="active"><a href="privacy.html">Privacy</a></li>
            </ul>


            <!-- Google CSE Search Box Begins  -->
              <FORM class="navbar-form pull-right" id="searchbox_007756850371322559056:un2ixevjhis" action="http://www.google.com/cse">
                <INPUT type="hidden" name="cx" value="007756850371322559056:un2ixevjhis">
                <INPUT type="hidden" name="cof" value="FORID:0">
                <INPUT name="q" type="text" placeholder="Search">
              </FORM>
              <!--<SCRIPT type="text/javascript" src="http://www.google.com/coop/cse/brand?form=searchbox_007756850371322559056:un2ixevjhis"></SCRIPT>-->
              <!-- Google CSE Search Box Ends -->
        </div><!--/container -->
      </div><!--/navbar-inner -->
    </div><!--/navbar -->
    

    
    <div class="container" id="content">
      <h1>Frequently Asked Questions</h1>

<hr>

<div class="row">
    <div class="span10">
        <p><strong>General</strong></p>
        <ol>
            <li><a href="#sdk-examples">Where can I find examples for using Wink?</a></li>
            <li><a href="#sdk-spring">Does Wink have an integration with spring? Can I expose my REST services using Spring Remoting?</a></li>
            <li><a href="#sdk-struts">Is there an integration with Struts?</a></li>
            <li><a href="#sdk-struts-usage">Can Wink be used in the same WAR with Struts?</a></li>
            <li><a href="#sdk-tested-with-other-clients">Have you tested consuming REST resources developed using Wink from a REST client developed using other tools?</a></li>
            <li><a href="#sdk-query-parameters">Does Wink support query parameters?</a></li>
            <li><a href="#sdk-ide-plugin">Are there any plans for developing an IDE plugin wrapper for Wink?</a></li>
        </ol>

        <p><strong>Building Apache Wink</strong></p>
        <ol>
            <li><a href="#maven-version">What version of Maven is used to build Wink?</a></li>
            <li><a href="#maven-sources">Where can I read about Maven?</a></li>
            <li><a href="#build-oom">I am getting an OutOfMemoryException when performing a full build</a></li>
            <li><a href="#build-offline">Can I build the sources if I am not connected to the network?</a></li>
            <li><a href="#build-tests">Some tests fail during the build. Where can I see what happened?</a></li>
        </ol>
    </div>

</div>

<hr>

<h3>General<a name="General"></a></h3>

<div class="row">
    <div class="span10">

        <p><strong><a name="sdk-examples">Where can I find examples for using Wink?</a></strong></p>
        <p> 
            Wink distributions comes bundled with several examples ilustarting how to use the server and client.<br/>
            All the examples are located in the <tt>Wink/examples</tt> directory of the distribution zip.
        </p>
        <hr/>

        <p><strong><a name="sdk-spring">Does Wink have an integration with spring? Can I expose my REST services using Spring Remoting?</a></strong></p>
        <p> 
            Yes, it provides an extension module with the Spring integration. 
            However, Wink doesn't use Spring Remoting.
        </p>
        <hr/>

        <p><strong><a name="sdk-struts">Is there an integration with Struts?</a></strong></p>
        <p> 
            Wink does not have an integration with struts.
        </p>
        <hr/>

        <p><strong><a name="sdk-struts-usage">Can Wink be used in the same WAR with Struts?</a></strong></p>
        <p> 
            Yes, Wink and the code you develop over it can be used inside any WAR.
        </p>
        <hr/>

        <p><strong><a name="sdk-tested-with-other-clients">Have you tested consuming REST resources developed using Wink from a REST client developed using other tools?</a></strong></p>
        <p> 
            Sure. We have tested it from variety of clients including IE, Firefox, Outlook, Apache Abdera, Sun Rome, etc.
        </p>
        <hr/>

        <p><strong><a name="sdk-query-parameters">Does Wink support query parameters?</a></strong></p>
        <p> 
            Absolutely.
        </p>
        <hr />

        <p><strong><a name="sdk-ide-plugin">Are there any plans for developing an IDE plugin wrapper for Wink?</a></strong></p>
        <p> 
            We are considering this option for the Eclipse IDE.
        </p>

    </div>

</div>

<hr>

<h3>Building the Apache Wink<a name="building_the_apache_wink"></a></h3>

<div class="row">
    <div class="span10">
        <p><strong><a name="maven-version">What version of Maven is used to build Wink?</a></strong></p>
        <p> 
            Wink is built using Maven 2, version 2.0.9.
        </p>
        <hr/>

        <p><strong><a name="maven-sources">Where can I read about Maven?</a></strong></p>
        <p> 
            Maven site: <a class="externalLink" href="http://maven.apache.org">http://maven.apache.org</a><br /></br>
            Maven FAQ: <a class="externalLink" href="http://docs.codehaus.org/display/MAVENUSER/FAQs-1">http://docs.codehaus.org/display/MAVENUSER/FAQs-1</a>
        </p>
        <hr/>

        <p><strong><a name="build-oom">I am getting an OutOfMemoryException when performing a full build</a></strong></p>
        <p> 
            If you are getting OutOfMemoryException when attempting a full
            build, you may try increasing the max heap and the PermGen space sizes. 
            Either export a MAVEN_OPTS variable in your shell or add it to the original mvn script. 
            <br /></br>
        </p>
        <pre>MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m</pre>
        <hr/>

        <p><strong><a name="build-offline">Can I build the sources if I am not connected to the network?</a></strong></p>
        <p> 
            If you know your downloads are up-to-date, you can use the offline option 
            which may speed up your build considerably depending on network latency:
        </p>
        <pre>mvn -o</pre>
        <hr/>

        <p><strong><a name="build-tests">Some tests fail during the build. Where can I see what happened?</a></strong></p>
        <p> 
            Surefire, which is the default Maven test runner, outputs all tests reports
            as a set of xml and text files to the <tt>target/surefire-reports</tt> directory. 
            Any test failure details and stack traces end up in those files, and not in the console. 
            The output can be temporarily redirected to the console by adding the following option:
        </p>
        <pre>mvn -Dsurefire.useFile=false</pre>
    </div>

</div>
    </div> <!-- /container/content -->
    


    <hr>

    <div class="container">
      <footer>
        <div class="xright">
        Copyright &copy; 2009-2013 <a href="http://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.Licensed under <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.</br>
        Apache and the Apache feather logo are trademarks of The Apache Software Foundation. Other names may be trademarks of their respective owners.</br>
        </p>
    </footer>
  </div> <!-- /container/footer -->


  <!-- Le javascript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="assets/jquery/jquery-1.9.1.min.js"></script>
    <script src="assets/bootstrap/js/bootstrap.min.js"></script>

    <script type="text/javascript">
      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-1174707-10']);
      _gaq.push(['_trackPageview']);

      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
      })();
    </script>
    
  </body>
</html>
