Search in sources :

Example 11 with NamedAddressSpace

use of org.apache.qpid.server.model.NamedAddressSpace in project qpid-broker-j by apache.

the class VirtualHostAliasTest method testDefaultAliases_DefaultVirtualHostAlias.

public void testDefaultAliases_DefaultVirtualHostAlias() {
    // test the default vhost resolution
    NamedAddressSpace addressSpace = _port.getAddressSpace("");
    assertNotNull(addressSpace);
    assertEquals(_vhosts.get("black"), addressSpace);
}
Also used : NamedAddressSpace(org.apache.qpid.server.model.NamedAddressSpace)

Example 12 with NamedAddressSpace

use of org.apache.qpid.server.model.NamedAddressSpace in project qpid-broker-j by apache.

the class ServerConnectionDelegate method connectionOpen.

@Override
public void connectionOpen(ServerConnection sconn, ConnectionOpen open) {
    assertState(sconn, ConnectionState.AWAIT_OPEN);
    NamedAddressSpace addressSpace;
    String vhostName;
    if (open.hasVirtualHost()) {
        vhostName = open.getVirtualHost();
    } else {
        vhostName = "";
    }
    AmqpPort port = sconn.getPort();
    addressSpace = port.getAddressSpace(vhostName);
    if (addressSpace != null) {
        if (!addressSpace.isActive()) {
            sconn.setState(ServerConnection.State.CLOSING);
            final String redirectHost = addressSpace.getRedirectHost(port);
            if (redirectHost == null) {
                sconn.sendConnectionClose(ConnectionCloseCode.CONNECTION_FORCED, "Virtual host '" + vhostName + "' is not active");
            } else {
                sconn.invoke(new ConnectionRedirect(redirectHost, new ArrayList<Object>()));
            }
            return;
        }
        try {
            sconn.setVirtualHost(addressSpace);
            if (!addressSpace.authoriseCreateConnection(sconn.getAmqpConnection())) {
                sconn.setState(ServerConnection.State.CLOSING);
                sconn.sendConnectionClose(ConnectionCloseCode.CONNECTION_FORCED, "Connection not authorized");
                return;
            }
        } catch (AccessControlException | VirtualHostUnavailableException e) {
            sconn.setState(ServerConnection.State.CLOSING);
            sconn.sendConnectionClose(ConnectionCloseCode.CONNECTION_FORCED, e.getMessage());
            return;
        }
        sconn.setState(ServerConnection.State.OPEN);
        _state = ConnectionState.OPEN;
        sconn.invoke(new ConnectionOpenOk(Collections.emptyList()));
    } else {
        sconn.setState(ServerConnection.State.CLOSING);
        sconn.sendConnectionClose(ConnectionCloseCode.INVALID_PATH, "Unknown virtualhost '" + vhostName + "'");
    }
}
Also used : VirtualHostUnavailableException(org.apache.qpid.server.virtualhost.VirtualHostUnavailableException) NamedAddressSpace(org.apache.qpid.server.model.NamedAddressSpace) ArrayList(java.util.ArrayList) AccessControlException(java.security.AccessControlException) AmqpPort(org.apache.qpid.server.model.port.AmqpPort)

Example 13 with NamedAddressSpace

use of org.apache.qpid.server.model.NamedAddressSpace in project qpid-broker-j by apache.

the class ServerSessionDelegate method getDestinationForMessage.

