Révision 2406
tmp/org.txm.jodconverter.core/src/test/java/org/artofsolving/jodconverter/OfficeDocumentConverterFunctionalTest.java (revision 2406) | ||
---|---|---|
27 | 27 |
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration; |
28 | 28 |
import org.testng.annotations.Test; |
29 | 29 |
|
30 |
@Test(groups="functional")
|
|
30 |
@Test(groups = "functional")
|
|
31 | 31 |
public class OfficeDocumentConverterFunctionalTest { |
32 |
|
|
33 |
public void runAllPossibleConversions() throws IOException { |
|
34 |
OfficeManager officeManager = new DefaultOfficeManagerConfiguration().buildOfficeManager(); |
|
35 |
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager); |
|
36 |
DocumentFormatRegistry formatRegistry = converter.getFormatRegistry(); |
|
37 |
|
|
38 |
officeManager.start(); |
|
39 |
try { |
|
40 |
File dir = new File("src/test/resources/documents"); |
|
41 |
File[] files = dir.listFiles(new FilenameFilter() { |
|
42 |
public boolean accept(File dir, String name) { |
|
43 |
return !name.startsWith("."); |
|
44 |
} |
|
45 |
}); |
|
32 |
|
|
33 |
public void runAllPossibleConversions() throws IOException { |
|
34 |
OfficeManager officeManager = new DefaultOfficeManagerConfiguration().buildOfficeManager(); |
|
35 |
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager); |
|
36 |
DocumentFormatRegistry formatRegistry = converter.getFormatRegistry(); |
|
37 |
|
|
38 |
officeManager.start(); |
|
39 |
try { |
|
40 |
File dir = new File("src/test/resources/documents"); |
|
41 |
File[] files = dir.listFiles(new FilenameFilter() { |
|
42 |
|
|
43 |
public boolean accept(File dir, String name) { |
|
44 |
return !name.startsWith("."); |
|
45 |
} |
|
46 |
}); |
|
46 | 47 |
for (File inputFile : files) { |
47 |
String inputExtension = FilenameUtils.getExtension(inputFile.getName()); |
|
48 |
DocumentFormat inputFormat = formatRegistry.getFormatByExtension(inputExtension); |
|
49 |
assertNotNull(inputFormat, "unknown input format: " + inputExtension); |
|
50 |
Set<DocumentFormat> outputFormats = formatRegistry.getOutputFormats(inputFormat.getInputFamily()); |
|
51 |
for (DocumentFormat outputFormat : outputFormats) { |
|
52 |
File outputFile = File.createTempFile("test", "." + outputFormat.getExtension()); |
|
53 |
outputFile.deleteOnExit(); |
|
54 |
System.out.printf("-- converting %s to %s... ", inputFormat.getExtension(), outputFormat.getExtension()); |
|
55 |
converter.convert(inputFile, outputFile, outputFormat); |
|
56 |
System.out.printf("done.\n"); |
|
57 |
assertTrue(outputFile.isFile() && outputFile.length() > 0); |
|
58 |
//TODO use file detection to make sure outputFile is in the expected format |
|
59 |
} |
|
60 |
} |
|
61 |
} finally { |
|
62 |
officeManager.stop(); |
|
63 |
} |
|
64 |
} |
|
65 |
|
|
48 |
String inputExtension = FilenameUtils.getExtension(inputFile.getName()); |
|
49 |
DocumentFormat inputFormat = formatRegistry.getFormatByExtension(inputExtension); |
|
50 |
assertNotNull(inputFormat, "unknown input format: " + inputExtension); |
|
51 |
Set<DocumentFormat> outputFormats = formatRegistry.getOutputFormats(inputFormat.getInputFamily()); |
|
52 |
for (DocumentFormat outputFormat : outputFormats) { |
|
53 |
File outputFile = File.createTempFile("test", "." + outputFormat.getExtension()); |
|
54 |
outputFile.deleteOnExit(); |
|
55 |
System.out.printf("-- converting %s to %s... ", inputFormat.getExtension(), outputFormat.getExtension()); |
|
56 |
converter.convert(inputFile, outputFile, outputFormat); |
|
57 |
System.out.printf("done.\n"); |
|
58 |
assertTrue(outputFile.isFile() && outputFile.length() > 0); |
|
59 |
// TODO use file detection to make sure outputFile is in the expected format |
|
60 |
} |
|
61 |
} |
|
62 |
} |
|
63 |
finally { |
|
64 |
officeManager.stop(); |
|
65 |
} |
|
66 |
} |
|
67 |
|
|
66 | 68 |
} |
tmp/org.txm.jodconverter.core/src/test/java/org/artofsolving/jodconverter/ReflectionUtils.java (revision 2406) | ||
---|---|---|
15 | 15 |
import java.lang.reflect.Field; |
16 | 16 |
|
17 | 17 |
public class ReflectionUtils { |
18 |
|
|
19 |
private ReflectionUtils() {
|
|
20 |
throw new AssertionError("utility class must not be instantiated");
|
|
21 |
}
|
|
22 |
|
|
23 |
public static Object getPrivateField(Object instance, String fieldName) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
|
|
24 |
return getPrivateField(instance.getClass(), instance, fieldName);
|
|
25 |
}
|
|
26 |
|
|
27 |
public static Object getPrivateField(Class<?> type, Object instance, String fieldName) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
|
|
28 |
Field field = type.getDeclaredField(fieldName);
|
|
29 |
field.setAccessible(true);
|
|
30 |
return field.get(instance);
|
|
31 |
}
|
|
32 |
|
|
18 |
|
|
19 |
private ReflectionUtils() {
|
|
20 |
throw new AssertionError("utility class must not be instantiated");
|
|
21 |
}
|
|
22 |
|
|
23 |
public static Object getPrivateField(Object instance, String fieldName) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
|
|
24 |
return getPrivateField(instance.getClass(), instance, fieldName);
|
|
25 |
}
|
|
26 |
|
|
27 |
public static Object getPrivateField(Class<?> type, Object instance, String fieldName) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
|
|
28 |
Field field = type.getDeclaredField(fieldName);
|
|
29 |
field.setAccessible(true);
|
|
30 |
return field.get(instance);
|
|
31 |
}
|
|
32 |
|
|
33 | 33 |
} |
tmp/org.txm.jodconverter.core/src/test/java/org/artofsolving/jodconverter/office/MockOfficeTask.java (revision 2406) | ||
---|---|---|
24 | 24 |
import com.sun.star.util.XCloseable; |
25 | 25 |
|
26 | 26 |
public class MockOfficeTask implements OfficeTask { |
27 |
|
|
28 |
private long delayTime = 0L; |
|
29 |
|
|
30 |
private boolean completed = false; |
|
31 |
|
|
32 |
public MockOfficeTask() { |
|
33 |
// default |
|
34 |
} |
|
35 |
|
|
36 |
public MockOfficeTask(long delayTime) { |
|
37 |
this.delayTime = delayTime; |
|
38 |
} |
|
39 |
|
|
40 |
public void execute(OfficeContext context) throws OfficeException { |
|
41 |
XComponentLoader loader = cast(XComponentLoader.class, context.getService(SERVICE_DESKTOP)); |
|
42 |
assert loader != null : "desktop object is null"; |
|
43 |
try { |
|
44 |
PropertyValue[] arguments = new PropertyValue[] { property("Hidden", true) }; |
|
45 |
XComponent document = loader.loadComponentFromURL("private:factory/swriter", "_blank", 0, arguments); |
|
46 |
if (delayTime > 0) { |
|
47 |
Thread.sleep(delayTime); |
|
48 |
} |
|
49 |
cast(XCloseable.class, document).close(true); |
|
50 |
completed = true; |
|
51 |
} catch (Exception exception) { |
|
52 |
throw new OfficeException("failed to create document", exception); |
|
53 |
} |
|
54 |
} |
|
55 |
|
|
56 |
public boolean isCompleted() { |
|
57 |
return completed; |
|
58 |
} |
|
59 |
|
|
27 |
|
|
28 |
private long delayTime = 0L; |
|
29 |
|
|
30 |
private boolean completed = false; |
|
31 |
|
|
32 |
public MockOfficeTask() { |
|
33 |
// default |
|
34 |
} |
|
35 |
|
|
36 |
public MockOfficeTask(long delayTime) { |
|
37 |
this.delayTime = delayTime; |
|
38 |
} |
|
39 |
|
|
40 |
public void execute(OfficeContext context) throws OfficeException { |
|
41 |
XComponentLoader loader = cast(XComponentLoader.class, context.getService(SERVICE_DESKTOP)); |
|
42 |
assert loader != null : "desktop object is null"; |
|
43 |
try { |
|
44 |
PropertyValue[] arguments = new PropertyValue[] { property("Hidden", true) }; |
|
45 |
XComponent document = loader.loadComponentFromURL("private:factory/swriter", "_blank", 0, arguments); |
|
46 |
if (delayTime > 0) { |
|
47 |
Thread.sleep(delayTime); |
|
48 |
} |
|
49 |
cast(XCloseable.class, document).close(true); |
|
50 |
completed = true; |
|
51 |
} |
|
52 |
catch (Exception exception) { |
|
53 |
throw new OfficeException("failed to create document", exception); |
|
54 |
} |
|
55 |
} |
|
56 |
|
|
57 |
public boolean isCompleted() { |
|
58 |
return completed; |
|
59 |
} |
|
60 |
|
|
60 | 61 |
} |
tmp/org.txm.jodconverter.core/src/test/java/org/artofsolving/jodconverter/office/ExternalOfficeManagerTest.java (revision 2406) | ||
---|---|---|
20 | 20 |
import org.artofsolving.jodconverter.process.PureJavaProcessManager; |
21 | 21 |
import org.testng.annotations.Test; |
22 | 22 |
|
23 |
@Test(groups="integration")
|
|
23 |
@Test(groups = "integration")
|
|
24 | 24 |
public class ExternalOfficeManagerTest { |
25 |
|
|
26 |
public void executeTask() throws Exception {
|
|
27 |
UnoUrl unoUrl = UnoUrl.socket(2002);
|
|
28 |
OfficeProcess officeProcess = new OfficeProcess(OfficeUtils.getDefaultOfficeHome(), unoUrl,
|
|
29 |
null, null, new File(System.getProperty("java.io.tmpdir")), new PureJavaProcessManager());
|
|
30 |
officeProcess.start();
|
|
31 |
Thread.sleep(2000);
|
|
32 |
Integer exitCode = officeProcess.getExitCode();
|
|
33 |
if (exitCode != null && exitCode.equals(Integer.valueOf(81))) {
|
|
34 |
officeProcess.start(true);
|
|
35 |
Thread.sleep(2000);
|
|
36 |
}
|
|
37 |
|
|
38 |
ExternalOfficeManager manager = new ExternalOfficeManager(unoUrl, true);
|
|
39 |
manager.start();
|
|
40 |
|
|
41 |
MockOfficeTask task = new MockOfficeTask();
|
|
42 |
manager.execute(task);
|
|
43 |
assertTrue(task.isCompleted());
|
|
44 |
|
|
45 |
manager.stop();
|
|
46 |
//TODO replace when OfficeProcess has a forciblyTerminate()
|
|
47 |
Process process = (Process) ReflectionUtils.getPrivateField(officeProcess, "process");
|
|
48 |
process.destroy();
|
|
49 |
}
|
|
50 |
|
|
51 |
//TODO test auto-reconnection
|
|
52 |
|
|
25 |
|
|
26 |
public void executeTask() throws Exception {
|
|
27 |
UnoUrl unoUrl = UnoUrl.socket(2002);
|
|
28 |
OfficeProcess officeProcess = new OfficeProcess(OfficeUtils.getDefaultOfficeHome(), unoUrl,
|
|
29 |
null, null, new File(System.getProperty("java.io.tmpdir")), new PureJavaProcessManager());
|
|
30 |
officeProcess.start();
|
|
31 |
Thread.sleep(2000);
|
|
32 |
Integer exitCode = officeProcess.getExitCode();
|
|
33 |
if (exitCode != null && exitCode.equals(Integer.valueOf(81))) {
|
|
34 |
officeProcess.start(true);
|
|
35 |
Thread.sleep(2000);
|
|
36 |
}
|
|
37 |
|
|
38 |
ExternalOfficeManager manager = new ExternalOfficeManager(unoUrl, true);
|
|
39 |
manager.start();
|
|
40 |
|
|
41 |
MockOfficeTask task = new MockOfficeTask();
|
|
42 |
manager.execute(task);
|
|
43 |
assertTrue(task.isCompleted());
|
|
44 |
|
|
45 |
manager.stop();
|
|
46 |
// TODO replace when OfficeProcess has a forciblyTerminate()
|
|
47 |
Process process = (Process) ReflectionUtils.getPrivateField(officeProcess, "process");
|
|
48 |
process.destroy();
|
|
49 |
}
|
|
50 |
|
|
51 |
// TODO test auto-reconnection
|
|
52 |
|
|
53 | 53 |
} |
tmp/org.txm.jodconverter.core/src/test/java/org/artofsolving/jodconverter/office/PooledOfficeManagerTest.java (revision 2406) | ||
---|---|---|
21 | 21 |
import java.util.concurrent.CancellationException; |
22 | 22 |
import java.util.concurrent.TimeoutException; |
23 | 23 |
|
24 |
|
|
25 | 24 |
import org.artofsolving.jodconverter.ReflectionUtils; |
26 | 25 |
import org.artofsolving.jodconverter.office.ManagedOfficeProcess; |
27 | 26 |
import org.artofsolving.jodconverter.office.PooledOfficeManager; |
... | ... | |
32 | 31 |
import org.artofsolving.jodconverter.office.OfficeProcess; |
33 | 32 |
import org.testng.annotations.Test; |
34 | 33 |
|
35 |
@Test(groups="integration")
|
|
34 |
@Test(groups = "integration")
|
|
36 | 35 |
public class PooledOfficeManagerTest { |
37 |
|
|
38 |
private static final UnoUrl CONNECTION_MODE = UnoUrl.socket(2002); |
|
39 |
private static final long RESTART_WAIT_TIME = 2 * 1000; |
|
40 |
|
|
41 |
public void executeTask() throws Exception { |
|
42 |
PooledOfficeManager officeManager = new PooledOfficeManager(CONNECTION_MODE); |
|
43 |
ManagedOfficeProcess managedOfficeProcess = (ManagedOfficeProcess) ReflectionUtils.getPrivateField(officeManager, "managedOfficeProcess"); |
|
44 |
OfficeProcess process = (OfficeProcess) ReflectionUtils.getPrivateField(managedOfficeProcess, "process"); |
|
45 |
OfficeConnection connection = (OfficeConnection) ReflectionUtils.getPrivateField(managedOfficeProcess, "connection"); |
|
46 |
|
|
47 |
officeManager.start(); |
|
48 |
assertTrue(process.isRunning()); |
|
49 |
assertTrue(connection.isConnected()); |
|
50 |
|
|
51 |
MockOfficeTask task = new MockOfficeTask(); |
|
52 |
officeManager.execute(task); |
|
53 |
assertTrue(task.isCompleted()); |
|
54 |
|
|
55 |
officeManager.stop(); |
|
56 |
assertFalse(connection.isConnected()); |
|
57 |
assertFalse(process.isRunning()); |
|
58 |
assertEquals(process.getExitCode(0, 0), 0); |
|
59 |
} |
|
60 |
|
|
61 |
public void restartAfterCrash() throws Exception { |
|
62 |
final PooledOfficeManager officeManager = new PooledOfficeManager(CONNECTION_MODE); |
|
63 |
ManagedOfficeProcess managedOfficeProcess = (ManagedOfficeProcess) ReflectionUtils.getPrivateField(officeManager, "managedOfficeProcess"); |
|
64 |
OfficeProcess process = (OfficeProcess) ReflectionUtils.getPrivateField(managedOfficeProcess, "process"); |
|
65 |
OfficeConnection connection = (OfficeConnection) ReflectionUtils.getPrivateField(managedOfficeProcess, "connection"); |
|
66 |
assertNotNull(connection); |
|
67 |
|
|
68 |
officeManager.start(); |
|
69 |
assertTrue(process.isRunning()); |
|
70 |
assertTrue(connection.isConnected()); |
|
71 |
|
|
72 |
new Thread() { |
|
73 |
public void run() { |
|
74 |
MockOfficeTask badTask = new MockOfficeTask(10 * 1000); |
|
75 |
try { |
|
76 |
officeManager.execute(badTask); |
|
77 |
fail("task should be cancelled"); |
|
78 |
//FIXME being in a separate thread the test won't actually fail |
|
79 |
} catch (OfficeException officeException) { |
|
80 |
assertTrue(officeException.getCause() instanceof CancellationException); |
|
81 |
} |
|
82 |
} |
|
83 |
}.start(); |
|
84 |
Thread.sleep(500); |
|
85 |
Process underlyingProcess = (Process) ReflectionUtils.getPrivateField(process, "process"); |
|
86 |
assertNotNull(underlyingProcess); |
|
87 |
underlyingProcess.destroy(); // simulate crash |
|
88 |
|
|
89 |
Thread.sleep(RESTART_WAIT_TIME); |
|
90 |
assertTrue(process.isRunning()); |
|
91 |
assertTrue(connection.isConnected()); |
|
92 |
|
|
93 |
MockOfficeTask goodTask = new MockOfficeTask(); |
|
94 |
officeManager.execute(goodTask); |
|
95 |
assertTrue(goodTask.isCompleted()); |
|
96 |
|
|
97 |
officeManager.stop(); |
|
98 |
assertFalse(connection.isConnected()); |
|
99 |
assertFalse(process.isRunning()); |
|
100 |
assertEquals(process.getExitCode(0, 0), 0); |
|
101 |
} |
|
102 |
|
|
103 |
public void restartAfterTaskTimeout() throws Exception { |
|
104 |
PooledOfficeManagerSettings configuration = new PooledOfficeManagerSettings(CONNECTION_MODE); |
|
105 |
configuration.setTaskExecutionTimeout(1500L); |
|
106 |
final PooledOfficeManager officeManager = new PooledOfficeManager(configuration); |
|
107 |
|
|
108 |
ManagedOfficeProcess managedOfficeProcess = (ManagedOfficeProcess) ReflectionUtils.getPrivateField(officeManager, "managedOfficeProcess"); |
|
109 |
OfficeProcess process = (OfficeProcess) ReflectionUtils.getPrivateField(managedOfficeProcess, "process"); |
|
110 |
OfficeConnection connection = (OfficeConnection) ReflectionUtils.getPrivateField(managedOfficeProcess, "connection"); |
|
111 |
assertNotNull(connection); |
|
112 |
|
|
113 |
officeManager.start(); |
|
114 |
assertTrue(process.isRunning()); |
|
115 |
assertTrue(connection.isConnected()); |
|
116 |
|
|
117 |
MockOfficeTask longTask = new MockOfficeTask(2000); |
|
118 |
try { |
|
119 |
officeManager.execute(longTask); |
|
120 |
fail("task should be timed out"); |
|
121 |
} catch (OfficeException officeException) { |
|
122 |
assertTrue(officeException.getCause() instanceof TimeoutException); |
|
123 |
} |
|
124 |
|
|
125 |
Thread.sleep(RESTART_WAIT_TIME); |
|
126 |
assertTrue(process.isRunning()); |
|
127 |
assertTrue(connection.isConnected()); |
|
128 |
|
|
129 |
MockOfficeTask goodTask = new MockOfficeTask(); |
|
130 |
officeManager.execute(goodTask); |
|
131 |
assertTrue(goodTask.isCompleted()); |
|
132 |
|
|
133 |
officeManager.stop(); |
|
134 |
assertFalse(connection.isConnected()); |
|
135 |
assertFalse(process.isRunning()); |
|
136 |
assertEquals(process.getExitCode(0, 0), 0); |
|
137 |
} |
|
138 |
|
|
139 |
public void restartWhenMaxTasksPerProcessReached() throws Exception { |
|
140 |
PooledOfficeManagerSettings configuration = new PooledOfficeManagerSettings(CONNECTION_MODE); |
|
141 |
configuration.setMaxTasksPerProcess(3); |
|
142 |
final PooledOfficeManager officeManager = new PooledOfficeManager(configuration); |
|
143 |
|
|
144 |
ManagedOfficeProcess managedOfficeProcess = (ManagedOfficeProcess) ReflectionUtils.getPrivateField(officeManager, "managedOfficeProcess"); |
|
145 |
OfficeProcess process = (OfficeProcess) ReflectionUtils.getPrivateField(managedOfficeProcess, "process"); |
|
146 |
OfficeConnection connection = (OfficeConnection) ReflectionUtils.getPrivateField(managedOfficeProcess, "connection"); |
|
147 |
assertNotNull(connection); |
|
148 |
|
|
149 |
officeManager.start(); |
|
150 |
assertTrue(process.isRunning()); |
|
151 |
assertTrue(connection.isConnected()); |
|
152 |
|
|
153 |
for (int i = 0; i < 3; i++) { |
|
154 |
MockOfficeTask task = new MockOfficeTask(); |
|
155 |
officeManager.execute(task); |
|
156 |
assertTrue(task.isCompleted()); |
|
157 |
int taskCount = (Integer) ReflectionUtils.getPrivateField(officeManager, "taskCount"); |
|
158 |
assertEquals(taskCount, i + 1); |
|
159 |
} |
|
160 |
|
|
161 |
MockOfficeTask task = new MockOfficeTask(); |
|
162 |
officeManager.execute(task); |
|
163 |
assertTrue(task.isCompleted()); |
|
164 |
int taskCount = (Integer) ReflectionUtils.getPrivateField(officeManager, "taskCount"); |
|
165 |
assertEquals(taskCount, 0); //FIXME should be 1 to be precise |
|
166 |
|
|
167 |
officeManager.stop(); |
|
168 |
assertFalse(connection.isConnected()); |
|
169 |
assertFalse(process.isRunning()); |
|
170 |
assertEquals(process.getExitCode(0, 0), 0); |
|
171 |
} |
|
172 |
|
|
36 |
|
|
37 |
private static final UnoUrl CONNECTION_MODE = UnoUrl.socket(2002); |
|
38 |
|
|
39 |
private static final long RESTART_WAIT_TIME = 2 * 1000; |
|
40 |
|
|
41 |
public void executeTask() throws Exception { |
|
42 |
PooledOfficeManager officeManager = new PooledOfficeManager(CONNECTION_MODE); |
|
43 |
ManagedOfficeProcess managedOfficeProcess = (ManagedOfficeProcess) ReflectionUtils.getPrivateField(officeManager, "managedOfficeProcess"); |
|
44 |
OfficeProcess process = (OfficeProcess) ReflectionUtils.getPrivateField(managedOfficeProcess, "process"); |
|
45 |
OfficeConnection connection = (OfficeConnection) ReflectionUtils.getPrivateField(managedOfficeProcess, "connection"); |
|
46 |
|
|
47 |
officeManager.start(); |
|
48 |
assertTrue(process.isRunning()); |
|
49 |
assertTrue(connection.isConnected()); |
|
50 |
|
|
51 |
MockOfficeTask task = new MockOfficeTask(); |
|
52 |
officeManager.execute(task); |
|
53 |
assertTrue(task.isCompleted()); |
|
54 |
|
|
55 |
officeManager.stop(); |
|
56 |
assertFalse(connection.isConnected()); |
|
57 |
assertFalse(process.isRunning()); |
|
58 |
assertEquals(process.getExitCode(0, 0), 0); |
|
59 |
} |
|
60 |
|
|
61 |
public void restartAfterCrash() throws Exception { |
|
62 |
final PooledOfficeManager officeManager = new PooledOfficeManager(CONNECTION_MODE); |
|
63 |
ManagedOfficeProcess managedOfficeProcess = (ManagedOfficeProcess) ReflectionUtils.getPrivateField(officeManager, "managedOfficeProcess"); |
|
64 |
OfficeProcess process = (OfficeProcess) ReflectionUtils.getPrivateField(managedOfficeProcess, "process"); |
|
65 |
OfficeConnection connection = (OfficeConnection) ReflectionUtils.getPrivateField(managedOfficeProcess, "connection"); |
|
66 |
assertNotNull(connection); |
|
67 |
|
|
68 |
officeManager.start(); |
|
69 |
assertTrue(process.isRunning()); |
|
70 |
assertTrue(connection.isConnected()); |
|
71 |
|
|
72 |
new Thread() { |
|
73 |
|
|
74 |
public void run() { |
|
75 |
MockOfficeTask badTask = new MockOfficeTask(10 * 1000); |
|
76 |
try { |
|
77 |
officeManager.execute(badTask); |
|
78 |
fail("task should be cancelled"); |
|
79 |
// FIXME being in a separate thread the test won't actually fail |
|
80 |
} |
|
81 |
catch (OfficeException officeException) { |
|
82 |
assertTrue(officeException.getCause() instanceof CancellationException); |
|
83 |
} |
|
84 |
} |
|
85 |
}.start(); |
|
86 |
Thread.sleep(500); |
|
87 |
Process underlyingProcess = (Process) ReflectionUtils.getPrivateField(process, "process"); |
|
88 |
assertNotNull(underlyingProcess); |
|
89 |
underlyingProcess.destroy(); // simulate crash |
|
90 |
|
|
91 |
Thread.sleep(RESTART_WAIT_TIME); |
|
92 |
assertTrue(process.isRunning()); |
|
93 |
assertTrue(connection.isConnected()); |
|
94 |
|
|
95 |
MockOfficeTask goodTask = new MockOfficeTask(); |
|
96 |
officeManager.execute(goodTask); |
|
97 |
assertTrue(goodTask.isCompleted()); |
|
98 |
|
|
99 |
officeManager.stop(); |
|
100 |
assertFalse(connection.isConnected()); |
|
101 |
assertFalse(process.isRunning()); |
|
102 |
assertEquals(process.getExitCode(0, 0), 0); |
|
103 |
} |
|
104 |
|
|
105 |
public void restartAfterTaskTimeout() throws Exception { |
|
106 |
PooledOfficeManagerSettings configuration = new PooledOfficeManagerSettings(CONNECTION_MODE); |
|
107 |
configuration.setTaskExecutionTimeout(1500L); |
|
108 |
final PooledOfficeManager officeManager = new PooledOfficeManager(configuration); |
|
109 |
|
|
110 |
ManagedOfficeProcess managedOfficeProcess = (ManagedOfficeProcess) ReflectionUtils.getPrivateField(officeManager, "managedOfficeProcess"); |
|
111 |
OfficeProcess process = (OfficeProcess) ReflectionUtils.getPrivateField(managedOfficeProcess, "process"); |
|
112 |
OfficeConnection connection = (OfficeConnection) ReflectionUtils.getPrivateField(managedOfficeProcess, "connection"); |
|
113 |
assertNotNull(connection); |
|
114 |
|
|
115 |
officeManager.start(); |
|
116 |
assertTrue(process.isRunning()); |
|
117 |
assertTrue(connection.isConnected()); |
|
118 |
|
|
119 |
MockOfficeTask longTask = new MockOfficeTask(2000); |
|
120 |
try { |
|
121 |
officeManager.execute(longTask); |
|
122 |
fail("task should be timed out"); |
|
123 |
} |
|
124 |
catch (OfficeException officeException) { |
|
125 |
assertTrue(officeException.getCause() instanceof TimeoutException); |
|
126 |
} |
|
127 |
|
|
128 |
Thread.sleep(RESTART_WAIT_TIME); |
|
129 |
assertTrue(process.isRunning()); |
|
130 |
assertTrue(connection.isConnected()); |
|
131 |
|
|
132 |
MockOfficeTask goodTask = new MockOfficeTask(); |
|
133 |
officeManager.execute(goodTask); |
|
134 |
assertTrue(goodTask.isCompleted()); |
|
135 |
|
|
136 |
officeManager.stop(); |
|
137 |
assertFalse(connection.isConnected()); |
|
138 |
assertFalse(process.isRunning()); |
|
139 |
assertEquals(process.getExitCode(0, 0), 0); |
|
140 |
} |
|
141 |
|
|
142 |
public void restartWhenMaxTasksPerProcessReached() throws Exception { |
|
143 |
PooledOfficeManagerSettings configuration = new PooledOfficeManagerSettings(CONNECTION_MODE); |
|
144 |
configuration.setMaxTasksPerProcess(3); |
|
145 |
final PooledOfficeManager officeManager = new PooledOfficeManager(configuration); |
|
146 |
|
|
147 |
ManagedOfficeProcess managedOfficeProcess = (ManagedOfficeProcess) ReflectionUtils.getPrivateField(officeManager, "managedOfficeProcess"); |
|
148 |
OfficeProcess process = (OfficeProcess) ReflectionUtils.getPrivateField(managedOfficeProcess, "process"); |
|
149 |
OfficeConnection connection = (OfficeConnection) ReflectionUtils.getPrivateField(managedOfficeProcess, "connection"); |
|
150 |
assertNotNull(connection); |
|
151 |
|
|
152 |
officeManager.start(); |
|
153 |
assertTrue(process.isRunning()); |
|
154 |
assertTrue(connection.isConnected()); |
|
155 |
|
|
156 |
for (int i = 0; i < 3; i++) { |
|
157 |
MockOfficeTask task = new MockOfficeTask(); |
|
158 |
officeManager.execute(task); |
|
159 |
assertTrue(task.isCompleted()); |
|
160 |
int taskCount = (Integer) ReflectionUtils.getPrivateField(officeManager, "taskCount"); |
|
161 |
assertEquals(taskCount, i + 1); |
|
162 |
} |
|
163 |
|
|
164 |
MockOfficeTask task = new MockOfficeTask(); |
|
165 |
officeManager.execute(task); |
|
166 |
assertTrue(task.isCompleted()); |
|
167 |
int taskCount = (Integer) ReflectionUtils.getPrivateField(officeManager, "taskCount"); |
|
168 |
assertEquals(taskCount, 0); // FIXME should be 1 to be precise |
|
169 |
|
|
170 |
officeManager.stop(); |
|
171 |
assertFalse(connection.isConnected()); |
|
172 |
assertFalse(process.isRunning()); |
|
173 |
assertEquals(process.getExitCode(0, 0), 0); |
|
174 |
} |
|
175 |
|
|
173 | 176 |
} |
tmp/org.txm.jodconverter.core/src/test/java/org/artofsolving/jodconverter/office/OfficeUtilsTest.java (revision 2406) | ||
---|---|---|
18 | 18 |
import java.io.File; |
19 | 19 |
|
20 | 20 |
public class OfficeUtilsTest { |
21 |
|
|
22 |
public void testToUrl() {
|
|
23 |
//TODO create separate tests for Windows
|
|
24 |
assertEquals(toUrl(new File("/tmp/document.odt")), "file:///tmp/document.odt");
|
|
25 |
assertEquals(toUrl(new File("/tmp/document with spaces.odt")), "file:///tmp/document%20with%20spaces.odt");
|
|
26 |
}
|
|
27 |
|
|
21 |
|
|
22 |
public void testToUrl() {
|
|
23 |
// TODO create separate tests for Windows
|
|
24 |
assertEquals(toUrl(new File("/tmp/document.odt")), "file:///tmp/document.odt");
|
|
25 |
assertEquals(toUrl(new File("/tmp/document with spaces.odt")), "file:///tmp/document%20with%20spaces.odt");
|
|
26 |
}
|
|
27 |
|
|
28 | 28 |
} |
tmp/org.txm.jodconverter.core/src/test/java/org/artofsolving/jodconverter/document/DumpJsonDefaultDocumentFormatRegistry.java (revision 2406) | ||
---|---|---|
17 | 17 |
import java.util.List; |
18 | 18 |
import java.util.Map; |
19 | 19 |
|
20 |
|
|
21 | 20 |
import org.artofsolving.jodconverter.ReflectionUtils; |
22 | 21 |
import org.json.JSONArray; |
23 | 22 |
import org.json.JSONException; |
... | ... | |
27 | 26 |
* Exectable class that dumps a JSON version of the {@link DefaultDocumentFormatRegistry} |
28 | 27 |
*/ |
29 | 28 |
class DumpJsonDefaultDocumentFormatRegistry { |
30 |
|
|
31 |
private static class SortedJsonObject extends JSONObject { |
|
32 |
public SortedJsonObject() { |
|
33 |
try { |
|
34 |
Field field = JSONObject.class.getDeclaredField("myHashMap"); |
|
35 |
field.setAccessible(true); |
|
36 |
field.set(this, new LinkedHashMap<String,Object>()); |
|
37 |
} catch (Exception exception) { |
|
38 |
// pass; will not be sorted |
|
39 |
} |
|
40 |
} |
|
41 |
} |
|
42 |
|
|
43 |
private static JSONObject toJson(DocumentFormat format) throws JSONException { |
|
44 |
JSONObject jsonFormat = new SortedJsonObject(); |
|
45 |
jsonFormat.put("name", format.getName()); |
|
46 |
jsonFormat.put("extension", format.getExtension()); |
|
47 |
jsonFormat.put("mediaType", format.getMediaType()); |
|
48 |
if (format.getInputFamily() != null) { |
|
49 |
jsonFormat.put("inputFamily", format.getInputFamily().name()); |
|
50 |
} |
|
51 |
if (format.getLoadProperties() != null) { |
|
52 |
jsonFormat.put("loadProperties", toJson(format.getLoadProperties())); |
|
53 |
} |
|
54 |
if (format.getStorePropertiesByFamily() != null) { |
|
55 |
JSONObject jsonStorePropertiesByFamily = new SortedJsonObject(); |
|
56 |
for (Map.Entry<DocumentFamily,Map<String,?>> entry : format.getStorePropertiesByFamily().entrySet()) { |
|
57 |
jsonStorePropertiesByFamily.put(entry.getKey().name(), toJson(entry.getValue())); |
|
58 |
} |
|
59 |
jsonFormat.put("storePropertiesByFamily", jsonStorePropertiesByFamily); |
|
60 |
} |
|
61 |
return jsonFormat; |
|
62 |
} |
|
63 |
|
|
64 |
@SuppressWarnings("unchecked") |
|
65 |
private static JSONObject toJson(Map<String,?> properties) throws JSONException { |
|
66 |
JSONObject jsonProperties = new SortedJsonObject(); |
|
67 |
for (Map.Entry<String,?> entry : properties.entrySet()) { |
|
68 |
if (entry.getValue() instanceof Map) { |
|
69 |
Map<String,?> jsonValue = (Map<String,?>) entry.getValue(); |
|
70 |
jsonProperties.put(entry.getKey(), toJson(jsonValue)); |
|
71 |
} else { |
|
72 |
jsonProperties.put(entry.getKey(), entry.getValue()); |
|
73 |
} |
|
74 |
} |
|
75 |
return jsonProperties; |
|
76 |
} |
|
77 |
|
|
78 |
public static void main(String[] args) throws Exception { |
|
79 |
DefaultDocumentFormatRegistry registry = new DefaultDocumentFormatRegistry(); |
|
80 |
@SuppressWarnings("unchecked") |
|
81 |
List<DocumentFormat> formats = (List<DocumentFormat>) ReflectionUtils.getPrivateField(SimpleDocumentFormatRegistry.class, registry, "documentFormats"); |
|
82 |
JSONArray array = new JSONArray(); |
|
83 |
for (DocumentFormat format : formats) { |
|
84 |
array.put(toJson(format)); |
|
85 |
} |
|
86 |
System.out.println(array.toString(2)); |
|
87 |
} |
|
88 |
|
|
29 |
|
|
30 |
private static class SortedJsonObject extends JSONObject { |
|
31 |
|
|
32 |
public SortedJsonObject() { |
|
33 |
try { |
|
34 |
Field field = JSONObject.class.getDeclaredField("myHashMap"); |
|
35 |
field.setAccessible(true); |
|
36 |
field.set(this, new LinkedHashMap<String, Object>()); |
|
37 |
} |
|
38 |
catch (Exception exception) { |
|
39 |
// pass; will not be sorted |
|
40 |
} |
|
41 |
} |
|
42 |
} |
|
43 |
|
|
44 |
private static JSONObject toJson(DocumentFormat format) throws JSONException { |
|
45 |
JSONObject jsonFormat = new SortedJsonObject(); |
|
46 |
jsonFormat.put("name", format.getName()); |
|
47 |
jsonFormat.put("extension", format.getExtension()); |
|
48 |
jsonFormat.put("mediaType", format.getMediaType()); |
|
49 |
if (format.getInputFamily() != null) { |
|
50 |
jsonFormat.put("inputFamily", format.getInputFamily().name()); |
|
51 |
} |
|
52 |
if (format.getLoadProperties() != null) { |
|
53 |
jsonFormat.put("loadProperties", toJson(format.getLoadProperties())); |
|
54 |
} |
|
55 |
if (format.getStorePropertiesByFamily() != null) { |
|
56 |
JSONObject jsonStorePropertiesByFamily = new SortedJsonObject(); |
|
57 |
for (Map.Entry<DocumentFamily, Map<String, ?>> entry : format.getStorePropertiesByFamily().entrySet()) { |
|
58 |
jsonStorePropertiesByFamily.put(entry.getKey().name(), toJson(entry.getValue())); |
|
59 |
} |
|
60 |
jsonFormat.put("storePropertiesByFamily", jsonStorePropertiesByFamily); |
|
61 |
} |
|
62 |
return jsonFormat; |
|
63 |
} |
|
64 |
|
|
65 |
@SuppressWarnings("unchecked") |
|
66 |
private static JSONObject toJson(Map<String, ?> properties) throws JSONException { |
|
67 |
JSONObject jsonProperties = new SortedJsonObject(); |
|
68 |
for (Map.Entry<String, ?> entry : properties.entrySet()) { |
|
69 |
if (entry.getValue() instanceof Map) { |
|
70 |
Map<String, ?> jsonValue = (Map<String, ?>) entry.getValue(); |
|
71 |
jsonProperties.put(entry.getKey(), toJson(jsonValue)); |
|
72 |
} |
|
73 |
else { |
|
74 |
jsonProperties.put(entry.getKey(), entry.getValue()); |
|
75 |
} |
|
76 |
} |
|
77 |
return jsonProperties; |
|
78 |
} |
|
79 |
|
|
80 |
public static void main(String[] args) throws Exception { |
|
81 |
DefaultDocumentFormatRegistry registry = new DefaultDocumentFormatRegistry(); |
|
82 |
@SuppressWarnings("unchecked") |
|
83 |
List<DocumentFormat> formats = (List<DocumentFormat>) ReflectionUtils.getPrivateField(SimpleDocumentFormatRegistry.class, registry, "documentFormats"); |
|
84 |
JSONArray array = new JSONArray(); |
|
85 |
for (DocumentFormat format : formats) { |
|
86 |
array.put(toJson(format)); |
|
87 |
} |
|
88 |
System.out.println(array.toString(2)); |
|
89 |
} |
|
90 |
|
|
89 | 91 |
} |
tmp/org.txm.jodconverter.core/src/test/java/org/artofsolving/jodconverter/document/JsonDocumentFormatRegistryTest.java (revision 2406) | ||
---|---|---|
28 | 28 |
|
29 | 29 |
@Test |
30 | 30 |
public class JsonDocumentFormatRegistryTest { |
31 |
|
|
32 |
public void readJsonRegistry() throws JSONException, IOException { |
|
33 |
InputStream input = getClass().getResourceAsStream("/document-formats.js"); |
|
34 |
DocumentFormatRegistry registry = null; |
|
35 |
try { |
|
36 |
registry = new JsonDocumentFormatRegistry(input); |
|
37 |
} finally { |
|
38 |
IOUtils.closeQuietly(input); |
|
39 |
} |
|
40 |
DocumentFormat odt = registry.getFormatByExtension("odt"); |
|
41 |
assertNotNull(odt); |
|
42 |
assertNotNull(odt.getStoreProperties(DocumentFamily.TEXT)); |
|
43 |
} |
|
44 |
|
|
31 |
|
|
32 |
public void readJsonRegistry() throws JSONException, IOException { |
|
33 |
InputStream input = getClass().getResourceAsStream("/document-formats.js"); |
|
34 |
DocumentFormatRegistry registry = null; |
|
35 |
try { |
|
36 |
registry = new JsonDocumentFormatRegistry(input); |
|
37 |
} |
|
38 |
finally { |
|
39 |
IOUtils.closeQuietly(input); |
|
40 |
} |
|
41 |
DocumentFormat odt = registry.getFormatByExtension("odt"); |
|
42 |
assertNotNull(odt); |
|
43 |
assertNotNull(odt.getStoreProperties(DocumentFamily.TEXT)); |
|
44 |
} |
|
45 |
|
|
45 | 46 |
} |
tmp/org.txm.jodconverter.core/src/test/java/org/artofsolving/jodconverter/process/ProcessManagerTest.java (revision 2406) | ||
---|---|---|
22 | 22 |
|
23 | 23 |
@Test |
24 | 24 |
public class ProcessManagerTest { |
25 |
|
|
26 |
public void linuxProcessManager() throws Exception {
|
|
27 |
if (!PlatformUtils.isLinux()) {
|
|
28 |
throw new SkipException("LinuxProcessManager can only be tested on Linux");
|
|
29 |
}
|
|
30 |
|
|
31 |
ProcessManager processManager = new LinuxProcessManager();
|
|
32 |
Process process = new ProcessBuilder("sleep", "5s").start();
|
|
33 |
ProcessQuery query = new ProcessQuery("sleep", "5s");
|
|
34 |
|
|
35 |
long pid = processManager.findPid(query);
|
|
36 |
assertFalse(pid == ProcessManager.PID_NOT_FOUND);
|
|
37 |
Integer javaPid = (Integer) ReflectionUtils.getPrivateField(process, "pid");
|
|
38 |
assertEquals(pid, javaPid.longValue());
|
|
39 |
|
|
40 |
processManager.kill(process, pid);
|
|
41 |
assertEquals(processManager.findPid(query), ProcessManager.PID_NOT_FOUND);
|
|
42 |
}
|
|
43 |
|
|
44 |
public void sigarProcessManager() throws Exception {
|
|
45 |
ProcessManager processManager = new SigarProcessManager();
|
|
46 |
Process process = new ProcessBuilder("sleep", "5s").start();
|
|
47 |
ProcessQuery query = new ProcessQuery("sleep", "5s");
|
|
48 |
|
|
49 |
long pid = processManager.findPid(query);
|
|
50 |
assertFalse(pid == ProcessManager.PID_NOT_FOUND);
|
|
51 |
if (PlatformUtils.isLinux()) {
|
|
52 |
Integer javaPid = (Integer) ReflectionUtils.getPrivateField(process, "pid");
|
|
53 |
assertEquals(pid, javaPid.longValue());
|
|
54 |
}
|
|
55 |
|
|
56 |
processManager.kill(process, pid);
|
|
57 |
assertEquals(processManager.findPid(query), ProcessManager.PID_NOT_FOUND);
|
|
58 |
}
|
|
59 |
|
|
25 |
|
|
26 |
public void linuxProcessManager() throws Exception {
|
|
27 |
if (!PlatformUtils.isLinux()) {
|
|
28 |
throw new SkipException("LinuxProcessManager can only be tested on Linux");
|
|
29 |
}
|
|
30 |
|
|
31 |
ProcessManager processManager = new LinuxProcessManager();
|
|
32 |
Process process = new ProcessBuilder("sleep", "5s").start();
|
|
33 |
ProcessQuery query = new ProcessQuery("sleep", "5s");
|
|
34 |
|
|
35 |
long pid = processManager.findPid(query);
|
|
36 |
assertFalse(pid == ProcessManager.PID_NOT_FOUND);
|
|
37 |
Integer javaPid = (Integer) ReflectionUtils.getPrivateField(process, "pid");
|
|
38 |
assertEquals(pid, javaPid.longValue());
|
|
39 |
|
|
40 |
processManager.kill(process, pid);
|
|
41 |
assertEquals(processManager.findPid(query), ProcessManager.PID_NOT_FOUND);
|
|
42 |
}
|
|
43 |
|
|
44 |
public void sigarProcessManager() throws Exception {
|
|
45 |
ProcessManager processManager = new SigarProcessManager();
|
|
46 |
Process process = new ProcessBuilder("sleep", "5s").start();
|
|
47 |
ProcessQuery query = new ProcessQuery("sleep", "5s");
|
|
48 |
|
|
49 |
long pid = processManager.findPid(query);
|
|
50 |
assertFalse(pid == ProcessManager.PID_NOT_FOUND);
|
|
51 |
if (PlatformUtils.isLinux()) {
|
|
52 |
Integer javaPid = (Integer) ReflectionUtils.getPrivateField(process, "pid");
|
|
53 |
assertEquals(pid, javaPid.longValue());
|
|
54 |
}
|
|
55 |
|
|
56 |
processManager.kill(process, pid);
|
|
57 |
assertEquals(processManager.findPid(query), ProcessManager.PID_NOT_FOUND);
|
|
58 |
}
|
|
59 |
|
|
60 | 60 |
} |
tmp/org.txm.jodconverter.core/src/main/assembly/dist.xml (revision 2406) | ||
---|---|---|
1 | 1 |
<assembly> |
2 |
<id>dist</id>
|
|
3 |
<formats>
|
|
4 |
<format>zip</format>
|
|
5 |
</formats>
|
|
6 |
<dependencySets>
|
|
7 |
<dependencySet>
|
|
8 |
<outputDirectory>lib</outputDirectory>
|
|
9 |
<excludes>
|
|
10 |
<exclude>org.hyperic:sigar</exclude>
|
|
11 |
</excludes>
|
|
12 |
</dependencySet>
|
|
13 |
</dependencySets>
|
|
14 |
<fileSets>
|
|
15 |
<fileSet>
|
|
16 |
<includes>
|
|
17 |
<include>LICENSE.txt</include>
|
|
18 |
<include>README.txt</include>
|
|
19 |
</includes>
|
|
20 |
</fileSet>
|
|
21 |
<fileSet>
|
|
22 |
<directory>target</directory>
|
|
23 |
<outputDirectory>/</outputDirectory>
|
|
24 |
<includes>
|
|
25 |
<include>${project.artifactId}-${project.version}-javadoc.jar</include>
|
|
26 |
<include>${project.artifactId}-${project.version}-sources.jar</include>
|
|
27 |
</includes>
|
|
28 |
</fileSet>
|
|
29 |
<fileSet>
|
|
30 |
<directory>src/main/resources</directory>
|
|
31 |
<outputDirectory>/conf</outputDirectory>
|
|
32 |
<includes>
|
|
33 |
<include>document-formats.js</include>
|
|
34 |
</includes>
|
|
35 |
</fileSet>
|
|
36 |
</fileSets>
|
|
2 |
<id>dist</id>
|
|
3 |
<formats>
|
|
4 |
<format>zip</format>
|
|
5 |
</formats>
|
|
6 |
<dependencySets>
|
|
7 |
<dependencySet>
|
|
8 |
<outputDirectory>lib</outputDirectory>
|
|
9 |
<excludes>
|
|
10 |
<exclude>org.hyperic:sigar</exclude>
|
|
11 |
</excludes>
|
|
12 |
</dependencySet>
|
|
13 |
</dependencySets>
|
|
14 |
<fileSets>
|
|
15 |
<fileSet>
|
|
16 |
<includes>
|
|
17 |
<include>LICENSE.txt</include>
|
|
18 |
<include>README.txt</include>
|
|
19 |
</includes>
|
|
20 |
</fileSet>
|
|
21 |
<fileSet>
|
|
22 |
<directory>target</directory>
|
|
23 |
<outputDirectory>/</outputDirectory>
|
|
24 |
<includes>
|
|
25 |
<include>${project.artifactId}-${project.version}-javadoc.jar</include>
|
|
26 |
<include>${project.artifactId}-${project.version}-sources.jar</include>
|
|
27 |
</includes>
|
|
28 |
</fileSet>
|
|
29 |
<fileSet>
|
|
30 |
<directory>src/main/resources</directory>
|
|
31 |
<outputDirectory>/conf</outputDirectory>
|
|
32 |
<includes>
|
|
33 |
<include>document-formats.js</include>
|
|
34 |
</includes>
|
|
35 |
</fileSet>
|
|
36 |
</fileSets>
|
|
37 | 37 |
</assembly> |
tmp/org.txm.jodconverter.core/src/main/java/org/artofsolving/jodconverter/cli/Convert.java (revision 2406) | ||
---|---|---|
36 | 36 |
* Command line interface executable. |
37 | 37 |
*/ |
38 | 38 |
public class Convert { |
39 |
|
|
40 |
public static final int STATUS_OK = 0; |
|
41 |
public static final int STATUS_MISSING_INPUT_FILE = 1; |
|
42 |
public static final int STATUS_INVALID_ARGUMENTS = 255; |
|
43 |
|
|
44 |
private static final Option OPTION_OUTPUT_FORMAT = new Option("o", "output-format", true, "output format (e.g. pdf)"); |
|
45 |
private static final Option OPTION_PORT = new Option("p", "port", true, "office socket port (optional; defaults to 2002)"); |
|
46 |
private static final Option OPTION_REGISTRY = new Option("r", "registry", true, "document formats registry configuration file (optional)"); |
|
47 |
private static final Option OPTION_TIMEOUT = new Option("t", "timeout", true, "maximum conversion time in seconds (optional; defaults to 120)"); |
|
48 |
private static final Option OPTION_USER_PROFILE = new Option("u", "user-profile", true, "use settings from the given user installation dir (optional)"); |
|
49 |
private static final Options OPTIONS = initOptions(); |
|
50 |
|
|
51 |
private static final int DEFAULT_OFFICE_PORT = 2002; |
|
52 |
|
|
53 |
private static Options initOptions() { |
|
54 |
Options options = new Options(); |
|
55 |
options.addOption(OPTION_OUTPUT_FORMAT); |
|
56 |
options.addOption(OPTION_PORT); |
|
57 |
options.addOption(OPTION_REGISTRY); |
|
58 |
options.addOption(OPTION_TIMEOUT); |
|
59 |
options.addOption(OPTION_USER_PROFILE); |
|
60 |
return options; |
|
61 |
} |
|
62 |
|
|
63 |
public static void main(String[] arguments) throws ParseException, JSONException, IOException { |
|
64 |
CommandLineParser commandLineParser = new PosixParser(); |
|
65 |
CommandLine commandLine = commandLineParser.parse(OPTIONS, arguments); |
|
66 |
|
|
67 |
String outputFormat = null; |
|
68 |
if (commandLine.hasOption(OPTION_OUTPUT_FORMAT.getOpt())) { |
|
69 |
outputFormat = commandLine.getOptionValue(OPTION_OUTPUT_FORMAT.getOpt()); |
|
70 |
} |
|
71 |
|
|
72 |
int port = DEFAULT_OFFICE_PORT; |
|
73 |
if (commandLine.hasOption(OPTION_PORT.getOpt())) { |
|
74 |
port = Integer.parseInt(commandLine.getOptionValue(OPTION_PORT.getOpt())); |
|
75 |
} |
|
76 |
|
|
77 |
String[] fileNames = commandLine.getArgs(); |
|
78 |
if ((outputFormat == null && fileNames.length != 2) || fileNames.length < 1) { |
|
79 |
String syntax = "java -jar jodconverter-core.jar [options] input-file output-file\n" |
|
80 |
+ "or [options] -o output-format input-file [input-file...]"; |
|
81 |
HelpFormatter helpFormatter = new HelpFormatter(); |
|
82 |
helpFormatter.printHelp(syntax, OPTIONS); |
|
83 |
// System.exit(STATUS_INVALID_ARGUMENTS); |
|
84 |
} |
|
85 |
|
|
86 |
DocumentFormatRegistry registry; |
|
87 |
if (commandLine.hasOption(OPTION_REGISTRY.getOpt())) { |
|
88 |
File registryFile = new File(commandLine.getOptionValue(OPTION_REGISTRY.getOpt())); |
|
89 |
registry = new JsonDocumentFormatRegistry(FileUtils.readFileToString(registryFile)); |
|
90 |
} else { |
|
91 |
registry = new DefaultDocumentFormatRegistry(); |
|
92 |
} |
|
93 |
|
|
94 |
DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration(); |
|
95 |
configuration.setPortNumber(port); |
|
96 |
if (commandLine.hasOption(OPTION_TIMEOUT.getOpt())) { |
|
97 |
int timeout = Integer.parseInt(commandLine.getOptionValue(OPTION_TIMEOUT.getOpt())); |
|
98 |
configuration.setTaskExecutionTimeout(timeout * 1000); |
|
99 |
} |
|
100 |
if (commandLine.hasOption(OPTION_USER_PROFILE.getOpt())) { |
|
101 |
String templateProfileDir = commandLine.getOptionValue(OPTION_USER_PROFILE.getOpt()); |
|
102 |
configuration.setTemplateProfileDir(new File(templateProfileDir)); |
|
103 |
} |
|
104 |
|
|
105 |
OfficeManager officeManager = configuration.buildOfficeManager(); |
|
106 |
officeManager.start(); |
|
107 |
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager, registry); |
|
108 |
try { |
|
109 |
if (outputFormat == null) { |
|
110 |
File inputFile = new File(fileNames[0]); |
|
111 |
File outputFile = new File(fileNames[1]); |
|
112 |
converter.convert(inputFile, outputFile); |
|
113 |
} else { |
|
114 |
for (int i = 0; i < fileNames.length; i++) { |
|
115 |
File inputFile = new File(fileNames[i]); |
|
116 |
String outputName = FilenameUtils.getBaseName(fileNames[i]) + "." + outputFormat; |
|
117 |
File outputFile = new File(FilenameUtils.getFullPath(fileNames[i]) + outputName); |
|
118 |
converter.convert(inputFile, outputFile); |
|
119 |
} |
|
120 |
} |
|
121 |
} finally { |
|
122 |
officeManager.stop(); |
|
123 |
} |
|
124 |
} |
|
125 |
|
|
39 |
|
|
40 |
public static final int STATUS_OK = 0; |
|
41 |
|
|
42 |
public static final int STATUS_MISSING_INPUT_FILE = 1; |
|
43 |
|
|
44 |
public static final int STATUS_INVALID_ARGUMENTS = 255; |
|
45 |
|
|
46 |
private static final Option OPTION_OUTPUT_FORMAT = new Option("o", "output-format", true, "output format (e.g. pdf)"); |
|
47 |
|
|
48 |
private static final Option OPTION_PORT = new Option("p", "port", true, "office socket port (optional; defaults to 2002)"); |
|
49 |
|
|
50 |
private static final Option OPTION_REGISTRY = new Option("r", "registry", true, "document formats registry configuration file (optional)"); |
|
51 |
|
|
52 |
private static final Option OPTION_TIMEOUT = new Option("t", "timeout", true, "maximum conversion time in seconds (optional; defaults to 120)"); |
|
53 |
|
|
54 |
private static final Option OPTION_USER_PROFILE = new Option("u", "user-profile", true, "use settings from the given user installation dir (optional)"); |
|
55 |
|
|
56 |
private static final Options OPTIONS = initOptions(); |
|
57 |
|
|
58 |
private static final int DEFAULT_OFFICE_PORT = 2002; |
|
59 |
|
|
60 |
private static Options initOptions() { |
|
61 |
Options options = new Options(); |
|
62 |
options.addOption(OPTION_OUTPUT_FORMAT); |
|
63 |
options.addOption(OPTION_PORT); |
|
64 |
options.addOption(OPTION_REGISTRY); |
|
65 |
options.addOption(OPTION_TIMEOUT); |
|
66 |
options.addOption(OPTION_USER_PROFILE); |
|
67 |
return options; |
|
68 |
} |
|
69 |
|
|
70 |
public static void main(String[] arguments) throws ParseException, JSONException, IOException { |
|
71 |
CommandLineParser commandLineParser = new PosixParser(); |
|
72 |
CommandLine commandLine = commandLineParser.parse(OPTIONS, arguments); |
|
73 |
|
|
74 |
String outputFormat = null; |
|
75 |
if (commandLine.hasOption(OPTION_OUTPUT_FORMAT.getOpt())) { |
|
76 |
outputFormat = commandLine.getOptionValue(OPTION_OUTPUT_FORMAT.getOpt()); |
|
77 |
} |
|
78 |
|
|
79 |
int port = DEFAULT_OFFICE_PORT; |
|
80 |
if (commandLine.hasOption(OPTION_PORT.getOpt())) { |
|
81 |
port = Integer.parseInt(commandLine.getOptionValue(OPTION_PORT.getOpt())); |
|
82 |
} |
|
83 |
|
|
84 |
String[] fileNames = commandLine.getArgs(); |
|
85 |
if ((outputFormat == null && fileNames.length != 2) || fileNames.length < 1) { |
|
86 |
String syntax = "java -jar jodconverter-core.jar [options] input-file output-file\n" |
|
87 |
+ "or [options] -o output-format input-file [input-file...]"; |
|
88 |
HelpFormatter helpFormatter = new HelpFormatter(); |
|
89 |
helpFormatter.printHelp(syntax, OPTIONS); |
|
90 |
// System.exit(STATUS_INVALID_ARGUMENTS); |
|
91 |
} |
|
92 |
|
|
93 |
DocumentFormatRegistry registry; |
|
94 |
if (commandLine.hasOption(OPTION_REGISTRY.getOpt())) { |
|
95 |
File registryFile = new File(commandLine.getOptionValue(OPTION_REGISTRY.getOpt())); |
|
96 |
registry = new JsonDocumentFormatRegistry(FileUtils.readFileToString(registryFile)); |
|
97 |
} |
|
98 |
else { |
|
99 |
registry = new DefaultDocumentFormatRegistry(); |
|
100 |
} |
|
101 |
|
|
102 |
DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration(); |
|
103 |
configuration.setPortNumber(port); |
|
104 |
if (commandLine.hasOption(OPTION_TIMEOUT.getOpt())) { |
|
105 |
int timeout = Integer.parseInt(commandLine.getOptionValue(OPTION_TIMEOUT.getOpt())); |
|
106 |
configuration.setTaskExecutionTimeout(timeout * 1000); |
|
107 |
} |
|
108 |
if (commandLine.hasOption(OPTION_USER_PROFILE.getOpt())) { |
|
109 |
String templateProfileDir = commandLine.getOptionValue(OPTION_USER_PROFILE.getOpt()); |
|
110 |
configuration.setTemplateProfileDir(new File(templateProfileDir)); |
|
111 |
} |
|
112 |
|
|
113 |
OfficeManager officeManager = configuration.buildOfficeManager(); |
|
114 |
officeManager.start(); |
|
115 |
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager, registry); |
|
116 |
try { |
|
117 |
if (outputFormat == null) { |
|
118 |
File inputFile = new File(fileNames[0]); |
|
119 |
File outputFile = new File(fileNames[1]); |
|
120 |
converter.convert(inputFile, outputFile); |
|
121 |
} |
|
122 |
else { |
|
123 |
for (int i = 0; i < fileNames.length; i++) { |
|
124 |
File inputFile = new File(fileNames[i]); |
|
125 |
String outputName = FilenameUtils.getBaseName(fileNames[i]) + "." + outputFormat; |
|
126 |
File outputFile = new File(FilenameUtils.getFullPath(fileNames[i]) + outputName); |
|
127 |
converter.convert(inputFile, outputFile); |
|
128 |
} |
|
129 |
} |
|
130 |
} |
|
131 |
finally { |
|
132 |
officeManager.stop(); |
|
133 |
} |
|
134 |
} |
|
135 |
|
|
126 | 136 |
} |
tmp/org.txm.jodconverter.core/src/main/java/org/artofsolving/jodconverter/StandardConversionTask.java (revision 2406) | ||
---|---|---|
26 | 26 |
import com.sun.star.util.XRefreshable; |
27 | 27 |
|
28 | 28 |
public class StandardConversionTask extends AbstractConversionTask { |
29 |
|
|
30 |
private final DocumentFormat outputFormat; |
|
31 |
|
|
32 |
private Map<String,?> defaultLoadProperties; |
|
33 |
private DocumentFormat inputFormat; |
|
34 |
|
|
35 |
public StandardConversionTask(File inputFile, File outputFile, DocumentFormat outputFormat) { |
|
36 |
super(inputFile, outputFile); |
|
37 |
this.outputFormat = outputFormat; |
|
38 |
} |
|
39 |
|
|
40 |
public void setDefaultLoadProperties(Map<String, ?> defaultLoadProperties) { |
|
41 |
this.defaultLoadProperties = defaultLoadProperties; |
|
42 |
} |
|
43 |
|
|
44 |
public void setInputFormat(DocumentFormat inputFormat) { |
|
45 |
this.inputFormat = inputFormat; |
|
46 |
} |
|
47 |
|
|
48 |
@Override |
|
49 |
protected void modifyDocument(XComponent document) throws OfficeException { |
|
50 |
XRefreshable refreshable = cast(XRefreshable.class, document); |
|
51 |
if (refreshable != null) { |
|
52 |
refreshable.refresh(); |
|
53 |
} |
|
54 |
} |
|
55 |
|
|
56 |
@Override |
|
57 |
protected Map<String,?> getLoadProperties(File inputFile) { |
|
58 |
Map<String,Object> loadProperties = new HashMap<String,Object>(); |
|
59 |
if (defaultLoadProperties != null) { |
|
60 |
loadProperties.putAll(defaultLoadProperties); |
|
61 |
} |
|
62 |
if (inputFormat != null && inputFormat.getLoadProperties() != null) { |
|
63 |
loadProperties.putAll(inputFormat.getLoadProperties()); |
|
64 |
} |
|
65 |
return loadProperties; |
|
66 |
} |
|
67 |
|
|
68 |
@Override |
|
69 |
protected Map<String,?> getStoreProperties(File outputFile, XComponent document) { |
|
70 |
DocumentFamily family = OfficeDocumentUtils.getDocumentFamily(document); |
|
71 |
return outputFormat.getStoreProperties(family); |
|
72 |
} |
|
73 |
|
|
29 |
|
|
30 |
private final DocumentFormat outputFormat; |
|
31 |
|
|
32 |
private Map<String, ?> defaultLoadProperties; |
|
33 |
|
|
34 |
private DocumentFormat inputFormat; |
|
35 |
|
|
36 |
public StandardConversionTask(File inputFile, File outputFile, DocumentFormat outputFormat) { |
|
37 |
super(inputFile, outputFile); |
|
38 |
this.outputFormat = outputFormat; |
|
39 |
} |
|
40 |
|
|
41 |
public void setDefaultLoadProperties(Map<String, ?> defaultLoadProperties) { |
|
42 |
this.defaultLoadProperties = defaultLoadProperties; |
|
43 |
} |
|
44 |
|
|
45 |
public void setInputFormat(DocumentFormat inputFormat) { |
|
46 |
this.inputFormat = inputFormat; |
|
47 |
} |
|
48 |
|
|
49 |
@Override |
|
50 |
protected void modifyDocument(XComponent document) throws OfficeException { |
|
51 |
XRefreshable refreshable = cast(XRefreshable.class, document); |
|
52 |
if (refreshable != null) { |
|
53 |
refreshable.refresh(); |
|
54 |
} |
|
55 |
} |
|
56 |
|
|
57 |
@Override |
|
58 |
protected Map<String, ?> getLoadProperties(File inputFile) { |
|
59 |
Map<String, Object> loadProperties = new HashMap<String, Object>(); |
|
60 |
if (defaultLoadProperties != null) { |
|
61 |
loadProperties.putAll(defaultLoadProperties); |
|
62 |
} |
|
63 |
if (inputFormat != null && inputFormat.getLoadProperties() != null) { |
|
64 |
loadProperties.putAll(inputFormat.getLoadProperties()); |
|
65 |
} |
|
66 |
return loadProperties; |
|
67 |
} |
|
68 |
|
|
69 |
@Override |
|
70 |
protected Map<String, ?> getStoreProperties(File outputFile, XComponent document) { |
|
71 |
DocumentFamily family = OfficeDocumentUtils.getDocumentFamily(document); |
|
72 |
return outputFormat.getStoreProperties(family); |
|
73 |
} |
|
74 |
|
|
74 | 75 |
} |
tmp/org.txm.jodconverter.core/src/main/java/org/artofsolving/jodconverter/OfficeDocumentUtils.java (revision 2406) | ||
---|---|---|
17 | 17 |
import org.artofsolving.jodconverter.document.DocumentFamily; |
18 | 18 |
import org.artofsolving.jodconverter.office.OfficeException; |
19 | 19 |
|
20 |
|
|
21 | 20 |
import com.sun.star.lang.XComponent; |
22 | 21 |
import com.sun.star.lang.XServiceInfo; |
23 | 22 |
|
24 | 23 |
class OfficeDocumentUtils { |
25 |
|
|
26 |
private OfficeDocumentUtils() { |
|
27 |
throw new AssertionError("utility class must not be instantiated"); |
|
28 |
} |
|
29 |
|
|
30 |
public static DocumentFamily getDocumentFamily(XComponent document) throws OfficeException { |
|
31 |
XServiceInfo serviceInfo = cast(XServiceInfo.class, document); |
|
32 |
if (serviceInfo.supportsService("com.sun.star.text.GenericTextDocument")) { |
|
33 |
// NOTE: a GenericTextDocument is either a TextDocument, a WebDocument, or a GlobalDocument |
|
34 |
// but this further distinction doesn't seem to matter for conversions |
|
35 |
return DocumentFamily.TEXT; |
|
36 |
} else if (serviceInfo.supportsService("com.sun.star.sheet.SpreadsheetDocument")) { |
|
37 |
return DocumentFamily.SPREADSHEET; |
|
38 |
} else if (serviceInfo.supportsService("com.sun.star.presentation.PresentationDocument")) { |
|
39 |
return DocumentFamily.PRESENTATION; |
|
40 |
} else if (serviceInfo.supportsService("com.sun.star.drawing.DrawingDocument")) { |
|
41 |
return DocumentFamily.DRAWING; |
|
42 |
} else { |
|
43 |
throw new OfficeException("document of unknown family: " + serviceInfo.getImplementationName()); |
|
44 |
} |
|
45 |
} |
|
46 |
|
|
24 |
|
|
25 |
private OfficeDocumentUtils() { |
|
26 |
throw new AssertionError("utility class must not be instantiated"); |
|
27 |
} |
|
28 |
|
|
29 |
public static DocumentFamily getDocumentFamily(XComponent document) throws OfficeException { |
|
30 |
XServiceInfo serviceInfo = cast(XServiceInfo.class, document); |
|
31 |
if (serviceInfo.supportsService("com.sun.star.text.GenericTextDocument")) { |
|
32 |
// NOTE: a GenericTextDocument is either a TextDocument, a WebDocument, or a GlobalDocument |
|
33 |
// but this further distinction doesn't seem to matter for conversions |
|
34 |
return DocumentFamily.TEXT; |
|
35 |
} |
|
36 |
else if (serviceInfo.supportsService("com.sun.star.sheet.SpreadsheetDocument")) { |
|
37 |
return DocumentFamily.SPREADSHEET; |
|
38 |
} |
|
39 |
else if (serviceInfo.supportsService("com.sun.star.presentation.PresentationDocument")) { |
|
40 |
return DocumentFamily.PRESENTATION; |
|
41 |
} |
|
42 |
else if (serviceInfo.supportsService("com.sun.star.drawing.DrawingDocument")) { |
|
43 |
return DocumentFamily.DRAWING; |
|
44 |
} |
|
45 |
else { |
|
46 |
throw new OfficeException("document of unknown family: " + serviceInfo.getImplementationName()); |
|
47 |
} |
|
48 |
} |
|
49 |
|
|
47 | 50 |
} |
tmp/org.txm.jodconverter.core/src/main/java/org/artofsolving/jodconverter/office/ManagedOfficeProcessSettings.java (revision 2406) | ||
---|---|---|
18 | 18 |
import org.artofsolving.jodconverter.process.PureJavaProcessManager; |
19 | 19 |
|
20 | 20 |
class ManagedOfficeProcessSettings { |
21 |
|
|
22 |
public static final long DEFAULT_RETRY_INTERVAL = 250L; |
|
23 |
|
|
24 |
private final UnoUrl unoUrl; |
|
25 |
private File officeHome = OfficeUtils.getDefaultOfficeHome(); |
|
26 |
private String[] runAsArgs; |
|
27 |
private File templateProfileDir; |
|
28 |
private File workDir = new File(System.getProperty("java.io.tmpdir")); |
|
29 |
private ProcessManager processManager = new PureJavaProcessManager(); |
|
30 |
private long retryTimeout = DefaultOfficeManagerConfiguration.DEFAULT_RETRY_TIMEOUT; |
|
31 |
private long retryInterval = DEFAULT_RETRY_INTERVAL; |
|
32 |
|
|
33 |
public ManagedOfficeProcessSettings(UnoUrl unoUrl) { |
|
34 |
this.unoUrl = unoUrl; |
|
35 |
} |
|
36 |
|
|
37 |
public UnoUrl getUnoUrl() { |
|
38 |
return unoUrl; |
|
39 |
} |
|
40 |
|
|
41 |
public File getOfficeHome() { |
|
42 |
return officeHome; |
|
43 |
} |
|
44 |
|
|
45 |
public void setOfficeHome(File officeHome) { |
|
46 |
this.officeHome = officeHome; |
|
47 |
} |
|
48 |
|
|
49 |
public String[] getRunAsArgs() { |
|
21 |
|
|
22 |
public static final long DEFAULT_RETRY_INTERVAL = 250L; |
|
23 |
|
|
24 |
private final UnoUrl unoUrl; |
|
25 |
|
|
26 |
private File officeHome = OfficeUtils.getDefaultOfficeHome(); |
|
27 |
|
|
28 |
private String[] runAsArgs; |
|
29 |
|
|
30 |
private File templateProfileDir; |
|
31 |
|
|
32 |
private File workDir = new File(System.getProperty("java.io.tmpdir")); |
|
33 |
|
|
34 |
private ProcessManager processManager = new PureJavaProcessManager(); |
|
35 |
|
|
36 |
private long retryTimeout = DefaultOfficeManagerConfiguration.DEFAULT_RETRY_TIMEOUT; |
|
37 |
|
|
38 |
private long retryInterval = DEFAULT_RETRY_INTERVAL; |
|
39 |
|
|
40 |
public ManagedOfficeProcessSettings(UnoUrl unoUrl) { |
|
41 |
this.unoUrl = unoUrl; |
|
42 |
} |
|
43 |
|
|
44 |
public UnoUrl getUnoUrl() { |
|
45 |
return unoUrl; |
|
46 |
} |
|
47 |
|
|
48 |
public File getOfficeHome() { |
|
49 |
return officeHome; |
|
50 |
} |
|
51 |
|
|
52 |
public void setOfficeHome(File officeHome) { |
|
53 |
this.officeHome = officeHome; |
|
54 |
} |
|
55 |
|
|
56 |
public String[] getRunAsArgs() { |
|
50 | 57 |
return runAsArgs; |
51 | 58 |
} |
52 |
|
|
53 |
public void setRunAsArgs(String[] runAsArgs) {
|
|
59 |
|
|
60 |
public void setRunAsArgs(String[] runAsArgs) {
|
|
54 | 61 |
this.runAsArgs = runAsArgs; |
55 | 62 |
} |
56 |
|
|
57 |
public File getTemplateProfileDir() {
|
|
58 |
return templateProfileDir;
|
|
59 |
}
|
|
60 |
|
|
61 |
public void setTemplateProfileDir(File templateProfileDir) {
|
|
62 |
this.templateProfileDir = templateProfileDir;
|
|
63 |
}
|
|
64 |
|
|
65 |
public File getWorkDir() {
|
|
66 |
return workDir;
|
|
67 |
}
|
|
68 |
|
|
69 |
public void setWorkDir(File workDir) {
|
|
70 |
this.workDir = workDir;
|
|
71 |
}
|
|
72 |
|
|
73 |
public ProcessManager getProcessManager() {
|
|
74 |
return processManager;
|
|
75 |
}
|
|
76 |
|
|
77 |
public void setProcessManager(ProcessManager processManager) {
|
|
78 |
this.processManager = processManager;
|
|
79 |
}
|
|
80 |
|
|
81 |
public long getRetryTimeout() {
|
|
82 |
return retryTimeout;
|
|
83 |
}
|
|
84 |
|
|
85 |
public void setRetryTimeout(long retryTimeout) {
|
|
86 |
this.retryTimeout = retryTimeout;
|
|
87 |
}
|
|
88 |
|
|
89 |
public long getRetryInterval() {
|
|
90 |
return retryInterval;
|
|
91 |
}
|
|
92 |
|
|
93 |
public void setRetryInterval(long retryInterval) {
|
|
94 |
this.retryInterval = retryInterval;
|
|
95 |
}
|
|
96 |
|
|
63 |
|
|
64 |
public File getTemplateProfileDir() {
|
|
65 |
return templateProfileDir;
|
|
66 |
}
|
|
67 |
|
|
68 |
public void setTemplateProfileDir(File templateProfileDir) {
|
|
69 |
this.templateProfileDir = templateProfileDir;
|
|
70 |
}
|
|
71 |
|
|
72 |
public File getWorkDir() {
|
|
73 |
return workDir;
|
|
74 |
}
|
|
75 |
|
|
76 |
public void setWorkDir(File workDir) {
|
|
77 |
this.workDir = workDir;
|
|
78 |
}
|
|
79 |
|
|
80 |
public ProcessManager getProcessManager() {
|
|
81 |
return processManager;
|
|
82 |
}
|
|
83 |
|
|
84 |
public void setProcessManager(ProcessManager processManager) {
|
|
85 |
this.processManager = processManager;
|
|
86 |
}
|
|
87 |
|
|
88 |
public long getRetryTimeout() {
|
|
89 |
return retryTimeout;
|
|
90 |
}
|
|
91 |
|
|
92 |
public void setRetryTimeout(long retryTimeout) {
|
|
93 |
this.retryTimeout = retryTimeout;
|
|
94 |
}
|
|
95 |
|
|
96 |
public long getRetryInterval() {
|
|
97 |
return retryInterval;
|
|
98 |
}
|
|
99 |
|
|
100 |
public void setRetryInterval(long retryInterval) {
|
|
101 |
this.retryInterval = retryInterval;
|
|
102 |
}
|
|
103 |
|
|
97 | 104 |
} |
tmp/org.txm.jodconverter.core/src/main/java/org/artofsolving/jodconverter/office/Retryable.java (revision 2406) | ||
---|---|---|
13 | 13 |
package org.artofsolving.jodconverter.office; |
14 | 14 |
|
15 | 15 |
abstract class Retryable { |
16 |
|
|
17 |
/** |
|
18 |
* @throws TemporaryException for an error condition that can be temporary - i.e. retrying later could be successful |
|
19 |
* @throws Exception for all other error conditions |
|
20 |
*/ |
|
21 |
protected abstract void attempt() throws TemporaryException, Exception; |
|
22 |
|
|
23 |
public void execute(long interval, long timeout) throws RetryTimeoutException, Exception { |
|
24 |
execute(0L, interval, timeout); |
|
25 |
} |
|
26 |
|
|
27 |
public void execute(long delay, long interval, long timeout) throws RetryTimeoutException, Exception { |
|
28 |
long start = System.currentTimeMillis(); |
|
29 |
if (delay > 0L) { |
|
30 |
sleep(delay); |
|
31 |
} |
|
32 |
while (true) { |
|
33 |
try { |
|
34 |
attempt(); |
|
35 |
return; |
|
36 |
} catch (TemporaryException temporaryException) { |
|
37 |
if (System.currentTimeMillis() - start < timeout) { |
|
38 |
sleep(interval); |
|
39 |
// continue |
|
40 |
} else { |
|
41 |
throw new RetryTimeoutException(temporaryException.getCause()); |
|
42 |
} |
|
43 |
} |
|
44 |
} |
|
45 |
} |
|
46 |
|
|
47 |
private void sleep(long millis) { |
|
48 |
try { |
|
49 |
Thread.sleep(millis); |
|
50 |
} catch (InterruptedException interruptedException) { |
|
51 |
// continue |
|
52 |
} |
|
53 |
} |
|
54 |
|
|
16 |
|
|
17 |
/** |
|
18 |
* @throws TemporaryException for an error condition that can be temporary - i.e. retrying later could be successful |
|
19 |
* @throws Exception for all other error conditions |
|
20 |
*/ |
|
21 |
protected abstract void attempt() throws TemporaryException, Exception; |
|
22 |
|
|
23 |
public void execute(long interval, long timeout) throws RetryTimeoutException, Exception { |
|
24 |
execute(0L, interval, timeout); |
|
25 |
} |
|
26 |
|
|
27 |
public void execute(long delay, long interval, long timeout) throws RetryTimeoutException, Exception { |
|
28 |
long start = System.currentTimeMillis(); |
|
29 |
if (delay > 0L) { |
|
30 |
sleep(delay); |
|
31 |
} |
|
32 |
while (true) { |
|
33 |
try { |
|
34 |
attempt(); |
Formats disponibles : Unified diff