/** * 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.isis.schema.utils; import java.io.CharArrayReader; import java.io.CharArrayWriter; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Timestamp; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.UUID; import org.hamcrest.Matchers; import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.joda.time.LocalDateTime; import org.joda.time.LocalTime; import org.junit.Test; import org.apache.isis.applib.services.bookmark.Bookmark; import org.apache.isis.schema.cmd.v1.ParamDto; import org.apache.isis.schema.common.v1.InteractionType; import org.apache.isis.schema.common.v1.OidDto; import org.apache.isis.schema.common.v1.ValueType; import org.apache.isis.schema.common.v1.ValueWithTypeDto; import org.apache.isis.schema.ixn.v1.ActionInvocationDto; import org.apache.isis.schema.ixn.v1.InteractionDto; import org.apache.isis.schema.ixn.v1.MemberExecutionDto; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; public class Roundtrip { private static InteractionDto newInteractionDtoWithActionInvocation( final String transactionId, final int sequence, final Bookmark targetBookmark, final String targetTitle, final String actionIdentifier, final List<ParamDto> parameterDtos, final String user) { final MemberExecutionDto executionDto = InteractionDtoUtils.newActionInvocation( sequence, targetBookmark, targetTitle, actionIdentifier, parameterDtos, user); final InteractionDto interactionDto = new InteractionDto(); interactionDto.setMajorVersion("1"); interactionDto.setMinorVersion("0"); interactionDto.setTransactionId(transactionId); interactionDto.setExecution(executionDto); executionDto.setInteractionType(InteractionType.ACTION_INVOCATION); return interactionDto; } @Test public void happyCase() throws Exception { // given final Timestamp startedAt = new Timestamp(new Date().getTime()); final Timestamp completedAt = new Timestamp(startedAt.getTime() + 1000); final ValueWithTypeDto returnDto = new ValueWithTypeDto(); returnDto.setType(ValueType.BOOLEAN); returnDto.setNull(true); final InteractionDto interactionDto = newInteractionDtoWithActionInvocation( UUID.randomUUID().toString(), 1, new Bookmark("CUS", "12345"), "John Customer", "com.mycompany.Customer#placeOrder", Arrays.<ParamDto>asList(), "freddyUser" ); InteractionDtoUtils.addParamArg(interactionDto, "aString", String.class, "Fred", null); InteractionDtoUtils.addParamArg(interactionDto, "nullString", String.class, (String) null, null); InteractionDtoUtils.addParamArg(interactionDto, "aByte", Byte.class, (Byte) (byte) 123, null); InteractionDtoUtils.addParamArg(interactionDto, "nullByte", Byte.class, (Byte) null, null); InteractionDtoUtils.addParamArg(interactionDto, "aShort", Short.class, (Short) (short) 32123, null); InteractionDtoUtils.addParamArg(interactionDto, "nullShort", Short.class, (Short) null, null); InteractionDtoUtils.addParamArg(interactionDto, "anInt", Integer.class, 123454321, null); InteractionDtoUtils.addParamArg(interactionDto, "nullInt", Integer.class, (Integer) null, null); InteractionDtoUtils.addParamArg(interactionDto, "aLong", Long.class, 1234567654321L, null); InteractionDtoUtils.addParamArg(interactionDto, "nullLong", Long.class, (Long) null, null); InteractionDtoUtils.addParamArg(interactionDto, "aFloat", Float.class, 12345.6789F, null); InteractionDtoUtils.addParamArg(interactionDto, "nullFloat", Float.class, (Float) null, null); InteractionDtoUtils.addParamArg(interactionDto, "aDouble", Double.class, 12345678.90123, null); InteractionDtoUtils.addParamArg(interactionDto, "nullDouble", Double.class, (Double) null, null); InteractionDtoUtils.addParamArg(interactionDto, "aBoolean", Boolean.class, true, null); InteractionDtoUtils.addParamArg(interactionDto, "nullBoolean", Boolean.class, (Boolean) null, null); InteractionDtoUtils.addParamArg(interactionDto, "aChar", Character.class, 'x', null); InteractionDtoUtils.addParamArg(interactionDto, "nullChar", Character.class, (Character) null, null); InteractionDtoUtils.addParamArg(interactionDto, "aBigInteger", java.math.BigInteger.class, new java.math.BigInteger("12345678901234567890"), null); InteractionDtoUtils .addParamArg(interactionDto, "nullBigInteger", java.math.BigInteger.class, (java.math.BigInteger) null, null); InteractionDtoUtils.addParamArg(interactionDto, "aBigDecimal", java.math.BigDecimal.class, new java.math.BigDecimal("12345678901234567890"), null); InteractionDtoUtils .addParamArg(interactionDto, "nullBigDecimal", java.math.BigDecimal.class, (java.math.BigDecimal) null, null); InteractionDtoUtils .addParamArg(interactionDto, "aJodaDateTime", org.joda.time.DateTime.class, new org.joda.time.DateTime(2015, 5, 23, 9, 54, 1), null); InteractionDtoUtils .addParamArg(interactionDto, "nullJodaDateTime", org.joda.time.DateTime.class, (org.joda.time.DateTime) null, null); InteractionDtoUtils .addParamArg(interactionDto, "aJodaLocalDate", org.joda.time.LocalDate.class, new org.joda.time.LocalDate(2015, 5, 23), null); InteractionDtoUtils.addParamArg(interactionDto, "nullJodaLocalDate", org.joda.time.LocalDate.class, (org.joda.time.LocalDate) null, null); InteractionDtoUtils.addParamArg(interactionDto, "aJodaLocalDateTime", org.joda.time.LocalDateTime.class, new org.joda.time.LocalDateTime(2015, 5, 23, 9, 54, 1), null); InteractionDtoUtils.addParamArg(interactionDto, "nullJodaLocalDateTime", org.joda.time.LocalDateTime.class, (org.joda.time.LocalDateTime) null, null); InteractionDtoUtils .addParamArg(interactionDto, "aJodaLocalTime", org.joda.time.LocalTime.class, new org.joda.time.LocalTime(9, 54, 1), null); InteractionDtoUtils.addParamArg(interactionDto, "nullJodaLocalTime", org.joda.time.LocalTime.class, (org.joda.time.LocalTime) null, null); InteractionDtoUtils.addParamArg(interactionDto, "aReference", null, new Bookmark("ORD", "12345"), null); InteractionDtoUtils.addParamArg(interactionDto, "nullReference", null, null, null); // when final CharArrayWriter caw = new CharArrayWriter(); InteractionDtoUtils.toXml(interactionDto, caw); InteractionDtoUtils.dump(interactionDto, System.out); final CharArrayReader reader = new CharArrayReader(caw.toCharArray()); final InteractionDto recreated = InteractionDtoUtils.fromXml(reader); // then assertThat(recreated.getExecution().getMemberIdentifier(), Matchers.is(interactionDto.getExecution().getMemberIdentifier())); assertThat(recreated.getExecution().getTarget().getType(), Matchers.is(interactionDto.getExecution().getTarget().getType())); assertThat(recreated.getExecution().getTarget().getId(), Matchers.is(interactionDto.getExecution().getTarget().getId())); final ActionInvocationDto invocationDto = (ActionInvocationDto) recreated.getExecution(); int param = 0; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aString")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.STRING)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, String.class), is("Fred")); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullString")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.STRING)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, String.class), is(nullValue())); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aByte")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.BYTE)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, Byte.class), is((byte) 123)); param++; assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.BYTE)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullByte")); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aShort")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.SHORT)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, Short.class), is((short) 32123)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullShort")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.SHORT)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("anInt")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.INT)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, int.class), is((int) 123454321)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullInt")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.INT)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aLong")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.LONG)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, long.class), is((long) 1234567654321L)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullLong")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.LONG)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aFloat")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.FLOAT)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, float.class), is((float) 12345.6789F)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullFloat")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.FLOAT)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aDouble")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.DOUBLE)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, double.class), is(12345678.90123)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullDouble")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.DOUBLE)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aBoolean")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.BOOLEAN)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, boolean.class), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullBoolean")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.BOOLEAN)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aChar")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.CHAR)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, char.class), is('x')); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullChar")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.CHAR)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aBigInteger")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.BIG_INTEGER)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, BigInteger.class), is(new java.math.BigInteger("12345678901234567890"))); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullBigInteger")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.BIG_INTEGER)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aBigDecimal")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.BIG_DECIMAL)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, BigDecimal.class), is(new java.math.BigDecimal("12345678901234567890"))); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullBigDecimal")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.BIG_DECIMAL)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aJodaDateTime")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_DATE_TIME)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); // bit hacky... regular comparison fails but toString() works... must be some additional data that differs, not sure what tho' assertThat( InteractionDtoUtils.getParameterArgValue(invocationDto, param, DateTime.class).toString(), is(new DateTime(2015, 5, 23, 9, 54, 1).toString())); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullJodaDateTime")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_DATE_TIME)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true));; param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aJodaLocalDate")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_LOCAL_DATE)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); final LocalDate actual = InteractionDtoUtils.getParameterArgValue(invocationDto, param, LocalDate.class); final LocalDate expected = new LocalDate(2015, 5, 23); assertThat(actual, equalTo(expected)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullJodaLocalDate")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_LOCAL_DATE)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aJodaLocalDateTime")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_LOCAL_DATE_TIME)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, LocalDateTime.class), is(new org.joda.time.LocalDateTime(2015, 5, 23, 9, 54, 1))); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullJodaLocalDateTime")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_LOCAL_DATE_TIME)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aJodaLocalTime")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_LOCAL_TIME)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat( InteractionDtoUtils.getParameterArgValue(invocationDto, param, LocalTime.class), is(new org.joda.time.LocalTime(9, 54, 1))); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullJodaLocalTime")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_LOCAL_TIME)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aReference")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.REFERENCE)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false)); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, OidDto.class).getType(), is("ORD")); assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, OidDto.class).getId(), is("12345")); param++; assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullReference")); assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.REFERENCE)); assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true)); param++; // final int expected = param; // assertThat(recreated.getParameters().getNum(), is(expected); // assertThat(recreated.getParameters().getParam().size(), is(expected); // assertThat(ActionInvocationMementoDtoUtils.getNumberOfParameters(recreated), is(expected); } }