private MessageDestination getDestinationForMessage(ServerSession ssn, MessageTransfer xfr) {
    NamedAddressSpace addressSpace = getAddressSpace(ssn);
    MessageDestination destination;
    if (xfr.hasDestination()) {
        destination = addressSpace.getAttainedMessageDestination(xfr.getDestination());
        if (destination == null) {
            destination = addressSpace.getDefaultDestination();
        } else {
            Header header = xfr.getHeader();
            DeliveryProperties delvProps;
            if (header == null) {
                delvProps = new DeliveryProperties();
                header = new Header(delvProps, null, null);
                xfr.setHeader(header);
            } else if (header.getDeliveryProperties() == null) {
                delvProps = new DeliveryProperties();
                header = new Header(delvProps, header.getMessageProperties(), header.getNonStandardProperties());
                xfr.setHeader(header);
            } else {
                delvProps = header.getDeliveryProperties();
            }
            if (delvProps.getExchange() == null && !xfr.getDestination().equals(delvProps.getRoutingKey())) {
                delvProps.setExchange(xfr.getDestination());
            }
        }
    } else if (xfr.getHeader() != null && xfr.getHeader().getDeliveryProperties() != null && xfr.getHeader().getDeliveryProperties().getExchange() != null) {
        destination = addressSpace.getAttainedMessageDestination(xfr.getHeader().getDeliveryProperties().getExchange());
    } else {
        destination = addressSpace.getDefaultDestination();
    }
    return destination;
}
Also used : MessageDestination(org.apache.qpid.server.message.MessageDestination) NamedAddressSpace(org.apache.qpid.server.model.NamedAddressSpace)

Example 14 with NamedAddressSpace

use of org.apache.qpid.server.model.NamedAddressSpace in project qpid-broker-j by apache.

the class ServerSessionDelegate method exchangeBind.

@Override
public void exchangeBind(ServerSession session, ExchangeBind method) {
    NamedAddressSpace addressSpace = getAddressSpace(session);
    if (!method.hasQueue()) {
        exception(session, method, ExecutionErrorCode.ILLEGAL_ARGUMENT, "queue not set");
    } else {
        final String exchangeName = method.getExchange();
        if (nameNullOrEmpty(exchangeName)) {
            exception(session, method, ExecutionErrorCode.INVALID_ARGUMENT, "Bind not allowed for default exchange");
        } else {
            // should raise exception ILLEGAL_ARGUMENT "binding-key not set"
            if (!method.hasBindingKey()) {
                method.setBindingKey(method.getQueue());
            }
            Queue<?> queue = getQueue(addressSpace, method.getQueue());
            Exchange<?> exchange = getExchange(addressSpace, exchangeName);
            if (queue == null) {
                exception(session, method, ExecutionErrorCode.NOT_FOUND, "Queue: '" + method.getQueue() + "' not found");
            } else if (exchange == null) {
                exception(session, method, ExecutionErrorCode.NOT_FOUND, "Exchange: '" + exchangeName + "' not found");
            } else if (exchange.getType().equals(ExchangeDefaults.HEADERS_EXCHANGE_CLASS) && (!method.hasArguments() || method.getArguments() == null || !method.getArguments().containsKey("x-match"))) {
                exception(session, method, ExecutionErrorCode.INTERNAL_ERROR, "Bindings to an exchange of type " + ExchangeDefaults.HEADERS_EXCHANGE_CLASS + " require an x-match header");
            } else {
                if (!exchange.isBound(method.getBindingKey(), method.getArguments(), queue)) {
                    try {
                        exchange.addBinding(method.getBindingKey(), queue, method.getArguments());
                    } catch (AccessControlException e) {
                        exception(session, method, ExecutionErrorCode.UNAUTHORIZED_ACCESS, e.getMessage());
                    }
                } else {
                // todo
                }
            }
        }
    }
}
Also used : NamedAddressSpace(org.apache.qpid.server.model.NamedAddressSpace) AccessControlException(java.security.AccessControlException)

Example 15 with NamedAddressSpace

use of org.apache.qpid.server.model.NamedAddressSpace in project qpid-broker-j by apache.

the class ServerSessionDelegate method messageSubscribe.

