001    /*
002     * Copyright 2005-2014 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package org.kuali.rice.krad.data.jpa;
018    
019    import org.eclipse.persistence.exceptions.DatabaseException;
020    import org.junit.Test;
021    import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
022    import org.kuali.rice.krad.service.KRADServiceLocator;
023    import org.kuali.rice.krad.test.KRADTestCase;
024    import org.kuali.rice.test.BaselineTestCase;
025    
026    import javax.persistence.Column;
027    import javax.persistence.Entity;
028    import javax.persistence.Id;
029    import javax.persistence.Table;
030    
031    import static org.junit.Assert.*;
032    
033    /**
034     * Tests the DisableVersion annotation.
035     *
036     * @author Kuali Rice Team (rice.collab@kuali.org)
037     */
038    @BaselineTestCase.BaselineMode(BaselineTestCase.Mode.CLEAR_DB) // no rollback so we can avoid transactional cache mucking up our results
039    public class DisableVersioningTest extends KRADTestCase {
040    
041        private DisableVersion createDisableVersion(String rndId, String propertyVal) {
042            return new DisableVersion(rndId, propertyVal, new Long(0));
043        }
044    
045        private DisableNoVersion createDisableNoVersion(String rndId, String propertyVal) {
046            return new DisableNoVersion(rndId, propertyVal);
047        }
048    
049        private DisableNoVersionRemoveMapping createDisableNoVersionRemoveMapping(String rndId, String propertyVal) {
050            return new DisableNoVersionRemoveMapping(rndId, propertyVal);
051        }
052    
053        private String getRandomId() {
054            String time = String.valueOf(System.currentTimeMillis());
055            return (time.substring(time.length() - 9));
056        }
057    
058        @Test
059        public void testDisableVersioning() {
060            // get a random value for our id
061            String rndId = getRandomId();
062            String property = "testPropertyValue";
063    
064            // persist to the datasource
065            KRADServiceLocator.getDataObjectService().save(createDisableVersion(rndId, property));
066            // retrieve the object back from the datasource
067            DisableVersion resultDV = KRADServiceLocator.getDataObjectService().find(DisableVersion.class, rndId);
068            // validate
069            assertNotNull("DisableVersion is null", resultDV);
070            assertEquals("DisableVersion id does not match given value", rndId, resultDV.getId());
071            assertEquals("DisableVersion property does not match given value", property, resultDV.getProperty());
072            assertEquals(new Long(0), resultDV.getVersionNumber());
073            // now set the version number to a value and make sure it persists properly
074            resultDV.setVersionNumber(new Long(50));
075            resultDV = KRADServiceLocator.getDataObjectService().save(resultDV);
076            assertEquals(new Long(50), resultDV.getVersionNumber());
077    
078            // now, since DisableNoVersion has no version number column, it should throw an exception when we attempt to
079            // persist it since there is no ver_nbr column in the database
080            try {
081                KRADServiceLocator.getDataObjectService().save(createDisableNoVersion(rndId, property));
082                fail("Database exception should have been thrown when saving with no version number column");
083            } catch (DatabaseException e) {}
084    
085            // DisableVersionRemoveMapping *should* work though because we are removing the VER_NBR column mapping which
086            // should help because we have no such column in the database
087            KRADServiceLocator.getDataObjectService().save(createDisableNoVersionRemoveMapping(rndId, property));
088            // retrieve the object back from the datasource
089            DisableNoVersionRemoveMapping resultDNV = KRADServiceLocator.getDataObjectService().find(DisableNoVersionRemoveMapping.class, rndId);
090            // validate
091            assertNotNull("DisableNoVersionRemoveMapping is null", resultDNV);
092            assertEquals("DisableNoVersionRemoveMapping id does not match given value", rndId, resultDNV.getId());
093            assertEquals("DisableNoVersionRemoveMapping property does not match given value", property, resultDNV.getProperty());
094    
095        }
096    
097        @Entity
098        @Table(name="KRTST_TEST_DISABLE_VER_T")
099        @DisableVersioning
100        public static class DisableVersion extends PersistableBusinessObjectBase {
101    
102            @Id
103            @Column(name="ID")
104            private String id;
105    
106            @Column(name="STR_PROP")
107            private String property;
108    
109            public DisableVersion() { }
110    
111            public DisableVersion(String id, String property, Long versionNumber) {
112                this.id = id;
113                this.property = property;
114                setVersionNumber(versionNumber);
115            }
116    
117            public String getId() {
118                return id;
119            }
120    
121            public void setId(String id) {
122                this.id = id;
123            }
124    
125            public String getProperty() {
126                return property;
127            }
128    
129            public void setProperty(String property) {
130                this.property = property;
131            }
132        }
133    
134        @Entity
135        @Table(name="KRTST_TEST_DISABLE_NO_VER_T")
136        @DisableVersioning
137        public static class DisableNoVersion extends PersistableBusinessObjectBase {
138    
139            @Id
140            @Column(name="ID")
141            private String id;
142    
143            @Column(name="STR_PROP")
144            private String property;
145    
146            public DisableNoVersion() { }
147    
148            public DisableNoVersion(String id, String property) {
149                this.id = id;
150                this.property = property;
151            }
152    
153            public String getId() {
154                return id;
155            }
156    
157            public void setId(String id) {
158                this.id = id;
159            }
160    
161            public String getProperty() {
162                return property;
163            }
164    
165            public void setProperty(String property) {
166                this.property = property;
167            }
168        }
169    
170        @Entity
171        @Table(name="KRTST_TEST_DISABLE_NO_VER_T")
172        @DisableVersioning
173        @RemoveMapping(name = "versionNumber")
174        public static class DisableNoVersionRemoveMapping extends PersistableBusinessObjectBase {
175    
176            @Id
177            @Column(name="ID")
178            private String id;
179    
180            @Column(name="STR_PROP")
181            private String property;
182    
183            public DisableNoVersionRemoveMapping() { }
184    
185            public DisableNoVersionRemoveMapping(String id, String property) {
186                this.id = id;
187                this.property = property;
188            }
189    
190            public String getId() {
191                return id;
192            }
193    
194            public void setId(String id) {
195                this.id = id;
196            }
197    
198            public String getProperty() {
199                return property;
200            }
201    
202            public void setProperty(String property) {
203                this.property = property;
204            }
205        }
206    }