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    package org.kuali.rice.edl.impl;
017    
018    import org.junit.Test;
019    import org.kuali.rice.core.api.config.property.Config;
020    import org.kuali.rice.core.api.config.property.ConfigContext;
021    import org.kuali.rice.core.api.impex.xml.XmlIngestionException;
022    import org.kuali.rice.coreservice.api.style.Style;
023    import org.kuali.rice.coreservice.api.style.StyleService;
024    import org.kuali.rice.coreservice.api.CoreServiceApiServiceLocator;
025    import org.kuali.rice.edl.impl.bo.EDocLiteAssociation;
026    import org.kuali.rice.edl.impl.bo.EDocLiteDefinition;
027    import org.kuali.rice.edl.impl.service.EDocLiteService;
028    import org.kuali.rice.edl.impl.service.EdlServiceLocator;
029    import org.kuali.rice.kew.test.KEWTestCase;
030    import org.kuali.rice.kew.test.TestUtilities;
031    import org.kuali.rice.test.BaselineTestCase;
032    
033    import javax.xml.transform.Templates;
034    import java.io.ByteArrayInputStream;
035    import java.io.FileNotFoundException;
036    import java.util.List;
037    
038    import static org.junit.Assert.*;
039    
040    /**
041     * Tests EDocLiteServiceImpl
042     * @author Kuali Rice Team (rice.collab@kuali.org)
043     */
044    @BaselineTestCase.BaselineMode(BaselineTestCase.Mode.NONE)
045    public class EDocLiteServiceImplTest extends KEWTestCase {
046    
047            @Test public void testLoadXML() throws FileNotFoundException {
048            loadXmlFile("EDocLiteContent.xml");
049            loadXmlFile("edlstyle.xml");
050    
051            EDocLiteService edls = EdlServiceLocator.getEDocLiteService();
052            StyleService styleService = CoreServiceApiServiceLocator.getStyleService();
053            //edls.loadXml(new FileInputStream("conf/examples/xml/EDocLiteContent.xml"));
054            assertTrue("Definition not found", edls.getEDocLiteDefinitions().contains("profile"));
055            Style defaultStyle = styleService.getStyle("Default");
056            assertNotNull("Style not found", defaultStyle);
057            assertEquals(1, edls.getEDocLiteAssociations().size());
058            EDocLiteDefinition def = edls.getEDocLiteDefinition("profile");
059            assertNotNull("'profile' definition not found", def);
060            assertEquals("profile", def.getName());
061            assertNotNull(def.getActiveInd());
062            assertTrue(def.getActiveInd().booleanValue());
063            Style style = styleService.getStyle("Default");
064            assertNotNull("'Default' style not found", style);
065            assertEquals("Default", style.getName());
066            assertTrue(style.isActive());
067            assertNotNull(style.getXmlContent());
068        }
069    
070        @Test public void testLoadBadDefinition() throws FileNotFoundException {
071            EDocLiteService edls = EdlServiceLocator.getEDocLiteService();
072            try {
073                edls.loadXml(TestUtilities.loadResource(getClass(), "BadDefinition.xml"), null);
074                fail("BadDefinition was successfully parsed.");
075            } catch (XmlIngestionException re) {
076                // should probably use type system to detect type of error, not just message string...
077                // maybe we need general parsing or "semantic" validation exception
078                assertTrue("Wrong exception occurred", re.getMessage().contains("EDocLite definition contains references to non-existent attributes"));
079            }
080        }
081    
082        @Test public void testStoreDefinition() {
083            EDocLiteService edls = EdlServiceLocator.getEDocLiteService();
084            String defXml = "<edl></edl>";
085            try {
086                edls.saveEDocLiteDefinition(new ByteArrayInputStream(defXml.getBytes()));
087                fail("Storing edl with no name succeeded");
088            } catch (XmlIngestionException wsee) {
089                // expected due to lack of name
090            }
091            defXml = "<edl name=\"test\"></edl>";
092            edls.saveEDocLiteDefinition(new ByteArrayInputStream(defXml.getBytes()));
093            EDocLiteDefinition def = edls.getEDocLiteDefinition("test");
094            assertNotNull(def);
095            assertEquals("test", def.getName());
096        }
097    
098        @Test public void testStoreAssociation() {
099            EDocLiteService edls = EdlServiceLocator.getEDocLiteService();
100            String assocXml = "<association></association>";
101            try {
102                edls.saveEDocLiteAssociation(new ByteArrayInputStream(assocXml.getBytes()));
103                fail("Storing association with no docType succeeded");
104            } catch (XmlIngestionException wsee) {
105                // expected due to lack of doctype
106            }
107            assocXml = "<association><docType></docType></association>";
108            try {
109                edls.saveEDocLiteAssociation(new ByteArrayInputStream(assocXml.getBytes()));
110                fail("Storing association with empty docType succeeded");
111            } catch (XmlIngestionException wsee) {
112                // expected due to emtpy doctype value
113            }
114            assocXml = "<association><docType>foobar</docType></association>";
115            edls.saveEDocLiteAssociation(new ByteArrayInputStream(assocXml.getBytes()));
116            EDocLiteAssociation assoc = edls.getEDocLiteAssociation("foobar");
117            assertNull("Inactive Association was found", assoc);
118    
119            assocXml = "<association><docType>foobar</docType><active>true</active></association>";
120            edls.saveEDocLiteAssociation(new ByteArrayInputStream(assocXml.getBytes()));
121            assoc = edls.getEDocLiteAssociation("foobar");
122            assertNotNull("Association was not found", assoc);
123            assertEquals("foobar", assoc.getEdlName());
124            assertNull(assoc.getDefinition());
125            assertNull(assoc.getStyle());
126    
127            List<EDocLiteAssociation> assocs = edls.getEDocLiteAssociations();
128            assertEquals(1, assocs.size());
129            assoc = assocs.get(0);
130            assertEquals("foobar", assoc.getEdlName());
131            assertNull(assoc.getDefinition());
132            assertNull(assoc.getStyle());
133            assertNotNull(assoc.getActiveInd());
134            assertTrue(assoc.getActiveInd().booleanValue());
135    
136            assocXml = "<association><style>style name</style><definition>definition name</definition><docType>foobar</docType><active>true</active></association>";
137            edls.saveEDocLiteAssociation(new ByteArrayInputStream(assocXml.getBytes()));
138            assoc = edls.getEDocLiteAssociation("foobar");
139            assertNotNull("Association was not found", assoc);
140            assertEquals("foobar", assoc.getEdlName());
141            assertEquals("definition name", assoc.getDefinition());
142            assertEquals("style name", assoc.getStyle());
143    
144            assocs = edls.getEDocLiteAssociations();
145            assertEquals(1, assocs.size());
146            assoc = (EDocLiteAssociation) assocs.get(0);
147            assertNotNull("Association was not found", assoc);
148            assertEquals("foobar", assoc.getEdlName());
149            assertEquals("definition name", assoc.getDefinition());
150            assertEquals("style name", assoc.getStyle());
151            assertNotNull(assoc.getActiveInd());
152            assertTrue(assoc.getActiveInd().booleanValue());
153        }
154    
155        /**
156         * Tests the caching of "styles" in EDocLiteServiceImpl.
157         *
158         * The style cache is really a cache of java.xml.transform.Templates objects which represent
159         * the "compiled" stylesheets.
160         */
161        @Test public void testStyleCaching() throws Exception {
162            ConfigContext.getCurrentContextConfig().putProperty(Config.EDL_CONFIG_LOCATION, "classpath:org/kuali/rice/kew/edl/TestEDLConfig.xml");
163    
164            loadXmlFile("EDocLiteContent.xml");
165            loadXmlFile("edlstyle.xml");
166            loadXmlFile("widgets.xml");
167    
168            // try to grab the templates out of the cache, it shouldn't be cached yet
169    //        Templates cachedTemplates = new EDocLiteServiceImpl().fetchTemplatesFromCache("Default");
170    //        assertNull("The default style template should not be cached yet.", cachedTemplates);
171    
172            // fetch the Templates object from the service
173            EDocLiteAssociation association = EdlServiceLocator.getEDocLiteService().getEDocLiteAssociation("EDocLiteDocType");
174            assertNull("We should be using the Default style.", association.getStyle());
175            Templates templates = EdlServiceLocator.getEDocLiteService().getStyleAsTranslet(association.getStyle());
176            assertNotNull("Templates should not be null.", templates);
177    
178            // the Templates should now be cached
179    //        cachedTemplates = new EDocLiteServiceImpl().fetchTemplatesFromCache("Default");
180    //        assertNotNull("Templates should now be cached.", cachedTemplates);
181    
182    //        // the cached Templates should be the same as the Templates we fetched from the service
183    //        assertEquals("Templates should be the same.", templates, cachedTemplates);
184    
185            // now re-import the style and the templates should no longer be cached
186            loadXmlFile("edlstyle.xml");
187    //        cachedTemplates = new EDocLiteServiceImpl().fetchTemplatesFromCache("Default");
188    //        assertNull("After re-import, the Default style Templates should no longer be cached.", cachedTemplates);
189    
190            // re-fetch the templates from the service and verify they are in the cache
191            Templates newTemplates = EdlServiceLocator.getEDocLiteService().getStyleAsTranslet(association.getStyle());
192            assertNotNull("Templates should not be null.", templates);
193    //        cachedTemplates = new EDocLiteServiceImpl().fetchTemplatesFromCache("Default");
194    //        assertNotNull("Templates should now be cached.", cachedTemplates);
195    
196            // lastly, check that the newly cached templates are not the same as the original templates
197            assertFalse("Old Templates should be different from new Templates.", templates.equals(newTemplates));
198    
199        }
200    }