@Override
public void messageSubscribe(ServerSession session, MessageSubscribe method) {
    /*
          TODO - work around broken Python tests
          Correct code should read like
          if not hasAcceptMode() exception ILLEGAL_ARGUMENT "Accept-mode not supplied"
          else if not method.hasAcquireMode() exception ExecutionErrorCode.ILLEGAL_ARGUMENT, "Acquire-mode not supplied"
        */
    if (!method.hasAcceptMode()) {
        method.setAcceptMode(MessageAcceptMode.EXPLICIT);
    }
    if (!method.hasAcquireMode()) {
        method.setAcquireMode(MessageAcquireMode.PRE_ACQUIRED);
    }
    if (!method.hasQueue()) {
        exception(session, method, ExecutionErrorCode.ILLEGAL_ARGUMENT, "queue not supplied");
    } else {
        String destination = method.getDestination();
        if (destination == null) {
            exception(session, method, ExecutionErrorCode.INVALID_ARGUMENT, "Subscriber must provide a destination. The protocol specification marking the destination argument as optional is considered a mistake.");
        } else if (session.getSubscription(destination) != null) {
            exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Subscription already exists with destination '" + destination + "'");
        } else {
            String queueName = method.getQueue();
            NamedAddressSpace addressSpace = getAddressSpace(session);
            final Collection<MessageSource> sources = new HashSet<>();
            final MessageSource queue = addressSpace.getAttainedMessageSource(queueName);
            if (method.getArguments() != null && method.getArguments().get("x-multiqueue") instanceof Collection) {
                for (Object object : (Collection<Object>) method.getArguments().get("x-multiqueue")) {
                    String sourceName = String.valueOf(object);
                    sourceName = sourceName.trim();
                    if (sourceName.length() != 0) {
                        MessageSource source = addressSpace.getAttainedMessageSource(sourceName);
                        if (source == null) {
                            sources.clear();
                            break;
                        } else {
                            sources.add(source);
                        }
                    }
                }
                queueName = method.getArguments().get("x-multiqueue").toString();
            } else if (queue != null) {
                sources.add(queue);
            }
            if (sources.isEmpty()) {
                exception(session, method, ExecutionErrorCode.NOT_FOUND, "Queue: " + queueName + " not found");
            } else if (!verifySessionAccess(session, sources)) {
                exception(session, method, ExecutionErrorCode.RESOURCE_LOCKED, "Exclusive Queue: " + queueName + " owned exclusively by another session");
            } else {
                ProtocolEngine protocolEngine = getServerConnection(session).getAmqpConnection();
                FlowCreditManager_0_10 creditManager = new WindowCreditManager(0L, 0L);
                FilterManager filterManager = null;
                try {
                    filterManager = FilterManagerFactory.createManager(method.getArguments());
                } catch (AMQInvalidArgumentException amqe) {
                    exception(session, method, ExecutionErrorCode.ILLEGAL_ARGUMENT, "Exception Creating FilterManager");
                    return;
                }
                if (method.hasArguments() && method.getArguments().containsKey(AMQPFilterTypes.REPLAY_PERIOD.toString())) {
                    Object value = method.getArguments().get(AMQPFilterTypes.REPLAY_PERIOD.toString());
                    final long period;
                    if (value instanceof Number) {
                        period = ((Number) value).longValue();
                    } else if (value instanceof String) {
                        try {
                            period = Long.parseLong(value.toString());
                        } catch (NumberFormatException e) {
                            exception(session, method, ExecutionErrorCode.ILLEGAL_ARGUMENT, "Cannot parse value " + value + " as a number for filter " + AMQPFilterTypes.REPLAY_PERIOD.toString());
                            return;
                        }
                    } else {
                        exception(session, method, ExecutionErrorCode.ILLEGAL_ARGUMENT, "Cannot parse value " + value + " as a number for filter " + AMQPFilterTypes.REPLAY_PERIOD.toString());
                        return;
                    }
                    final long startingFrom = System.currentTimeMillis() - (1000l * period);
                    if (filterManager == null) {
                        filterManager = new FilterManager();
                    }
                    MessageFilter filter = new ArrivalTimeFilter(startingFrom, period == 0);
                    filterManager.add(filter.getName(), filter);
                }
                boolean multiQueue = sources.size() > 1;
                ConsumerTarget_0_10 target = new ConsumerTarget_0_10(session, destination, method.getAcceptMode(), method.getAcquireMode(), MessageFlowMode.WINDOW, creditManager, method.getArguments(), multiQueue);
                Integer priority = null;
                if (method.hasArguments() && method.getArguments().containsKey("x-priority")) {
                    Object value = method.getArguments().get("x-priority");
                    if (value instanceof Number) {
                        priority = ((Number) value).intValue();
                    } else if (value instanceof String) {
                        try {
                            priority = Integer.parseInt(value.toString());
                        } catch (NumberFormatException e) {
                        }
                    }
                }
                session.register(destination, target);
                try {
                    EnumSet<ConsumerOption> options = EnumSet.noneOf(ConsumerOption.class);
                    if (method.getAcquireMode() == MessageAcquireMode.PRE_ACQUIRED) {
                        options.add(ConsumerOption.ACQUIRES);
                    }
                    if (method.getAcquireMode() != MessageAcquireMode.NOT_ACQUIRED || method.getAcceptMode() == MessageAcceptMode.EXPLICIT) {
                        options.add(ConsumerOption.SEES_REQUEUES);
                    }
                    if (method.getExclusive()) {
                        options.add(ConsumerOption.EXCLUSIVE);
                    }
                    for (MessageSource source : sources) {
                        source.addConsumer(target, filterManager, MessageTransferMessage.class, destination, options, priority);
                    }
                    target.updateNotifyWorkDesired();
                } catch (Queue.ExistingExclusiveConsumer existing) {
                    exception(session, method, ExecutionErrorCode.RESOURCE_LOCKED, "Queue has an exclusive consumer");
                } catch (Queue.ExistingConsumerPreventsExclusive exclusive) {
                    exception(session, method, ExecutionErrorCode.RESOURCE_LOCKED, "Queue has an existing consumer - can't subscribe exclusively");
                } catch (AccessControlException e) {
                    exception(session, method, ExecutionErrorCode.UNAUTHORIZED_ACCESS, e.getMessage());
                } catch (MessageSource.ConsumerAccessRefused consumerAccessRefused) {
                    exception(session, method, ExecutionErrorCode.RESOURCE_LOCKED, "Queue has an incompatible exclusivity policy");
                } catch (MessageSource.QueueDeleted queueDeleted) {
                    exception(session, method, ExecutionErrorCode.NOT_FOUND, "Queue was deleted");
                }
            }
        }
    }
}
Also used : ProtocolEngine(org.apache.qpid.server.transport.ProtocolEngine) AMQInvalidArgumentException(org.apache.qpid.server.filter.AMQInvalidArgumentException) ConsumerOption(org.apache.qpid.server.consumer.ConsumerOption) FilterManager(org.apache.qpid.server.filter.FilterManager) Queue(org.apache.qpid.server.model.Queue) ArrivalTimeFilter(org.apache.qpid.server.filter.ArrivalTimeFilter) NamedAddressSpace(org.apache.qpid.server.model.NamedAddressSpace) MessageSource(org.apache.qpid.server.message.MessageSource) AccessControlException(java.security.AccessControlException) Collection(java.util.Collection) AbstractConfiguredObject(org.apache.qpid.server.model.AbstractConfiguredObject) MessageFilter(org.apache.qpid.server.filter.MessageFilter)

