Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Freemarker, TrueZip и потоки ввода - вывода, Проблемка 
V
    Опции темы
jvoid
Дата 5.8.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2009

Репутация: нет
Всего: 1



Код

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import org.landax.server.DAO.FileExtend;
import org.landax.server.DAO.FileExtendDAO;
import de.schlichtherle.io.File;
import de.schlichtherle.io.FileOutputStream;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * класс предназначен для генерации офисных документов форматов odt, docx по шаблонам
 * шаблонный движок используется freemarker, для доступа к архивам библиотека truezip
 */
public class TemplateDrive {

    /**
     * @param variable набор переменных для подстановки шаблон, ключ- значение
     * @param templateFile файл шаблона
     * @param resultFile файл готового документа
     */
    public void doTemplate(HashMap<String, String> variable,
            String templateFile, String resultFile) {
        Configuration cfg = new Configuration();

        String encodingTemplate = new String();
        String fileExtendName = new String();

        // получаем расширение файла
        fileExtendName = new ExtendFile().getFileExtend(templateFile);

        // создаем сущность fileExtend она хранит информацию о кодировке и
        // целевом файле архива
        FileExtend fileExtend = new FileExtend();

        fileExtend = new FileExtendDAO().getExtend(fileExtendName);
        // получаем кодировку для файла
        encodingTemplate = fileExtend.getEncoding();

        fileExtend = new FileExtendDAO().getExtend(fileExtendName);

        // создаем и подключаем свой загрузчик шаблонов ZipTemplateLoader
        ZipTemplateLoader ztl = new ZipTemplateLoader(encodingTemplate,
                templateFile, fileExtend.getTemplate());
        cfg.setTemplateLoader(ztl);

        // копируем файл шаблона в папку готовых документов
        new File(templateFile).copyAllTo(new File(resultFile));
        Writer out = null;
        Template temp = null;
        try {
            temp = cfg.getTemplate(fileExtend.getTemplate(), encodingTemplate);
            // Writer out = new OutputStreamWriter(System.out);

            new File(templateFile).copyAllTo(new File(resultFile));
            out = new OutputStreamWriter(new FileOutputStream(resultFile + "/"
                    + fileExtend.getTemplate()), encodingTemplate);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

try{
        try {
            temp.process(variable, out);
            out.flush();
        } catch (TemplateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}finally {try {
    out.close();
            } catch (IOException e) {
        e.printStackTrace();
}} 
        try {
            Runtime.getRuntime().exec(
                    "cmd.exe /C start swriter -nologo " + resultFile);
        } catch (IOException e1) {
            e1.printStackTrace();
        }

    }

    public static void main(String[] args) {
        HashMap<String, String> root = new HashMap<String, String>();
        root.put("фамилия", "Зюганов");
        root.put("имя", "Вася");
         //new TemplateDrive().doTemplate(root, "1.docx", "2.docx");
        new TemplateDrive().doTemplate(root, "1.odt", "2.odt");
    }

}



Код

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;

import de.schlichtherle.io.FileInputStream;
import freemarker.cache.TemplateLoader;

public class ZipTemplateLoader implements TemplateLoader {
    private String encoding;
    private String TemplateFile;
    private String TemplateEntity;
    private FileInputStream inStream;
    private InputStreamReader isr;
    private BufferedReader bw;

    public ZipTemplateLoader(String encoding, String TemplateFile,
            String TemplateEntity) {
        this.encoding = encoding;
        this.TemplateFile = TemplateFile;
        this.TemplateEntity = TemplateEntity;
    }

    @Override
    public void closeTemplateSource(Object arg0) throws IOException {
        inStream.close();
        isr.close();
        bw.close();
    }

    @Override
    public Object findTemplateSource(String arg0) throws IOException {

        // TODO Auto-generated method stub
        return arg0;
    }

    @Override
    public long getLastModified(Object arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public Reader getReader(Object arg0, String arg1) throws IOException {
        inStream = new FileInputStream(TemplateFile + "/" + TemplateEntity);
        isr = new InputStreamReader(inStream, encoding);
        bw = new BufferedReader(isr);

        return bw;
    }

}


В общем все работает, но только как то странно, если я запускаю TemplateDrive из его mane, все проходит четко, а если из гуя приложения, то документ не создается, до тех пор пока я этот самый гуй не закрою, если закрою, сразу создается файл готового документа, запускаю из Eclipse никаких сообщений об ошибках не выдает. Как то можно бороться с таким безобразием? Очень не хочется на java.util.zip переписівать 

Это сообщение отредактировал(а) jvoid - 5.8.2010, 20:09
PM MAIL   Вверх
Mabramyan
Дата 6.8.2010, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 3.7.2007
Где: Алматы

Репутация: нет
Всего: нет



Не очень понятно, а где код гуя, те строки окуда вы вызываете методы? Возможно гуя модальная, если так, то код буде стопориться до тех пор, пока вы не закроете окно.

Например:

Код

System.out.println("Ждем пока не закроется окно");
modalForm.setVisible(true); //пока форма не скроется второе сообщение не выведется.
System.out.println("Второе сообщение, закрыли гую");

PM MAIL WWW   Вверх
jvoid
Дата 6.8.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2009

Репутация: нет
Всего: 1



Гуя вроде не модальная к тому же код при вызове doTemplate()  выполняется, файл, читается, копируется
Код

new File(templateFile).copyAllTo(new File(resultFile));

 все виснет где то на коде 
Код

try {
            try {
                temp.process(variable, out);
                out.flush();
            } catch (TemplateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } finally {
            try {
                out.close();
                                System.out.println("out.close();");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

Причем и System.out.println("out.close();"), который идет дальше отрабатывает, и как бы закрывает поток вывода, дальше запускается OpenOffice.  Получается поток не пишет в файл до закрытия приложения, не окна из которого он запускался, а главного окна приложения.  А начинает писать когда все уже закрыто и сам этот поток вроде как уже закрыт out.close(). 

Вот вызов гуи:
Код


public class TestZipGui extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JTextField jTextField = null;
    private JButton jButton = null;

    private JTextField getJTextField() {
        if (jTextField == null) {
            jTextField = new JTextField();
        }
        return jTextField;
    }

    private JButton getJButton() {
        if (jButton == null) {
            jButton = new JButton();
            jButton.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    System.out.println("actionPerformed()");
                    HashMap<String, String> root = new HashMap<String, String>();
                    root.put("фамилия", jTextField.getText());
                    new TemplateDrive().doTemplate(root, "1.odt", "2.odt");
                }
            });
        }
        return jButton;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                TestZipGui thisClass = new TestZipGui();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }

    public TestZipGui() {
        super();
        initialize();
    }

    private void initialize() {
        this.setSize(300, 200);
        this.setContentPane(getJContentPane());
        this.setTitle("JFrame");
    }

    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getJTextField(), BorderLayout.NORTH);
            jContentPane.add(getJButton(), BorderLayout.CENTER);
        }
        return jContentPane;
    }

} 



Это сообщение отредактировал(а) jvoid - 6.8.2010, 18:44
PM MAIL   Вверх
jvoid
Дата 10.8.2010, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2009

Репутация: нет
Всего: 1



Победил я таки это
код:
Код

out = new OutputStreamWriter(new FileOutputStream(resultFile + "/"
                    + fileExtend.getTemplate()), encodingTemplate);

нужно заменить на:
Код

File file = new File(resultFile + "/" + fileExtend.getTemplate());

            Writer out = new OutputStreamWriter(new FileOutputStream(file),
                    encodingTemplate);
out.flush();
            out.close();
            file.update();


И  все пошло как по маслу... Рекомендую всем TrueZip, удобно, позволяет работать с архивами как с каталогами.

Это сообщение отредактировал(а) jvoid - 10.8.2010, 19:09
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0899 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.