/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.jboss.rest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javax.xml.stream.XMLStreamException;
import org.junit.Test;
import org.teiid.adminapi.Model.Type;
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.adminapi.impl.VDBMetadataParser;
import org.teiid.core.util.UnitTestUtil;
import org.teiid.deployers.CompositeVDB;
import org.teiid.deployers.TestCompositeVDB;
import org.teiid.metadata.MetadataFactory;
import org.teiid.metadata.MetadataStore;
import org.teiid.metadata.Schema;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.metadata.TransformationMetadata;
import org.teiid.query.parser.TestDDLParser;
import org.teiid.query.unittest.RealMetadataFactory;
import io.swagger.annotations.ApiOperation;
@SuppressWarnings("nls")
public class TestRestWebArchiveBuilder {
private static class ASMUtilities {
public static Class<?> defineClass(String name, byte[] bytes) {
return new TestClassLoader(TestClassLoader.class.getClassLoader()).defineClassForName(name, bytes);
}
private static class TestClassLoader extends ClassLoader {
public TestClassLoader(ClassLoader classLoader) {
super(classLoader);
}
public Class<?> defineClassForName(String name, byte[] data) {
return this.defineClass(name, data, 0, data.length);
}
}
}
private VDBMetaData getTestVDBMetaData() throws FileNotFoundException, XMLStreamException {
VDBMetaData vdb = VDBMetadataParser.unmarshell(new FileInputStream(UnitTestUtil.getTestDataFile("sample-vdb.xml")));
MetadataStore ms = new MetadataStore();
for (ModelMetaData model: vdb.getModelMetaDatas().values()) {
MetadataFactory mf = TestDDLParser.helpParse(model.getSchemaText(), model.getName());
ms.addSchema(mf.getSchema());
}
TransformationMetadata metadata = RealMetadataFactory.createTransformationMetadata(ms, "Rest");
vdb.addAttchment(QueryMetadataInterface.class, metadata);
vdb.addAttchment(TransformationMetadata.class, metadata);
vdb.addAttchment(MetadataStore.class, ms);
return vdb;
}
@Test
public void testBuildArchive() throws Exception {
VDBMetaData vdb = getTestVDBMetaData();
RestASMBasedWebArchiveBuilder builder = new RestASMBasedWebArchiveBuilder();
byte[] contents = builder.getContent(vdb);
ArrayList<String> files = new ArrayList<String>();
files.add("WEB-INF/web.xml");
files.add("WEB-INF/jboss-web.xml");
files.add("WEB-INF/classes/org/teiid/jboss/rest/View.class");
files.add("WEB-INF/classes/org/teiid/jboss/rest/TeiidRestApplication.class");
files.add("WEB-INF/classes/org/teiid/jboss/rest/Bootstrap.class");
files.add("META-INF/MANIFEST.MF");
files.add("api.html");
files.add("images/teiid_logo_450px.png");
files.add("swagger/swagger-ui.js");
files.add("swagger/css/print.css");
files.add("swagger/css/reset.css");
files.add("swagger/css/screen.css");
files.add("swagger/css/style.css");
files.add("swagger/css/typography.css");
files.add("swagger/images/favicon-16x16.png");
files.add("swagger/images/favicon-32x32.png");
files.add("swagger/lang/en.js");
files.add("swagger/lang/es.js");
files.add("swagger/lang/pt.js");
files.add("swagger/lang/ru.js");
files.add("swagger/lang/translator.js");
files.add("swagger/lib/backbone-min.js");
files.add("swagger/lib/handlebars-2.0.0.js");
files.add("swagger/lib/highlight.7.3.pack.js");
files.add("swagger/lib/jquery-1.8.0.min.js");
files.add("swagger/lib/jquery.ba-bbq.min.js");
files.add("swagger/lib/jquery.slideto.min.js");
files.add("swagger/lib/jquery.wiggle.min.js");
files.add("swagger/lib/marked.js");
files.add("swagger/lib/swagger-oauth.js");
files.add("swagger/lib/underscore-min.js");
files.add("swagger/lib/underscore-min.map");
ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(contents));
ZipEntry ze;
while ((ze = zipIn.getNextEntry()) != null) {
assertTrue(files.contains(ze.getName()));
zipIn.closeEntry();
}
}
@Test
public void testBuildArchiveSwagger() throws Exception {
VDBMetaData vdb = getTestVDBMetaData();
RestASMBasedWebArchiveBuilder builder = new RestASMBasedWebArchiveBuilder();
MetadataStore metadataStore = vdb.getAttachment(TransformationMetadata.class).getMetadataStore();
for (ModelMetaData model:vdb.getModelMetaDatas().values()) {
Schema schema = metadataStore.getSchema(model.getName());
byte[] viewContents = builder.getViewClass(vdb.getName(), vdb.getVersion(), model.getName(), schema, false);
if (viewContents != null){
Class<?> cls = ASMUtilities.defineClass("org.teiid.jboss.rest.View", viewContents);
Set<Annotation> annotationSet = new HashSet<Annotation>();
for(Annotation annotation : cls.getAnnotations()) {
annotationSet.add(annotation);
}
assertEquals(2, annotationSet.size());
for(Method m : cls.getMethods()){
if(m.getName().equals("g1Tableapplication_xml")){
ApiOperation annotation = m.getAnnotation(ApiOperation.class);
assertEquals("g1Table", annotation.value());
} else if(m.getName().equals("sqlQueryxml")){
ApiOperation annotation = m.getAnnotation(ApiOperation.class);
assertEquals("xml", annotation.value());
} else if(m.getName().equals("sqlQueryjson")){
ApiOperation annotation = m.getAnnotation(ApiOperation.class);
assertEquals("json", annotation.value());
}
}
}
}
}
@Test
public void testBootstrapServletClass() throws InstantiationException, IllegalAccessException {
RestASMBasedWebArchiveBuilder builder = new RestASMBasedWebArchiveBuilder();
byte[] bytes = builder.getBootstrapServletClass("vdbName", "", "version", new String[]{"http"}, "baseUrl", "packages", true);
Class<?> cls = ASMUtilities.defineClass("org.teiid.jboss.rest.Bootstrap", bytes);
Object obj = cls.newInstance();
assertEquals(cls, obj.getClass());
}
@Test
public void testOtherModels() throws Exception {
MetadataStore ms = new MetadataStore();
CompositeVDB vdb = TestCompositeVDB.createCompositeVDB(ms, "x");
vdb.getVDB().addProperty("{http://teiid.org/rest}auto-generate", "true");
ModelMetaData model = new ModelMetaData();
model.setName("other");
model.setModelType(Type.OTHER);
vdb.getVDB().addModel(model);
RestASMBasedWebArchiveBuilder builder = new RestASMBasedWebArchiveBuilder();
builder.getContent(vdb.getVDB());
}
}