Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Squashed commit of the following:
Browse files Browse the repository at this point in the history
commit 2352b63
Author: Patrick Huang <pahuang@redhat.com>
Date:   Wed Jul 30 09:10:54 2014 +1000

    fix classloading issue

commit c1b0728
Author: Patrick Huang <pahuang@redhat.com>
Date:   Tue Jul 29 11:21:44 2014 +1000

    rhbz1011310 - provide better error message when email service is down
  • Loading branch information
Patrick Huang committed Jul 30, 2014
1 parent 05e31c2 commit 87695aa
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 20 deletions.
6 changes: 6 additions & 0 deletions zanata-war/src/main/java/org/zanata/email/EmailBuilder.java
Expand Up @@ -4,6 +4,7 @@
import static javax.mail.Message.RecipientType.TO;

import java.io.StringWriter;
import java.net.ConnectException;

import javax.mail.MessagingException;
import javax.mail.Multipart;
Expand All @@ -14,6 +15,7 @@
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import com.google.common.base.Throwables;
import com.googlecode.totallylazy.collections.PersistentMap;
import lombok.AllArgsConstructor;

Expand Down Expand Up @@ -99,6 +101,10 @@ public void sendMessage(EmailStrategy strategy,
logMessage(email);
Transport.send(email);
} catch (MessagingException e) {
Throwable rootCause = Throwables.getRootCause(e);
if (rootCause.getClass().equals(ConnectException.class) && rootCause.getMessage().equals("Connection refused")) {
throw new RuntimeException("The system failed to connect to mail service. Please contact the administrator!");
}
throw new RuntimeException(e);
}
}
Expand Down
63 changes: 63 additions & 0 deletions zanata-war/src/test/java/org/ForceLoadClass.java
@@ -0,0 +1,63 @@
package org;

import org.zanata.seam.SeamAutowire;
import com.google.common.base.Throwables;

