--------------------------------------------------------------------------
 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.
 
 $Id$
--------------------------------------------------------------------------


--------------------------------------------------------------------------
Component Description
--------------------------------------------------------------------------
Usage Information

This is the Fulcrum JSON Component. For more information about this component, look at the HTML documentation in the site/ directory or 
generate the documentation using 

mvn site:site


Top level directories

dist/target/                       contains the zipped binary jars *
gson, jackson, jackson2 /          contains the different JSON implementation project files
api/                               contains the interface project files
src /                              contains project building files
xdoc   /                           contains the documentation 
target/                            contains the packaged project files, which allow to build the project **

*  after running mvn install 
** after running mvn clean site install -P apache-release, see below

--------------------------------------------------------------------------
Component Development 
--------------------------------------------------------------------------
Publishing Workflow

Prerequisites
 // jars
 mvn deploy -Papache-release

More Information
  https://www.apache.org/dev/publishing-maven-artifacts.html#prepare-poms
  http://maven.apache.org/developers/website/deploy-component-reference-documentation.html
  
Steps
1) Local Testing
  // Verify gpg.homedir, gpg.useagent, gpg.passphrase
  mvn clean site install -Papache-release -Dgpg.useagent=false -Dgpg.passphrase=<xx> 
  mvn release:prepare -DdryRun=true -DautoVersionSubmodules=true -Papache-release 

2) Remote Testing
  mvn release:clean
  mvn release:prepare -DautoVersionSubmodules=true -P apache-release -Dusername=<username> -Dpassword=<pw>
  // Helpful hint from Apache Website: If you're located in Europe then release:prepare may fail with 'Unable to tag SCM' and ' svn: No such revision X '. Wait 10 seconds and run mvn release:prepare again.
  
4) Release Preparing
  // performs an upload to repository.apache.org/service/local/staging/deploy/maven2/
  // Hint: Add -Dgpg.useagent=false helps, if running from a windows machine to avoid hanging while gpg plugin signing process ..
  mvn release:perform 
  
More Information 
  http://www.sonatype.com/books/nexus-book/reference/staging.html
  
5) Close the staging
  Login and close
  https://repository.apache.org/index.html#stagingRepositories
  
More Information 
  https://www.apache.org/dev/publishing-maven-artifacts.html#close-stage
  
6) Prepare Voting Information and Voting
  ....
  
7) a) 
  //Promote / Publish 
  http://www.apache.org/dev/publishing-maven-artifacts.html#promote
   b)
  //Drop and Restage
  http://www.apache.org/dev/publishing-maven-artifacts.html#drop
  - Reverse merge the release prepare, manually delete tag in svn repo and drop staged repository in nexus and start again with step 1.
  
8)  // Stage the latest documentation 
 // http://maven.apache.org/developers/website/deploy-component-reference-documentation.html
 mvn site site:stage scm-publish:publish-scm -Dscmpublish.dryRun=true
 mvn clean site site:stage scm-publish:publish-scm -Dusername=<username> -Dpassword=<pw>
   
--------------------------------------------------------------------------
Licence
--------------------------------------------------------------------------
   
This software is licensed under the Apache 2 license, quoted below.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this project 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.
