package com.iambookmaster.qsp; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import junit.framework.TestCase; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import com.iambookmaster.client.beans.ObjectBean; import com.iambookmaster.client.beans.Paragraph; import com.iambookmaster.client.beans.ParagraphConnection; import com.iambookmaster.client.common.JSONParser; import com.iambookmaster.client.editor.ModelPersist; import com.iambookmaster.client.exceptions.JSONException; import com.iambookmaster.client.locale.AppConstants; import com.iambookmaster.client.locale.AppMessages; import com.iambookmaster.client.model.Model; import com.iambookmaster.client.paragraph.BookCreator; import com.iambookmaster.client.paragraph.BookCreatorListener; import com.iambookmaster.client.paragraph.BookDecorator; import com.iambookmaster.server.LocalMessages; import com.iambookmaster.server.XMLModelParser; import com.iambookmaster.server.logic.QSPBookDecrator; public class QSPExportTest extends TestCase { protected AppConstants appConstants; protected AppMessages appMessages; private static String locale="ru"; private int contentCounter; public void test1() throws Exception { // perform("attack2attack"); // perform("attack2defence"); // perform("attack2attackWeak"); // perform("attack2defenceFatal"); // perform("attack2defenceFatalMax"); // perform("1round"); // perform("3npc"); // perform("Sprites"); // perform("Kererleys"); perform("Dragon"); } @Override protected void setUp() throws Exception { LocalMessages messages = new LocalMessages(); messages.initialize(locale); appConstants = LocalMessages.getInstance(AppConstants.class, locale); appMessages = LocalMessages.getInstance(AppMessages.class, locale); } public void perform(String name) throws Exception { Model model = createModelFromJSON(name+".xml"); ArrayList<Paragraph> list = model.getParagraphs(); Paragraph[] book = new Paragraph[list.size()]; for (Paragraph paragraph : list) { assertNotSame(paragraph.getNumber(),0); assertNull(book[paragraph.getNumber()-1]); book[paragraph.getNumber()-1]=paragraph; } BookCreator creator = new BookCreator(model); BookDecorator decrator = getBookDecorator(model); creator.createText(book, new BookCreatorListener(){ public void algorithmError(int code) { fail("algorithmError "+code); } public void allIterationsFailed() { fail("allIterationsFailed"); } public boolean checkTimiout() { return false; } public void iterationFailed(int fail, int total) { } public void noSupported() { fail("noSupported"); } public void numberNotSet(ObjectBean objectBean) { fail("numberNotSet in object: "+objectBean.getName()); } public void numberNotSet(Paragraph paragraph) { fail("numberNotSet in paragraph: "+paragraph.getName()); } public void numberTooLarge(Paragraph paragraph, int max) { fail("numberTooLarge in paragraph: "+paragraph.getName()); } public void numbersDuplicated(Paragraph paragraph,Paragraph paragraph2) { fail("numbersDuplicated in paragraphs: "+paragraph.getName()+" and "+paragraph2.getName()); } public void tooManyObjects() { fail("tooManyObjects"); } public void wrongObjectSecretKey(ParagraphConnection connection) { fail("wrongObjectSecretKey, object:"+connection.getObject().getName()+ " ("+connection.getObject().getKey()+") for connection from '"+ connection.getFrom().getName()+"' to '"+connection.getTo().getName()+"'"); } }, decrator); FileOutputStream fileWriter = getOutputStream(); try { fileWriter.write(decrator.toBytes()); } finally { fileWriter.close(); } } protected BookDecorator getBookDecorator(Model model) { return new QSPBookDecrator(model,appConstants,appMessages); } protected FileOutputStream getOutputStream() throws IOException { return new FileOutputStream("qsp/module.qsp"); } protected ModelPersist createModelFromJSON(String file) throws JSONException, ParserConfigurationException, SAXException, IOException { InputStream stream = getClass().getResourceAsStream(file); assertNotNull("Cannot load file "+file,stream); ModelPersist model; try { model = new ModelPersist(appConstants,appMessages); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(false); dbf.setNamespaceAware(false); DocumentBuilder db = dbf.newDocumentBuilder(); InputSource inputSource = new InputSource(stream); Document result = db.parse(inputSource); JSONParser parser = new XMLModelParser(); model.restore(result,parser); } finally { if (stream != null) { stream.close(); } } return model; } public String copyContent(String name, String source, String outpath) throws Exception { StringBuilder builder = new StringBuilder(source); builder.append(File.separator); builder.append(name); File file = new File(builder.toString()); if (file.exists()==false) { assertTrue(builder.append(" does not exist").toString(),file.exists()); } if (file.isFile()==false) { assertTrue(builder.append(" is not a file").toString(),file.isFile()); } File out = new File(outpath); if (out.exists()==false) { assertTrue("File does not exist "+outpath,out.exists()); } if (out.isDirectory()==false) { assertTrue("No a folder "+outpath,out.isDirectory()); } builder.setLength(0); builder.append(out.getAbsolutePath()); builder.append(File.separator); int l = builder.length(); builder.append('r'); builder.append(String.valueOf(contentCounter++)); int ext = name.lastIndexOf('.'); if (ext>0) { builder.append(name.substring(ext)); } out = new File(builder.toString()); copyFile(file, out); return builder.substring(l); } public static void copyFile(File in, File out) throws Exception { FileInputStream fis = new FileInputStream(in); FileOutputStream fos = new FileOutputStream(out); try { byte[] buf = new byte[1024]; int i = 0; while ((i = fis.read(buf)) != -1) { fos.write(buf, 0, i); } } catch (Exception e) { throw e; } finally { if (fis != null) fis.close(); if (fos != null) fos.close(); } } public static void clearFolder(String outputPath) { File folder = new File(outputPath); for (File file : folder.listFiles()) { file.delete(); } } }