/**
* This class is to make sure SeamAutowire is loaded earlier. If class
* org.jboss.seam.contexts.Contexts is loaded before SeamAutoWire, there will be
* a nasty class loading exception.
*
* This seems to happen at random (i.e. failed on jenkins but not on my local
* machine or vice versa)
*
* <pre>
* An error occurred while instantiating class org.zanata.rest.service.CopyTransRestTest: null
* ...
* at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
* Caused by: java.lang.ExceptionInInitializerError
* at org.zanata.ZanataRestTest.<clinit>(ZanataRestTest.java:46)
* at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
* at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
* at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
* at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
* at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:29)
* at org.testng.internal.ClassHelper.createInstance1(ClassHelper.java:387)
* ... 21 more
* Caused by: java.lang.RuntimeException: Problem rewiring Seam's Contexts class
* at org.zanata.seam.SeamAutowire.rewireSeamContextsClass(SeamAutowire.java:378)
* at org.zanata.seam.SeamAutowire.<clinit>(SeamAutowire.java:85)
* ... 28 more
* Caused by: javassist.CannotCompileException: by java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader): attempted duplicate class definition for name: "org/jboss/seam/contexts/Contexts"
* at javassist.ClassPool.toClass(ClassPool.java:1089)
* at javassist.ClassPool.toClass(ClassPool.java:1032)
* at javassist.ClassPool.toClass(ClassPool.java:990)
* at javassist.CtClass.toClass(CtClass.java:1125)
* at org.zanata.seam.SeamAutowire.rewireSeamContextsClass(SeamAutowire.java:373)
* ... 29 more
* Caused by: java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader): attempted duplicate class definition for name: "org/jboss/seam/contexts/Contexts"
* at java.lang.ClassLoader.defineClass1(Native Method)
* at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
* at java.lang.ClassLoader.defineClass(ClassLoader.java:643)
* at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
* at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
* at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
* at java.lang.reflect.Method.invoke(Method.java:606)
* at javassist.ClassPool.toClass2(ClassPool.java:1102)
* at javassist.ClassPool.toClass(ClassPool.java:1083)
* ... 33 more
* </pre>
*
* @author Patrick Huang <a
* href="mailto:pahuang@redhat.com">pahuang@redhat.com</a>
*/
public class ForceLoadClass {
static {
try {
Class.forName(SeamAutowire.class.getCanonicalName());
}
catch (ClassNotFoundException e) {
throw Throwables.propagate(e);
}
}
}
2 changes: 1 addition & 1 deletion zanata-war/src/test/java/org/zanata/ZanataRestTest.java
Expand Up @@ -43,7 +43,7 @@ public abstract class ZanataRestTest extends ZanataDbunitJpaTest {
protected static final URI MOCK_BASE_URI = URI.create("http://mockhost");

private ClientRequestFactory clientRequestFactory;
private final SeamAutowire seamAutowire = SeamAutowire.instance();
private static final SeamAutowire seamAutowire = SeamAutowire.instance();
protected final Set<Class<? extends ExceptionMapper<? extends Throwable>>> exceptionMappers =
new HashSet<Class<? extends ExceptionMapper<? extends Throwable>>>();
protected final Set<Object> resources = new HashSet<Object>();
Expand Down
Expand Up @@ -6,12 +6,14 @@
import java.util.Arrays;
import java.util.List;

import org.ForceLoadClass;
import org.jboss.seam.mock.AbstractSeamTest;
import org.testng.IAnnotationTransformer;
import org.testng.annotations.ITestAnnotation;

@SuppressWarnings("rawtypes")
public class TestTransformer implements IAnnotationTransformer {
private static final ForceLoadClass forceLoadClass = new ForceLoadClass();
private static final String UNIT_TESTS = "unit-tests";
private static final boolean WARN_ABOUT_MISSING_GROUP = false;

Expand Down
Expand Up @@ -40,7 +40,7 @@ public class GetTransMemoryHandlerTest {
private LocaleId targetLocaleId = new LocaleId("ja");
private LocaleId sourceLocaleId = LocaleId.EN_US;

private SeamAutowire seam = SeamAutowire.instance();
private static final SeamAutowire seam = SeamAutowire.instance();

@BeforeMethod
public void setUp() throws Exception {
Expand Down
Expand Up @@ -50,6 +50,7 @@
@Test(groups = { "jpa-tests" })
@Slf4j
public class GetTransUnitListHandlerTest extends ZanataDbunitJpaTest {

private GetTransUnitListHandler handler;
@Mock
private ZanataIdentity identity;
Expand All @@ -61,6 +62,7 @@ public class GetTransUnitListHandlerTest extends ZanataDbunitJpaTest {
private final DocumentInfo document = TestFixture.documentInfo(1L, "");
private final LocaleId localeId = new LocaleId("ja");
private HLocale jaHLocale;
private SeamAutowire seam = SeamAutowire.instance();

@Override
protected void prepareDBUnitOperations() {
Expand All @@ -78,24 +80,21 @@ public void setUp() throws Exception {
SeamAutowire.instance().reset().use("resourceUtils", resourceUtils)
.autowire(TransUnitTransformer.class);

SeamAutowire seam =
SeamAutowire
.instance()
.use("localeServiceImpl", localeService)
.use("documentDAO", new DocumentDAO(getSession()))
.use("projectIterationDAO",
new ProjectIterationDAO(getSession()))
.use("entityManager",
new FullTextEntityManagerImpl(getEm()))
.use("session", new FullTextSessionImpl(getSession()))
.use("identity", identity)
.use("textFlowDAO", new TextFlowDAO(getSession()))
.use("transUnitTransformer", transUnitTransformer)
.use("webtrans.gwt.GetTransUnitsNavigationHandler",
getTransUnitsNavigationService)
.useImpl(TranslationStateCacheImpl.class)
.useImpl(TextFlowSearchServiceImpl.class)
.useImpl(ValidationServiceImpl.class).allowCycles();
seam.use("localeServiceImpl", localeService)
.use("documentDAO", new DocumentDAO(getSession()))
.use("projectIterationDAO",
new ProjectIterationDAO(getSession()))
.use("entityManager",
new FullTextEntityManagerImpl(getEm()))
.use("session", new FullTextSessionImpl(getSession()))
.use("identity", identity)
.use("textFlowDAO", new TextFlowDAO(getSession()))
.use("transUnitTransformer", transUnitTransformer)
.use("webtrans.gwt.GetTransUnitsNavigationHandler",
getTransUnitsNavigationService)
.useImpl(TranslationStateCacheImpl.class)
.useImpl(TextFlowSearchServiceImpl.class)
.useImpl(ValidationServiceImpl.class).allowCycles();

// @formatter:off
handler = seam.autowire(GetTransUnitListHandler.class);
Expand Down

0 comments on commit 87695aa

Please sign in to comment.