2013-04-11 4 views
0

로컬 객체에 대해 휴대용 인터셉터를 사용하는 방법이 JacorB 3에서 변경되었습니다. 릴리스 노트에 " 로컬 객체에 대해 올바르게 구현 된 휴대용 인터셉터" 이 새로운 구현으로 인해 문제가 발생하는 것으로 보입니다. GssUpClient.bat 후JacORB 3.x에서 로컬 객체에 대한 휴대용 인터셉터의 사용이 부숴 졌습니까?

public class GssUpServer extends SASDemoPOA { 

     private ORB orb; 
     private boolean calledPrintSAS = false; // added 

     public GssUpServer(ORB orb) { 
      this.orb = orb; 
     } 

     public void printSAS() { 
      try { 
       org.omg.PortableInterceptor.Current current = (org.omg.PortableInterceptor.Current) orb 
         .resolve_initial_references("PICurrent"); 
       org.omg.CORBA.Any anyName = current 
         .get_slot(org.jacorb.security.sas.SASInitializer.sasPrincipalNamePIC); 
       if (anyName.type().kind().value() == org.omg.CORBA.TCKind._tk_null) { 
        System.out.println("Null Name"); 
       } else { 
        String name = anyName.extract_string(); 
        System.out.println("printSAS for user " + name); 
       } 

       // /* added 
       if (!calledPrintSAS) { 
        calledPrintSAS = true;      
        // local call, (JacORB 3.x: throws NPE from SASClientInterceptor) 
        _this().printSAS(); 
       } 
       // */ 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
... 
} 

스택 트레이스 :

2013-04-11 11:01:24.968 SEVERE unexpected exception during servant_preinvoke    org.jacorb.security.sas.SASClientInterceptor.send_request(SASClientInterceptor.java:194) 
org.jacorb.orb.portableInterceptor.ClientInterceptorIterator.invoke(ClientInterceptorIterator.java:129) 
org.jacorb.orb.portableInterceptor.AbstractInterceptorIterator.iterate(AbstractInterceptorIterator.java:66) 
org.jacorb.orb.portableInterceptor.ClientInterceptorIterator.iterate(ClientInterceptorIterator.java:87) 
org.jacorb.orb.DefaultClientInterceptorHandler.invokeInterceptors(DefaultClientInterceptorHandler.java:328) 
org.jacorb.orb.DefaultClientInterceptorHandler.handle_send_request(DefaultClientInterceptorHandler.java:132) 
org.jacorb.orb.Delegate.servant_preinvoke(Delegate.java:2505) 
org.omg.CORBA.portable.ObjectImpl._servant_preinvoke(ObjectImpl.java:135) 
org.jacorb.demo.sas._SASDemoStub.printSAS(_SASDemoStub.java:73) 
org.jacorb.demo.sas.GssUpServer.printSAS(GssUpServer.java:46) 
org.jacorb.demo.sas.SASDemoPOA._invoke(SASDemoPOA.java:47) 
org.jacorb.poa.RequestProcessor.invokeOperation(RequestProcessor.java:348) 
org.jacorb.poa.RequestProcessor.process(RequestProcessor.java:670) 
org.jacorb.poa.RequestProcessor.run(RequestProcessor.java:820) 
java.lang.NullPointerException 
    at org.jacorb.security.sas.SASClientInterceptor.send_request(SASClientInterceptor.java:194) 
    at org.jacorb.orb.portableInterceptor.ClientInterceptorIterator.invoke(ClientInterceptorIterator.java:129) 
    at org.jacorb.orb.portableInterceptor.AbstractInterceptorIterator.iterate(AbstractInterceptorIterator.java:66) 
    at org.jacorb.orb.portableInterceptor.ClientInterceptorIterator.iterate(ClientInterceptorIterator.java:87) 
    at org.jacorb.orb.DefaultClientInterceptorHandler.invokeInterceptors(DefaultClientInterceptorHandler.java:328) 
    at org.jacorb.orb.DefaultClientInterceptorHandler.handle_send_request(DefaultClientInterceptorHandler.java:132) 
    at org.jacorb.orb.Delegate.servant_preinvoke(Delegate.java:2505) 
    at org.omg.CORBA.portable.ObjectImpl._servant_preinvoke(ObjectImpl.java:135) 
    at org.jacorb.demo.sas._SASDemoStub.printSAS(_SASDemoStub.java:73) 
    at org.jacorb.demo.sas.GssUpServer.printSAS(GssUpServer.java:46) 
    at org.jacorb.demo.sas.SASDemoPOA._invoke(SASDemoPOA.java:47) 
    at org.jacorb.poa.RequestProcessor.invokeOperation(RequestProcessor.java:348) 
    at org.jacorb.poa.RequestProcessor.process(RequestProcessor.java:670) 
    at org.jacorb.poa.RequestProcessor.run(RequestProcessor.java:820) 
문제 를 재현하는 가장 쉬운 방법은 SAS-데모에서합니다 (jacorb와 함께 제공되는 하나)을 GssUpServer.java을 수정하는 것입니다

위의 코드는 JacORB 2.3.1에서 완벽하게 작동합니다. 이 문제의 간단한 해결 방법은 속성 jacorb.isLocalHistoricalInterceptors을 true로 설정하는 것입니다. 그러나 특정 "기본 제공"방법 (예 : _is_a())은이 플래그를 사용하지 않으므로 (해당 방법은 is_really_local()을 사용하여 개체 지역을 직접 확인하기 때문에). 이러한 "기본 제공"메서드 호출은 로컬에서 호출 할 때 절대로 인터셉터를 사용하지 않았던 것으로 보입니다.

그래서 나의 관찰은 다음과 같습니다

  1. JacORB 3.x를 지역 통화에 대한 몇 가지 휴대용 인터셉터을 깰 것으로 보인다 (정확히 말하면, 연결 객체가 필요 인터셉터 ...)
  2. JacORB 3 .x와는 _is_a(), _non_existent(), _interface()로 만든 지역 통화 휴대용 인터셉터를 사용하는 최초의 JacORB 것 같다 _get_component()

JacORB 3.x가 이전 버전으로 작동하도록하는 속성이 있기 때문에 첫 번째 문제는 해결할 수 있습니다. 두 번째 것은 (첫 번째와 결합 된) 정말로 번거로운 것 같습니다.

누구도 이런 종류의 행동을 알아 차렸고 이것이 용의자가 JacORB 3.x에서 실제로 결함인지 또는 내가 놓친 것이 있는지 확인할 수 있습니까?

답변

0

로컬 호출이 가능한 휴대용 인터셉터가 올바르게 작동해야합니다. 이것은 버그 같은데. 실제로는 Using AMI+BiDir with jacorb처럼 들립니다. 나는 또한 입력했다 http://www.jacorb.org/bugzilla/show_bug.cgi?id=957

+0

나는 두렵다 나는 이것을 늦게 대답을 볼; 공식 JacorB 메일 링리스트는 http://www.jacorb.org/contact.html이고 bugzilla는 http://www.jacorb.org/bugzilla입니다. –

+0

고마워요! 우리는이 소프트웨어에 대한 빠른 패치를 작성한 후이 문제를 잊어 버렸습니다. 나는 아마 당신의 bugzilla를 바로 사용 했어야합니다 :) –