Aggregations

NamedAddressSpace (org.apache.qpid.server.model.NamedAddressSpace)42 AccessControlException (java.security.AccessControlException)22 HashMap (java.util.HashMap)12 MessageSource (org.apache.qpid.server.message.MessageSource)8 AbstractConfiguredObject (org.apache.qpid.server.model.AbstractConfiguredObject)8 Queue (org.apache.qpid.server.model.Queue)6 Collection (java.util.Collection)5 LinkedHashMap (java.util.LinkedHashMap)5 Map (java.util.Map)5 Symbol (org.apache.qpid.server.protocol.v1_0.type.Symbol)5 ConcurrentLinkedQueue (java.util.concurrent.ConcurrentLinkedQueue)4 IllegalConfigurationException (org.apache.qpid.server.configuration.IllegalConfigurationException)4 MessageDestination (org.apache.qpid.server.message.MessageDestination)4 AmqpPort (org.apache.qpid.server.model.port.AmqpPort)4 ArrayList (java.util.ArrayList)3 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)3 Exchange (org.apache.qpid.server.model.Exchange)3 BaseSource (org.apache.qpid.server.protocol.v1_0.type.BaseSource)3 Source (org.apache.qpid.server.protocol.v1_0.type.messaging.Source)3 AmqpError (org.apache.qpid.server.protocol.v1_0.type.transport.AmqpError)3