Пример #1
0
        public static List <ServiceOfferDesc> FindOffer(OfferRegistry offers,
                                                        ServiceProperty[] search, int count, int tries, int interval)
        {
            OrbServices             orb   = OrbServices.GetSingleton();
            List <ServiceOfferDesc> found = new List <ServiceOfferDesc>();

            for (int i = 0; i < tries; i++)
            {
                found.Clear();
                Thread.Sleep(interval * 1000);
                ServiceOfferDesc[] services = offers.findServices(search);
                if (services.Length > 0)
                {
                    foreach (ServiceOfferDesc offerDesc in services)
                    {
                        try {
                            if (!orb.non_existent(offerDesc.service_ref))
                            {
                                found.Add(offerDesc);
                            }
                        }
                        catch (Exception) {
                            // não adiciona essa oferta
                        }
                    }
                }
                if (found.Count >= count)
                {
                    return(found);
                }
            }
            StringBuilder buffer = new StringBuilder();

            foreach (ServiceOfferDesc desc in found)
            {
                String name  = GetProperty(desc.properties, "openbus.offer.entity");
                String login = GetProperty(desc.properties, "openbus.offer.login");
                buffer.AppendFormat("\n - {0} ({1})", name, login);
            }
            String msg =
                String
                .Format(
                    "Não foi possível encontrar ofertas: found ({0}) expected({1}) tries ({2}) time ({3}){4}",
                    found.Count, count, tries, tries * interval, buffer);

            throw new InvalidOperationException(msg);
        }
        private static void Main(String[] args)
        {
            // Registra handler para o caso do processo ser finalizado
            AppDomain.CurrentDomain.ProcessExit += CurrentDomainProcessExit;

            // Obtém dados através dos argumentos
            string host   = args[0];
            ushort port   = Convert.ToUInt16(args[1]);
            string entity = args[2];
            AsymmetricCipherKeyPair privateKey = Crypto.ReadKeyFile(args[3]);

            // Cria o componente que responde em inglês
            ORBInitializer.InitORB();
            ComponentContext english =
                new DefaultComponentContext(new ComponentId("english", 1, 0, 0, ".net"));

            english.AddFacet("GoodMorning",
                             Repository.GetRepositoryID(typeof(Greetings)),
                             new GreetingsImpl(GreetingsImpl.Language.English,
                                               GreetingsImpl.Period.Morning));
            english.AddFacet("GoodAfternoon",
                             Repository.GetRepositoryID(typeof(Greetings)),
                             new GreetingsImpl(GreetingsImpl.Language.English,
                                               GreetingsImpl.Period.Afternoon));
            english.AddFacet("GoodNight",
                             Repository.GetRepositoryID(typeof(Greetings)),
                             new GreetingsImpl(GreetingsImpl.Language.English,
                                               GreetingsImpl.Period.Night));

            // Cria o componente que responde em espanhol
            ComponentContext spanish =
                new DefaultComponentContext(new ComponentId("spanish", 1, 0, 0, ".net"));

            spanish.AddFacet("GoodMorning",
                             Repository.GetRepositoryID(typeof(Greetings)),
                             new GreetingsImpl(GreetingsImpl.Language.Spanish,
                                               GreetingsImpl.Period.Morning));
            spanish.AddFacet("GoodAfternoon",
                             Repository.GetRepositoryID(typeof(Greetings)),
                             new GreetingsImpl(GreetingsImpl.Language.Spanish,
                                               GreetingsImpl.Period.Afternoon));
            spanish.AddFacet("GoodNight",
                             Repository.GetRepositoryID(typeof(Greetings)),
                             new GreetingsImpl(GreetingsImpl.Language.Spanish,
                                               GreetingsImpl.Period.Night));

            // Cria o componente que responde em português
            ComponentContext portuguese =
                new DefaultComponentContext(new ComponentId("portuguese", 1, 0, 0,
                                                            ".net"));

            portuguese.AddFacet("GoodMorning",
                                Repository.GetRepositoryID(typeof(Greetings)),
                                new GreetingsImpl(GreetingsImpl.Language.Portuguese,
                                                  GreetingsImpl.Period.Morning));
            portuguese.AddFacet("GoodAfternoon",
                                Repository.GetRepositoryID(typeof(Greetings)),
                                new GreetingsImpl(GreetingsImpl.Language.Portuguese,
                                                  GreetingsImpl.Period.Afternoon));
            portuguese.AddFacet("GoodNight",
                                Repository.GetRepositoryID(typeof(Greetings)),
                                new GreetingsImpl(GreetingsImpl.Language.Portuguese,
                                                  GreetingsImpl.Period.Night));

            // Define propriedade para as ofertas de serviço a serem registradas no barramento
            ServiceProperty[] properties =
            {
                new ServiceProperty("offer.domain",
                                    "Demo Greetings")
            };

            // Cria conexão e a define como conexão padrão tanto para entrada como saída.
            // O uso exclusivo da conexão padrão (sem uso de current e callback de despacho) só é recomendado para aplicações que criem apenas uma conexão e desejem utilizá-la em todos os casos. Para situações diferentes, consulte o manual do SDK OpenBus e/ou outras demos.
            OpenBusContext context = ORBInitializer.Context;

            _conn = context.ConnectByAddress(host, port);
            context.SetDefaultConnection(_conn);

            bool failed = true;

            try {
                // Faz o login
                _conn.LoginByCertificate(entity, privateKey);
                // Registra as ofertas no barramento
                OfferRegistry registry = context.OfferRegistry;
                Offers.Add(registry.registerService(english.GetIComponent(), properties));
                Offers.Add(registry.registerService(spanish.GetIComponent(), properties));
                Offers.Add(registry.registerService(portuguese.GetIComponent(),
                                                    properties));
                failed = false;
            }
            // Login
            catch (AccessDenied) {
                Console.WriteLine(Resources.ServerAccessDenied);
            }
            catch (MissingCertificate) {
                Console.WriteLine(Resources.MissingCertificateForEntity + entity);
            }
            // Registro
            catch (UnauthorizedFacets) {
                Console.WriteLine(Resources.UnauthorizedFacets);
            }
            // Barramento
            catch (ServiceFailure e) {
                Console.WriteLine(Resources.BusServiceFailureErrorMsg);
                Console.WriteLine(e);
            }
            catch (TRANSIENT) {
                Console.WriteLine(Resources.BusTransientErrorMsg);
            }
            catch (COMM_FAILURE) {
                Console.WriteLine(Resources.BusCommFailureErrorMsg);
            }
            catch (Exception e) {
                NO_PERMISSION npe = null;
                if (e is TargetInvocationException)
                {
                    // caso seja uma exceção lançada pelo SDK, será uma NO_PERMISSION
                    npe = e.InnerException as NO_PERMISSION;
                }
                if ((npe == null) && (!(e is NO_PERMISSION)))
                {
                    // caso não seja uma NO_PERMISSION não é uma exceção esperada então deixamos passar.
                    throw;
                }
                npe = npe ?? (NO_PERMISSION)e;
                if (npe.Minor == NoLoginCode.ConstVal)
                {
                    Console.WriteLine(Resources.NoLoginCodeErrorMsg);
                }
                else
                {
                    throw;
                }
            }
            finally {
                if (failed)
                {
                    Exit(1);
                }
            }

            // Mantém a thread ativa para aguardar requisições
            Console.WriteLine(Resources.ServerOK);
            Thread.Sleep(Timeout.Infinite);
        }
