content: /*
   * 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.
   */
  package org.apache.chemistry.opencmis.client.bindings.atompub;
  
  import java.io.ByteArrayInputStream;
  import java.io.ByteArrayOutputStream;
  import java.math.BigDecimal;
  import java.math.BigInteger;
  import java.util.Arrays;
  import java.util.List;
  
  import junit.framework.TestCase;
  
  import org.apache.chemistry.opencmis.client.bindings.spi.atompub.AtomEntryWriter;
  import org.apache.chemistry.opencmis.client.bindings.spi.atompub.AtomPubParser;
  import org.apache.chemistry.opencmis.client.bindings.spi.atompub.objects.AtomBase;
  import org.apache.chemistry.opencmis.client.bindings.spi.atompub.objects.AtomElement;
  import org.apache.chemistry.opencmis.client.bindings.spi.atompub.objects.AtomEntry;
  import org.apache.chemistry.opencmis.commons.PropertyIds;
  import org.apache.chemistry.opencmis.commons.data.ContentStream;
  import org.apache.chemistry.opencmis.commons.data.ObjectData;
  import org.apache.chemistry.opencmis.commons.data.PropertyData;
  import org.apache.chemistry.opencmis.commons.enums.CmisVersion;
  import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
  import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectDataImpl;
  import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertiesImpl;
  import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyDecimalImpl;
  import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIntegerImpl;
  import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyStringImpl;
  
  /**
   * Minimal test for AtomEntryWriter and AtomPubParser.
   */
  public class AtomParserTest extends TestCase {
  
      private static final byte[] CONTENT = "This is my test content!".getBytes();
      private static final String CONTENT_TYPE = "text/plain";
  
      public void testParser() throws Exception {
          ByteArrayOutputStream bao = new ByteArrayOutputStream();
  
          // set up an object
          PropertiesImpl properties = new PropertiesImpl();
  
          PropertyStringImpl propName = new PropertyStringImpl(PropertyIds.NAME, "TestName");
          properties.addProperty(propName);
  
          PropertyIntegerImpl propInt = new PropertyIntegerImpl("IntProp", Arrays.asList(new BigInteger[] {
                  BigInteger.valueOf(1), BigInteger.valueOf(2), BigInteger.valueOf(3) }));
          properties.addProperty(propInt);
  
          PropertyDecimalImpl propDec = new PropertyDecimalImpl("DecProp", new BigDecimal(
                  "3.14159253589793238462643383279502884197"
                          + "169399375105820974944592307816406286208998628034825342117067982148086513"));
          properties.addProperty(propDec);
  
          ObjectDataImpl object1 = new ObjectDataImpl();
          object1.setProperties(properties);
  
          // write the entry
          ContentStream contentStream = new ContentStreamImpl(null, BigInteger.valueOf(CONTENT.length), CONTENT_TYPE,
                  new ByteArrayInputStream(CONTENT));
          AtomEntryWriter aew = new AtomEntryWriter(object1, CmisVersion.CMIS_1_1, contentStream);
          aew.write(bao);
  
          byte[] entryContent = bao.toByteArray();
          assertTrue(entryContent.length > 0);
  
          // parse it
          AtomPubParser parser = new AtomPubParser(new ByteArrayInputStream(entryContent));
          parser.parse();
          AtomBase parseResult = parser.getResults();
  
          assertTrue(parseResult instanceof AtomEntry);
          AtomEntry entry = (AtomEntry) parseResult;
  
          assertNotNull(entry);
          assertFalse(entry.getElements().isEmpty());
  
          // find the object
          ObjectData object2 = null;
          for (AtomElement element : entry.getElements()) {
              if (element.getObject() instanceof ObjectData) {
                  assertNull(object2);
                  object2 = (ObjectData) element.getObject();
              }
          }
  
          assertNotNull(object2);
          assertNotNull(object2.getProperties());
  
          // compare properties
          for (PropertyData<?> property1 : object1.getProperties().getPropertyList()) {
              PropertyData<?> property2 = object2.getProperties().getProperties().get(property1.getId());
  
              assertNotNull(property2);
              assertEquals(property1, property2);
          }
      }
  
      protected void assertEquals(PropertyData<?> expected, PropertyData<?> actual) throws Exception {
          if (expected == null && actual == null) {
              return;
          }
  
          if (expected == null || actual == null) {
              fail("Property is null!");
          }
  
          assertEquals(expected.getId(), actual.getId());
          assertSame(expected.getClass(), actual.getClass());
  
          List<?> values1 = expected.getValues();
          assertNotNull(values1);
          assertFalse(values1.isEmpty());
  
          List<?> values2 = actual.getValues();
          assertNotNull(values2);
          assertFalse(values2.isEmpty());
  
          assertEquals(values1.size(), values2.size());
  
          for (int i = 0; i < values1.size(); i++) {
              assertEquals(values1.get(i), values2.get(i));
          }
      }
  }
  