/* * Copyright 2014-2016 CyberVision, Inc. * * Licensed 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.kaaproject.kaa.server.control.service.log; import org.apache.avro.Schema; import org.kaaproject.kaa.common.dto.file.FileData; import org.kaaproject.kaa.server.common.log.shared.RecordWrapperSchemaGenerator; import org.kaaproject.kaa.server.control.service.sdk.JavaSdkGenerator; import org.kaaproject.kaa.server.control.service.sdk.SchemaUtil; import org.kaaproject.kaa.server.control.service.sdk.compiler.JavaDynamicBean; import org.kaaproject.kaa.server.control.service.sdk.compiler.JavaDynamicCompiler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.helpers.MessageFormatter; import java.io.ByteArrayOutputStream; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import javax.tools.JavaFileObject.Kind; public class RecordLibraryGenerator { private static final String LIBRARY_PREFIX = "kaa-record-lib-"; private static final String LIBRARY_NAME_PATTERN = LIBRARY_PREFIX + "l{}.jar"; private static final Logger LOG = LoggerFactory.getLogger(RecordLibraryGenerator.class); private RecordLibraryGenerator() { } /** * Generate record library. * * @param logSchemaVersion the log schema version * @param logSchema the log schema * @return the record structure library * @throws Exception the exception */ public static FileData generateRecordLibrary(int logSchemaVersion, String logSchema) throws Exception { final Schema recordWrapperSchema = RecordWrapperSchemaGenerator .generateRecordWrapperSchema(logSchema); Map<String, Schema> uniqueSchemas = SchemaUtil .getUniqueSchemasMap(Arrays.asList(recordWrapperSchema)); List<JavaDynamicBean> javaSources = JavaSdkGenerator .generateSchemaSources(recordWrapperSchema, uniqueSchemas); ByteArrayOutputStream libraryOutput = new ByteArrayOutputStream(); ZipOutputStream libraryFile = new ZipOutputStream(libraryOutput); JavaDynamicCompiler dynamicCompiler = new JavaDynamicCompiler(); dynamicCompiler.init(); for (JavaDynamicBean bean : javaSources) { LOG.debug("Compiling bean {} with source: {}", bean.getName(), bean.getCharContent(true)); } Collection<JavaDynamicBean> compiledObjects = dynamicCompiler.compile(javaSources); for (JavaDynamicBean compiledObject : compiledObjects) { String className = compiledObject.getName(); String classFileName = className.replace('.', '/') + Kind.CLASS.extension; ZipEntry classFile = new ZipEntry(classFileName); libraryFile.putNextEntry(classFile); libraryFile.write(compiledObject.getBytes()); libraryFile.closeEntry(); } libraryFile.close(); String libraryFileName = MessageFormatter.arrayFormat(LIBRARY_NAME_PATTERN, new Object[]{logSchemaVersion}).getMessage(); byte[] libraryData = libraryOutput.toByteArray(); FileData library = new FileData(); library.setFileName(libraryFileName); library.setFileData(libraryData); return library; } }