com.ponysdk.spring.ProxyBuilderGenerator.java Source code

Java tutorial

Introduction

Here is the source code for com.ponysdk.spring.ProxyBuilderGenerator.java

Source

/*
 * Copyright (c) 2011 PonySDK
 *  Owners:
 *  Luciano Broussal  <luciano.broussal AT gmail.com>
 *   Mathieu Barbier   <mathieu.barbier AT gmail.com>
 *   Nicolas Ciaravola <nicolas.ciaravola.pro AT gmail.com>
 *
 *  WebSite:
 *  http://code.google.com/p/pony-sdk/
 *
 * 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 com.ponysdk.spring;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import com.ponysdk.generator.BaseGenerator;
import com.ponysdk.generator.ClassWriter;
import com.ponysdk.generator.GeneratorHelper;
import com.ponysdk.generator.ObjectFactory;
import com.ponysdk.generator.Root;

public class ProxyBuilderGenerator extends BaseGenerator {

    private final List<Root> domains;

    private String srcGeneratedDirectory = "src-generated-application";

    private String packageName = "com.ponysdk.service";

    public static void main(final String[] args) {
        try {
            final List<Root> definitions = getDefinitions(args[0]);
            final ProxyBuilderGenerator generator = new ProxyBuilderGenerator(definitions);
            if (args.length >= 2)
                generator.setSrcGeneratedDirectory(args[1]);
            if (args.length >= 3)
                generator.setPackageName(args[2]);

            generator.generate();
        } catch (final Exception e) {
            e.printStackTrace();
        }
    }

    public static List<Root> getDefinitions(final String directories) throws JAXBException {
        final JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
        final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

        final List<Root> definitions = new ArrayList<Root>();

        final String[] split = directories.split(",");
        for (final String d : split) {

            final List<File> files = read(new File(d));
            for (final File file : files) {
                System.out.println("file = " + file);
                final Root root = (Root) unmarshaller.unmarshal(file);
                definitions.add(root);
            }
        }
        return definitions;
    }

    private static List<File> read(final File f) {
        final List<File> files = new ArrayList<File>();
        if (f.isDirectory()) {
            final File[] childs = f.listFiles();
            for (final File child : childs) {
                files.addAll(read(child));
            }
        } else {
            if (f.getName().endsWith(".pony.xml")) {
                files.add(f);
            }
        }
        return files;
    }

    public ProxyBuilderGenerator(final List<Root> domains) {
        this.domains = domains;
    }

    public void generate() throws Exception {
        final ClassWriter classWriter = new ClassWriter(this, getSrcGeneratedDirectory(), getPackageName(),
                "ProxyBuilder");
        classWriter.addImplements(ApplicationContextAware.class);
        classWriter.addNewLine();
        classWriter.addLine(
                "private static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ProxyBuilder.class);");

        classWriter.addLine("@Override");
        classWriter.addLine("public void setApplicationContext(" + ApplicationContext.class.getCanonicalName()
                + " context) throws " + BeansException.class.getCanonicalName() + " {");
        classWriter.addNewLine();

        for (final Root root : domains) {
            this.domain = root.getDomain();
            classWriter.addLine("try{");
            classWriter.indentBlock();
            classWriter.addLine("com.ponysdk.core.service.PonyServiceRegistry.registerPonyService(context.getBean("
                    + GeneratorHelper.getServiceFullClassName(domain) + ".class));");
            classWriter.unindentBlock();
            classWriter.addLine("}catch(org.springframework.beans.factory.NoSuchBeanDefinitionException e){");
            classWriter.indentBlock();
            classWriter.addLine("log.warn(\"No service defined for " + domain.getName() + "\");");
            classWriter.unindentBlock();
            classWriter.addLine("}");
            classWriter.addLine("catch(Exception e){");
            classWriter.indentBlock();
            classWriter.addLine("String errorMessage = \"Error when starting service " + domain.getName() + "\";");
            classWriter.addLine("log.error(errorMessage, e);");
            classWriter.addLine("throw new " + RuntimeException.class.getCanonicalName() + "(errorMessage, e);");

            classWriter.unindentBlock();
            classWriter.addLine("}");
        }
        classWriter.addLine("}");

        classWriter.generateContentAndStore();
    }

    public void setSrcGeneratedDirectory(final String srcGeneratedDirectory) {
        this.srcGeneratedDirectory = srcGeneratedDirectory;
    }

    public String getSrcGeneratedDirectory() {
        return srcGeneratedDirectory;
    }

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(final String packageName) {
        this.packageName = packageName;
    }
}