Пример #3
0
        private static void Main(String[] args)
        {
            // Registra handler para o caso do processo ser finalizado
            AppDomain.CurrentDomain.ProcessExit += CurrentDomainProcessExit;

            // Obtém dados através dos argumentos
            string host   = args[0];
            ushort port   = Convert.ToUInt16(args[1]);
            string entity = args[2];
            AsymmetricCipherKeyPair privateKey = Crypto.ReadKeyFile(args[3]);

            // Cria o componente que conterá as facetas do servidor
            ORBInitializer.InitORB();
            ComponentContext component =
                new DefaultComponentContext(new ComponentId("messengerproxy", 1, 0, 0,
                                                            ".net"));

            // Cria a faceta Messenger para o componente
            string messengerIDLType = Repository.GetRepositoryID(typeof(Messenger));

            component.AddFacet("Messenger", messengerIDLType, new ProxyMessengerImpl());

            // Define propriedades para a oferta de serviço a ser registrada no barramento
            IComponent      ic    = component.GetIComponent();
            ServiceProperty prop1 = new ServiceProperty("offer.domain",
                                                        "Demo CallChain");
            ServiceProperty prop2 = new ServiceProperty("offer.role",
                                                        "mensageiro proxy");

            ServiceProperty[] properties = { prop1, prop2 };

            // Cria conexão e a define como conexão padrão tanto para entrada como saída.
            // O uso exclusivo da conexão padrão (sem uso de current e callback de despacho) só é recomendado para aplicações que criem apenas uma conexão e desejem utilizá-la em todos os casos. Para situações diferentes, consulte o manual do SDK OpenBus e/ou outras demos.
            OpenBusContext context = ORBInitializer.Context;

            _conn = context.ConnectByAddress(host, port);
            context.SetDefaultConnection(_conn);

            bool failed = true;

            try {
                // Faz o login
                _conn.LoginByCertificate(entity, privateKey);
                // Busca o Messenger real
                OfferRegistry   offerRegistry = context.OfferRegistry;
                ServiceProperty autoProp      =
                    new ServiceProperty("openbus.component.interface", messengerIDLType);
                ServiceProperty   findProp  = new ServiceProperty("offer.role", "mensageiro real");
                ServiceProperty[] findProps = { autoProp, findProp, prop1 };
                Offers = offerRegistry.findServices(findProps);
                // Registra a própria oferta no barramento
                _offer = offerRegistry.registerService(ic, properties);
                failed = false;
            }
            // Login
            catch (AccessDenied) {
                Console.WriteLine(Resources.ServerAccessDenied);
            }
            catch (MissingCertificate) {
                Console.WriteLine(Resources.MissingCertificateForEntity + entity);
            }
            // Registro
            catch (UnauthorizedFacets) {
                Console.WriteLine(Resources.UnauthorizedFacets);
            }
            // Barramento
            catch (ServiceFailure e) {
                Console.WriteLine(Resources.BusServiceFailureErrorMsg);
                Console.WriteLine(e);
            }
            catch (TRANSIENT) {
                Console.WriteLine(Resources.BusTransientErrorMsg);
            }
            catch (COMM_FAILURE) {
                Console.WriteLine(Resources.BusCommFailureErrorMsg);
            }
            catch (Exception e) {
                NO_PERMISSION npe = null;
                if (e is TargetInvocationException)
                {
                    // caso seja uma exceção lançada pelo SDK, será uma NO_PERMISSION
                    npe = e.InnerException as NO_PERMISSION;
                }
                if ((npe == null) && (!(e is NO_PERMISSION)))
                {
                    // caso não seja uma NO_PERMISSION não é uma exceção esperada então deixamos passar.
                    throw;
                }
                npe = npe ?? (NO_PERMISSION)e;
                if (npe.Minor == NoLoginCode.ConstVal)
                {
                    Console.WriteLine(Resources.NoLoginCodeErrorMsg);
                }
                else
                {
                    throw;
                }
            }
            finally {
                if (failed)
                {
                    Exit(1);
                }
            }

            // Mantém a thread ativa para aguardar requisições
            Console.WriteLine(Resources.CallChainProxyOK);
            Thread.Sleep(Timeout.Infinite);
        }