001    /*
002     * Copyright 2011-2012 UnboundID Corp.
003     *
004     * This program is free software; you can redistribute it and/or modify
005     * it under the terms of the GNU General Public License (GPLv2 only)
006     * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
007     * as published by the Free Software Foundation.
008     *
009     * This program is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012     * GNU General Public License for more details.
013     *
014     * You should have received a copy of the GNU General Public License
015     * along with this program; if not, see <http://www.gnu.org/licenses>.
016     */
017    
018    package com.unboundid.scim.marshal.json;
019    
020    import com.unboundid.scim.data.BaseResource;
021    import com.unboundid.scim.marshal.Marshaller;
022    import com.unboundid.scim.sdk.BulkOperation;
023    import com.unboundid.scim.sdk.Resources;
024    import com.unboundid.scim.sdk.SCIMException;
025    
026    import java.io.OutputStream;
027    import java.util.HashSet;
028    import java.util.List;
029    import java.util.Set;
030    
031    
032    
033    /**
034     * This class provides a SCIM object marshaller implementation to write SCIM
035     * objects to their Json representation.
036     */
037    public class JsonMarshaller implements Marshaller
038    {
039      /**
040       * {@inheritDoc}
041       */
042      public void marshal(final BaseResource resource,
043                          final OutputStream outputStream)
044          throws SCIMException
045      {
046        final JsonStreamMarshaller jsonStreamMarshaller =
047            new JsonStreamMarshaller(outputStream);
048        try
049        {
050          jsonStreamMarshaller.marshal(resource);
051        }
052        finally
053        {
054          jsonStreamMarshaller.close();
055        }
056      }
057    
058    
059    
060      /**
061       * {@inheritDoc}
062       */
063      public void marshal(final Resources<? extends BaseResource> response,
064                          final OutputStream outputStream)
065          throws SCIMException
066      {
067        final JsonStreamMarshaller jsonStreamMarshaller =
068            new JsonStreamMarshaller(outputStream);
069        try
070        {
071          jsonStreamMarshaller.marshal(response);
072        }
073        finally
074        {
075          jsonStreamMarshaller.close();
076        }
077      }
078    
079    
080    
081      /**
082       * {@inheritDoc}
083       */
084      public void marshal(final SCIMException response,
085                          final OutputStream outputStream)
086          throws SCIMException
087      {
088        final JsonStreamMarshaller jsonStreamMarshaller =
089            new JsonStreamMarshaller(outputStream);
090        try
091        {
092          jsonStreamMarshaller.marshal(response);
093        }
094        finally
095        {
096          jsonStreamMarshaller.close();
097        }
098      }
099    
100    
101    
102      /**
103       * {@inheritDoc}
104       */
105      public void bulkMarshal(final OutputStream outputStream,
106                              final int failOnErrors,
107                              final List<BulkOperation> operations)
108          throws SCIMException
109      {
110        final JsonStreamMarshaller jsonStreamMarshaller =
111            new JsonStreamMarshaller(outputStream);
112        try
113        {
114          // Figure out what schemas are referenced by the resources.
115          final Set<String> schemaURIs = new HashSet<String>();
116          for (final BulkOperation o : operations)
117          {
118            final BaseResource resource = o.getData();
119            if (resource != null)
120            {
121              schemaURIs.addAll(
122                  o.getData().getResourceDescriptor().getAttributeSchemas());
123            }
124          }
125    
126          jsonStreamMarshaller.writeBulkStart(failOnErrors, schemaURIs);
127          for (final BulkOperation o : operations)
128          {
129            jsonStreamMarshaller.writeBulkOperation(o);
130          }
131    
132          jsonStreamMarshaller.writeBulkFinish();
133        }
134        finally
135        {
136          jsonStreamMarshaller.close();
137        }
138      }
139    }