Checking out the source code from SVN
============================================

1) A Subversion client installed in order to checkout the code.
  * Instructions for downloading and installing Subversion can be found here: http://subversion.tigris.org/
2) Create a subdirectory and checkout the Apache Shindig code from its Subversion repository
  * mkdir ~/src/shindig (or wherever you'd like to put it)
  * cd ~/src/shindig
3) svn co http://svn.apache.org/repos/asf/shindig/trunk/ .


Installing and running the various java servers
============================================

1) Install Maven 2.0.8 or higher (see http://maven.apache.org)

2) Make sure the JAVA_HOME environment variable is set to the location of your
   JDK/JRE, and that the maven executable is in your PATH.

3) From the base source directory ( eg cd .. )
  * mvn - Cleans the source tree and then builds all the java classes, packages
    them into jars and installs them in your local repository also adds source
    jars ( by default ~/.m2/repository on Unix/OSX)
  * mvn install - does the above but does not clean first
  * mvn -Psocial - builds only the social parts
  * mvn -Pgadgets - builds only the gadget parts

  You must perform at least a "mvn" to place build all the artifacts and place
  them in you local maven repository.

4) To Run, using a embedded Jetty Webapp container, in the base project
       directory (eg cd .. )
   * First do a full build as in step 3
   * mvn -Prun - to run Jetty with both social and gadgets
   * mvn -Prun -DrunType=gadgets - to run Jetty with only the gadgets server
   * mvn -Prun -DrunType=social - to run Jetty with only the social server

5) To Run with a different port
   * cd java/server
   * mvn clean install jetty:run -DrunType=<full|gadgets|social> -Djetty.port=<port>

6) Once running, you can test the gadget rendering server by hitting this url:
  http://localhost:8080/gadgets/ifr?url=http://www.labpixies.com/campaigns/todo/todo.xml

  Or you can take a look at the sample container here:
  http://localhost:8080/samplecontainer/samplecontainer.html


Editing the Shindig code with Eclipse
---------------------------------------------

  * Install the Maven Eclipse plugin
  * Create and import the Eclipse Project files
  * Clean up some Build Path errors.

1 - Install the Maven Eclipse plugin from
    http://m2eclipse.sonatype.org/update/
  
  * There is an optional dependency on Sublipse which you can get from
    http://subclipse.tigris.org/
    If not installing this dependency then select only the Maven Integration plug-in.

2 - Creating and Importing the Eclipse Projects

  * In the project base directory (same level as this file) run

     mvn eclipse:m2eclipse

  * In Eclipse, import the new projects in the File->Import->Existing Project
    menu.
  
    Choose "Select Root Directory" and select the project base directory that this
    file is in. This should find five Eclipse projects (common, features, gadgets,
    server and social-api). Click "Finish".

  * In each project, you will have a section called "Maven Dependencies", where
    you can find all your jars and sources. Use options in the plugin for
    downloading or source jars and updating dependencies.

3 - A Necessary Clean-up Step

    You should have 6 errors when you start Eclipse until you clean up:

    At the moment, you will have to edit the source dependencies to remove
    nested folders. On each project, edit properties > Build Path > Source and
    remove missing Source folders of "config", and "javascript". Do this for
    each of "gadgets", and "server" projects.

    There is a maven-eclipse-plugin bug tracking this issue in MECLIPSE-444.

To remove all eclipse-related metadata from your shindig source tree, run:

     mvn eclipse:clean

     
Generating Code Coverage in Eclipse
----------------------------------

To generate code coverage statistics inside of Eclipse, install the EclEmma plugin
  * http://www.eclemma.org/
  * Open org.apache.shindig.gadgets.AllTests
  * Right-click in the class, and select Coverage as -> JUnit Test


Building a Maven Site with Reports
----------------------------------

To build a Maven based site with reports

Run:
     mvn clean install site:site site:deploy -Dsite.localurl=file:///Users/ieb/public_html/shindig -Dproject.url=/~ieb/shindig

Where
    file:///Users/ieb/public_html/shindig is the final directory where you want to deploy the site to
    /~ieb/shindig is absolute site URL where you want the site to be hosted from. 


Running with Caja
----------------------------------

Caja is an important part of OpenSocial that greatly enhances JavaScript security.
Caja is managed in a separate open source project hosted by Google code projects.
For more information on Caja, see: http://code.google.com/p/google-caja/wiki/GettingStarted

   1) Load this page: http://localhost:8080/samplecontainer/samplecontainer.html
   2) Point it to this gadget: http://localhost:8080/gadgets/SocialHelloWorld.xml

To see the cajoled code (Firefox only), right-click inside the iframe and do "This Frame -> View Frame Source"    
    
    
Additional Reading
----------------------------------

For more information, see http://shindig.apache.org/

Read javascript/README for instructions for using the Apache Shindig Gadget Container JavaScript
to enable your page to render Gadgets using gmodules.com or a server started up as described above.

