import org.opendaylight.protocol.framework.ProtocolSession;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Tlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.Tlvs;
/**
* PCEP Session represents the finite state machine in PCEP, including timers and its purpose is to create a PCEP
* Sends message from user to PCE/PCC. If the user sends an Open Message, the session returns an error (open message
* is only allowed, when a PCEP handshake is in progress). Close message will close the session and free all the
* resources.
- *
+ *
* @param message message to be sent
* @return Future promise which will be succeed when the message is enqueued in the socket.
*/
import java.net.InetSocketAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenObject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
/**
* Factory for generating PCEP Session proposals. Used by a server.
* @param sessionId is used for creation of PCEPOpenObject
* @return specific session proposal
*/
- public OpenObject getSessionProposal(InetSocketAddress address, int sessionId);
+ public Open getSessionProposal(InetSocketAddress address, int sessionId);
}
description "OPEN Object";
reference "https://tools.ietf.org/html/rfc5440#section-7.3";
- uses object;
- container "tlvs" {
- uses of-list-tlv;
-
- uses stateful-capability-tlv;
-
- uses predundancy-group-id-tlv;
-
- uses lsp-db-version-tlv;
- }
-
- leaf version {
- type protocol-version;
- default 1;
- }
-
- leaf keepalive {
- // Note: non-presence is equal to '0'
- type uint8 {
- range 1..255;
+ container open {
+ uses object;
+ container "tlvs" {
+ uses of-list-tlv;
+
+ uses stateful-capability-tlv;
+
+ uses predundancy-group-id-tlv;
+
+ uses lsp-db-version-tlv;
}
- mandatory true;
- }
-
- leaf dead-timer {
- // Note: non-presence is equal to '0'
- type uint8 {
- range 1..255;
+
+ leaf version {
+ type protocol-version;
+ default 1;
+ }
+
+ leaf keepalive {
+ // Note: non-presence is equal to '0'
+ type uint8 {
+ range 1..255;
+ }
+ mandatory true;
+ }
+
+ leaf dead-timer {
+ // Note: non-presence is equal to '0'
+ type uint8 {
+ range 1..255;
+ }
+ mandatory true;
+ }
+
+ leaf session-id {
+ type uint8;
}
- mandatory true;
- }
-
- leaf session-id {
- type uint8;
}
}
uses message-header;
- container open {
- uses open-object;
- }
+ uses open-object;
}
}
}
case session {
- container open {
- uses open-object;
- }
+ uses open-object;
}
case stateful {
import org.opendaylight.protocol.framework.AbstractSessionNegotiator;
import org.opendaylight.protocol.pcep.PCEPErrors;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.Session;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.KeepaliveMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenMessage;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenObject;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.PcerrMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.keepalive.message.KeepaliveMessageBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.OpenMessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private Timeout failTimer;
@GuardedBy("this")
- private OpenObject localPrefs;
+ private Open localPrefs;
@GuardedBy("this")
- private OpenObject remotePrefs;
+ private Open remotePrefs;
private volatile boolean localOK, openRetry, remoteOK;
*
* @return Session parameters proposal.
*/
- protected abstract OpenObject getInitialProposal();
+ protected abstract Open getInitialProposal();
/**
* Get the revised session parameters proposal based on the feedback the peer has provided to us.
* @param suggestion Peer-provided suggested session parameters
* @return Session parameters proposal.
*/
- protected abstract OpenObject getRevisedProposal(OpenObject suggestion);
+ protected abstract Open getRevisedProposal(Open suggestion);
/**
* Check whether a peer-provided session parameters proposal is acceptable.
* @param proposal peer-proposed session parameters
* @return true if the proposal is acceptable, false otherwise
*/
- protected abstract boolean isProposalAcceptable(OpenObject proposal);
+ protected abstract boolean isProposalAcceptable(Open proposal);
/**
* Given a peer-provided session parameters proposal which we found unacceptable, provide a counter-proposal. The
* @param proposal unacceptable peer proposal
* @return our counter-proposal, or null if there is no way to negotiate an acceptable proposal
*/
- protected abstract OpenObject getCounterProposal(OpenObject proposal);
+ protected abstract Open getCounterProposal(Open proposal);
/**
* Create the protocol session.
* @param remotePrefs Session preferences proposed by the peer and accepted by us.
* @return New protocol session.
*/
- protected abstract PCEPSessionImpl createSession(Timer timer, Channel channel, OpenObject localPrefs, OpenObject remotePrefs);
+ protected abstract PCEPSessionImpl createSession(Timer timer, Channel channel, Open localPrefs, Open remotePrefs);
/**
* Sends PCEP Error Message with one PCEPError.
Preconditions.checkState(this.state == State.Idle);
this.localPrefs = getInitialProposal();
final OpenMessage m = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.OpenBuilder().setOpenMessage(
- new OpenMessageBuilder().setOpen(
- (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.open.message.Open) this.localPrefs).build()).build();
+ new OpenMessageBuilder().setOpen(this.localPrefs).build()).build();
this.channel.writeAndFlush(m);
this.state = State.OpenWait;
scheduleFailTimer();
return;
} else if (msg instanceof PcerrMessage) {
final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.PcerrMessage err = ((PcerrMessage) msg).getPcerrMessage();
- this.localPrefs = getRevisedProposal((OpenObject) ((Session) err.getErrorType()).getOpen());
+ this.localPrefs = getRevisedProposal(((Session) err.getErrorType()).getOpen());
if (this.localPrefs == null) {
sendErrorMessage(PCEPErrors.PCERR_NON_ACC_SESSION_CHAR);
negotiationFailed(new RuntimeException("Peer suggested unacceptable retry proposal"));
case OpenWait:
if (msg instanceof OpenMessage) {
final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.OpenMessage o = ((OpenMessage) msg).getOpenMessage();
- final OpenObject open = o.getOpen();
+ final Open open = o.getOpen();
if (isProposalAcceptable(open)) {
this.channel.writeAndFlush(new KeepaliveMessageBuilder().build());
this.remotePrefs = open;
return;
}
- final OpenObject newPrefs = getCounterProposal(open);
+ final Open newPrefs = getCounterProposal(open);
if (newPrefs == null) {
sendErrorMessage(PCEPErrors.NON_ACC_NON_NEG_SESSION_CHAR);
negotiationFailed(new RuntimeException("Peer sent unacceptable session parameters"));
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.NotificationObject;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OfObject;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenMessage;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenObject;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.PathKeyObject;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.PcepErrorObject;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.PcerrMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.error.code.tlv.LspErrorCode;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.identifiers.tlv.LspIdentifiers;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.list.tlv.OfList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.order.tlv.Order;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.overload.duration.tlv.OverloadDuration;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.failure.no.path.tlvs.NoPathVector;
context.registerObjectParser(PCEPExcludeRouteObjectParser.CLASS, PCEPExcludeRouteObjectParser.TYPE,
new PCEPExcludeRouteObjectParser(xroSubReg));
- context.registerObjectSerializer(OpenObject.class, new PCEPOpenObjectParser(tlvReg));
+ context.registerObjectSerializer(Open.class, new PCEPOpenObjectParser(tlvReg));
context.registerObjectSerializer(RpObject.class, new PCEPRequestParameterObjectParser(tlvReg));
context.registerObjectSerializer(NoPathObject.class, new PCEPNoPathObjectParser(tlvReg));
context.registerObjectSerializer(EndpointsObject.class, new PCEPEndPointsObjectParser(tlvReg));
import io.netty.util.concurrent.Promise;
import org.opendaylight.protocol.pcep.PCEPSessionListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenObject;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.open.message.OpenBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
import com.google.common.base.Preconditions;
private final int maxUnknownMessages;
public DefaultPCEPSessionNegotiator(final Timer timer, final Promise<PCEPSessionImpl> promise, final Channel channel,
- final PCEPSessionListener listener, final short sessionId, final int maxUnknownMessages, final OpenObject localPrefs) {
+ final PCEPSessionListener listener, final short sessionId, final int maxUnknownMessages, final Open localPrefs) {
super(timer, promise, channel);
this.maxUnknownMessages = maxUnknownMessages;
this.myLocalPrefs = new OpenBuilder().setKeepalive(localPrefs.getKeepalive()).setDeadTimer(localPrefs.getDeadTimer()).setSessionId(
this.listener = Preconditions.checkNotNull(listener);
}
- private final OpenObject myLocalPrefs;
+ private final Open myLocalPrefs;
@Override
- protected OpenObject getInitialProposal() {
+ protected Open getInitialProposal() {
return this.myLocalPrefs;
}
@Override
- protected PCEPSessionImpl createSession(final Timer timer, final Channel channel, final OpenObject localPrefs,
- final OpenObject remotePrefs) {
+ protected PCEPSessionImpl createSession(final Timer timer, final Channel channel, final Open localPrefs, final Open remotePrefs) {
return new PCEPSessionImpl(timer, this.listener, this.maxUnknownMessages, channel, localPrefs, remotePrefs);
}
@Override
- protected boolean isProposalAcceptable(final OpenObject open) {
+ protected boolean isProposalAcceptable(final Open open) {
return true;
}
@Override
- protected OpenObject getCounterProposal(final OpenObject open) {
+ protected Open getCounterProposal(final Open open) {
return null;
}
@Override
- protected OpenObject getRevisedProposal(final OpenObject suggestion) {
+ protected Open getRevisedProposal(final Open suggestion) {
return this.myLocalPrefs;
}
}
import io.netty.util.concurrent.Promise;
import org.opendaylight.protocol.pcep.PCEPSessionListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenObject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
import com.google.common.base.Preconditions;
public final class DefaultPCEPSessionNegotiatorFactory extends AbstractPCEPSessionNegotiatorFactory {
- private final OpenObject localPrefs;
+ private final Open localPrefs;
private final int maxUnknownMessages;
private final Timer timer;
- public DefaultPCEPSessionNegotiatorFactory(final Timer timer, final OpenObject localPrefs, final int maxUnknownMessages) {
+ public DefaultPCEPSessionNegotiatorFactory(final Timer timer, final Open localPrefs, final int maxUnknownMessages) {
this.timer = Preconditions.checkNotNull(timer);
this.localPrefs = Preconditions.checkNotNull(localPrefs);
this.maxUnknownMessages = maxUnknownMessages;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.KeepaliveMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenMessage;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenObject;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.close.message.CCloseMessageBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.close.object.CCloseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.keepalive.message.KeepaliveMessageBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Tlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.Tlvs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Open Object with session characteristics that were accepted by another PCE (sent from this session).
*/
- private final OpenObject localOpen;
+ private final Open localOpen;
/**
* Open Object with session characteristics for this session (sent from another PCE).
*/
- private final OpenObject remoteOpen;
+ private final Open remoteOpen;
private static final Logger logger = LoggerFactory.getLogger(PCEPSessionImpl.class);
private final KeepaliveMessage kaMessage = (KeepaliveMessage) new KeepaliveMessageBuilder().build();
PCEPSessionImpl(final Timer timer, final PCEPSessionListener listener, final int maxUnknownMessages, final Channel channel,
- final OpenObject localOpen, final OpenObject remoteOpen) {
+ final Open localOpen, final Open remoteOpen) {
this.listener = Preconditions.checkNotNull(listener);
this.stateTimer = Preconditions.checkNotNull(timer);
this.channel = Preconditions.checkNotNull(channel);
* @param value
* @param open
*/
- private void sendErrorMessage(final PCEPErrors value, final OpenObject open) {
+ private void sendErrorMessage(final PCEPErrors value, final Open open) {
this.sendMessage(Util.createErrorMessage(value, open));
}
import java.net.InetSocketAddress;
import org.opendaylight.protocol.pcep.PCEPSessionProposalFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenObject;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.open.message.OpenBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Tlvs;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.TlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.Tlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.stateful.capability.tlv.Stateful.Flags;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.stateful.capability.tlv.StatefulBuilder;
}
@Override
- public OpenObject getSessionProposal(final InetSocketAddress address, final int sessionId) {
+ public Open getSessionProposal(final InetSocketAddress address, final int sessionId) {
final Tlvs tlvs = null;
final TlvsBuilder builder = new TlvsBuilder();
if (PCEPSessionProposalFactoryImpl.this.stateful) {
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcerrBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenObject;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.address.family.Ipv4;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.PcerrMessageBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.ErrorType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.Errors;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.ErrorsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.SessionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.session.Open;
import com.google.common.collect.Lists;
}
}
- public static Message createErrorMessage(final PCEPErrors e, final OpenObject t) {
+ public static Message createErrorMessage(final PCEPErrors e, final Open t) {
final PcerrBuilder errMessageBuilder = new PcerrBuilder();
final PCEPErrorMapping mapping = PCEPErrorMapping.getInstance();
final PCEPErrorIdentifier id = mapping.getFromErrorsEnum(e);
if (t == null) {
return errMessageBuilder.setPcerrMessage(new PcerrMessageBuilder().setErrors(Arrays.asList(err)).build()).build();
} else {
- final ErrorType type = new SessionBuilder().setOpen((Open) t).build();
+ final ErrorType type = new SessionBuilder().setOpen(t).build();
return errMessageBuilder.setPcerrMessage(new PcerrMessageBuilder().setErrors(Arrays.asList(err)).setErrorType(type).build()).build();
}
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.PcepErrorObject;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.PcerrMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.RpObject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.PcerrMessageBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.Errors;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.ErrorsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.Session;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.SessionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.request.Rps;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.session.Open;
import com.google.common.collect.Lists;
import org.opendaylight.protocol.pcep.PCEPDocumentedException;
import org.opendaylight.protocol.pcep.impl.AbstractMessageParser;
import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.OpenBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.OpenMessageBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.open.message.Open;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
/**
* Parser for {@link OpenMessage}
}
final List<Object> objs = parseObjects(buffer);
- return new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.OpenBuilder().setOpenMessage(
- validate(objs)).build();
+ return new OpenBuilder().setOpenMessage(validate(objs)).build();
}
private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.OpenMessage validate(
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Tlv;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.db.version.tlv.LspDbVersion;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.list.tlv.OfList;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.open.message.OpenBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Tlvs;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.TlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.Tlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.predundancy.group.id.tlv.PredundancyGroupId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.stateful.capability.tlv.Stateful;
}
@Override
- public OpenObject parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException, PCEPDocumentedException {
+ public Open parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException, PCEPDocumentedException {
if (bytes == null || bytes.length == 0) {
throw new IllegalArgumentException("Array of bytes is mandatory. Can't be null or empty.");
}
@Override
public byte[] serializeObject(final Object object) {
- if (!(object instanceof OpenObject)) {
+ if (!(object instanceof Open)) {
throw new IllegalArgumentException("Wrong instance of PCEPObject. Passed " + object.getClass() + ". Needed OpenObject.");
}
- final OpenObject open = (OpenObject) object;
+ final Open open = (Open) object;
final byte versionFlagMF = (byte) (PCEP_VERSION << (Byte.SIZE - VERSION_SF_LENGTH));
import org.opendaylight.protocol.pcep.PCEPSessionListener;
import org.opendaylight.protocol.pcep.PCEPTerminationReason;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenObject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
this.session.handleMessage(msg);
}
- public void sendErrorMessage(final PCEPErrors value, final OpenObject open) {
+ public void sendErrorMessage(final PCEPErrors value, final Open open) {
this.sendMessage(Util.createErrorMessage(value, open));
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.db.version.tlv.LspDbVersionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.error.code.tlv.LspErrorCode;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.error.code.tlv.LspErrorCodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.open.message.OpenBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.order.tlv.OrderBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.overload.duration.tlv.OverloadDurationBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.path.definition.ExplicitRouteBuilder;
(byte) 0xf0 };
final PredundancyGroupId tlv3 = new PredundancyGroupIdBuilder().setIdentifier(predundancyBytes).build();
- builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.TlvsBuilder().setStateful(
+ builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder().setStateful(
tlv1).setPredundancyGroupId(tlv3).setLspDbVersion(tlv2).build());
assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result));
import io.netty.buffer.Unpooled;
import java.io.IOException;
+import java.math.BigInteger;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.protocol.pcep.PCEPDocumentedException;
import org.opendaylight.protocol.pcep.impl.message.PCEPCloseMessageParser;
import org.opendaylight.protocol.pcep.impl.message.PCEPKeepAliveMessageParser;
+import org.opendaylight.protocol.pcep.impl.message.PCEPOpenMessageParser;
import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry;
import org.opendaylight.protocol.pcep.spi.pojo.PCEPExtensionProviderContextImpl;
import org.opendaylight.protocol.util.ByteArray;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.CloseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.KeepaliveBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.OpenBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ProtocolVersion;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.close.message.CCloseMessageBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.close.object.CCloseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.keepalive.message.KeepaliveMessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.db.version.tlv.LspDbVersion;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.db.version.tlv.LspDbVersionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.OpenMessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.stateful.capability.tlv.Stateful;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.stateful.capability.tlv.Stateful.Flags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.stateful.capability.tlv.StatefulBuilder;
public class PCEPValidatorTest {
// private final PCEPEndPointsObject<IPv4Address> endPoints = new PCEPEndPointsObject<IPv4Address>(this.ip4addr,
// this.ip4addr);
//
- //
- // @Test
- // public void testOpenMessageValidationFromBin() throws IOException, DeserializerException, DocumentedException,
- // PCEPDeserializerException {
- // assertEquals(
- // deserMsg("src/test/resources/PCEPOpenMessage1.bin").toString(),
- // asList(
- // new PCEPOpenMessage(new PCEPOpenObject(30, 120, 1, asList(new PCEStatefulCapabilityTlv(false, true, true),
- // new LSPStateDBVersionTlv(0x80))))).toString());
- //
- // assertEquals(deserMsg("src/test/resources/Open.1.bin").toString(),
- // asList(new PCEPOpenMessage(new PCEPOpenObject(1, 4, 1))).toString());
- //
- // assertEquals(
- // deserMsg("src/test/resources/Open.3.bin").toString(),
- // asList(
- // new PCEPOpenMessage(new PCEPOpenObject(1, 4, 1, asList(new PCEStatefulCapabilityTlv(false, true, true),
- // new LSPStateDBVersionTlv(53))))).toString());
- // }
- //
+
+ @Test
+ public void testOpenMessageValidationFromBin() throws IOException, DeserializerException, DocumentedException,
+ PCEPDeserializerException {
+ final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPOpenMessage1.bin");
+ final PCEPOpenMessageParser parser = new PCEPOpenMessageParser(this.objectRegistry);
+ final OpenMessageBuilder builder = new OpenMessageBuilder();
+
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder b = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder();
+ b.setProcessingRule(false);
+ b.setIgnore(false);
+ b.setVersion(new ProtocolVersion((short) 1));
+ b.setKeepalive((short) 30);
+ b.setDeadTimer((short) 120);
+ b.setSessionId((short) 1);
+ final Stateful tlv1 = new StatefulBuilder().setFlags(new Flags(true, false, true)).build();
+ final LspDbVersion tlv2 = new LspDbVersionBuilder().setVersion(BigInteger.valueOf(0x80L)).build();
+ b.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder().setStateful(
+ tlv1).setLspDbVersion(tlv2).build());
+ builder.setOpen(b.build());
+
+ assertEquals(new OpenBuilder().setOpenMessage(builder.build()).build(), parser.parseMessage(result));
+ final ByteBuf buf = Unpooled.buffer(result.length);
+ parser.serializeMessage(new OpenBuilder().setOpenMessage(builder.build()).build(), buf);
+ assertArrayEquals(result, buf.array());
+ }
@Test
public void testKeepAliveMessageValidationFromBin() throws IOException, PCEPDeserializerException, PCEPDocumentedException,
import org.opendaylight.protocol.pcep.PCEPSessionListener;
import org.opendaylight.protocol.pcep.TerminationReason;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.open.message.OpenBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
import com.google.common.util.concurrent.Futures;
import org.opendaylight.protocol.pcep.impl.PCEPDispatcherImpl;
import org.opendaylight.protocol.pcep.impl.PCEPSessionProposalFactoryImpl;
import org.opendaylight.protocol.pcep.spi.pojo.PCEPExtensionProviderContextImpl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenObject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
final PCEPSessionProposalFactory spf = new PCEPSessionProposalFactoryImpl(deadTimerValue, keepAliveValue, stateful, active, versioned, instant, timeout);
- final OpenObject prefs = spf.getSessionProposal(address, 0);
+ final Open prefs = spf.getSessionProposal(address, 0);
final PCEPDispatcherImpl dispatcher = new PCEPDispatcherImpl(PCEPExtensionProviderContextImpl.getSingletonInstance().getMessageHandlerRegistry(), new DefaultPCEPSessionNegotiatorFactory(new HashedWheelTimer(), prefs, 5));
import org.opendaylight.protocol.pcep.impl.PCEPSessionImpl;
import org.opendaylight.protocol.pcep.spi.pojo.PCEPExtensionProviderContextImpl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.open.message.OpenBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.TlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.predundancy.group.id.tlv.PredundancyGroupIdBuilder;
import com.google.common.base.Preconditions;
import org.opendaylight.protocol.pcep.impl.PCEPDispatcherImpl;
import org.opendaylight.protocol.pcep.impl.PCEPSessionProposalFactoryImpl;
import org.opendaylight.protocol.pcep.spi.pojo.PCEPExtensionProviderContextImpl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenObject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
// FIXME: integration with config subsystem should allow this to be injected as a service
final InetSocketAddress address = new InetSocketAddress("0.0.0.0", 4189);
final PCEPSessionProposalFactory spf = new PCEPSessionProposalFactoryImpl(30, 10, true, true, true, true, 0);
- final OpenObject prefs = spf.getSessionProposal(address, 0);
- final PCEPDispatcher dispatcher = new PCEPDispatcherImpl(PCEPExtensionProviderContextImpl.getSingletonInstance().getMessageHandlerRegistry(),
- new DefaultPCEPSessionNegotiatorFactory(new HashedWheelTimer(), prefs, 5));
+ final Open prefs = spf.getSessionProposal(address, 0);
+ final PCEPDispatcher dispatcher = new PCEPDispatcherImpl(PCEPExtensionProviderContextImpl.getSingletonInstance().getMessageHandlerRegistry(), new DefaultPCEPSessionNegotiatorFactory(new HashedWheelTimer(), prefs, 5));
final InstanceIdentifier<Topology> topology = InstanceIdentifier.builder().node(Topology.class).toInstance();
final PCEPTopologyProvider exp = new PCEPTopologyProvider(dispatcher, null, dps, topology);
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.PcrptMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.PlspId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Tlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.Tlvs;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.PcerrMessageBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrpt.message.pcrpt.message.Reports;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrpt.message.pcrpt.message.reports.Lsp;
final String pccId = createNodeId(address);
// FIXME: after 0.6 yangtools, this cast should not be needed
- final Topology topo = (Topology)trans.readOperationalData(topology);
+ final Topology topo = (Topology) trans.readOperationalData(ServerSessionManager.this.topology);
for (final Node n : topo.getNode()) {
LOG.debug("Matching topology node {} to id {}", n, pccId);
*/
final NodeId id = new NodeId(pccId);
final NodeKey nk = new NodeKey(id);
- final InstanceIdentifier<Node> nti = InstanceIdentifier.builder(topology).node(Node.class, nk).toInstance();
+ final InstanceIdentifier<Node> nti = InstanceIdentifier.builder(ServerSessionManager.this.topology).node(Node.class, nk).toInstance();
final Node ret = new NodeBuilder().setKey(nk).setNodeId(id).build();
LOG.debug("Peer {} resolved to topology node {}", peerAddress, topoNode);
// Our augmentation in the topology node
- pccBuilder = new PathComputationClientBuilder();
+ this.pccBuilder = new PathComputationClientBuilder();
final Tlvs tlvs = session.getRemoteTlvs();
final Stateful stateful = tlvs.getStateful();
this.pccBuilder.setStateSync(PccSyncState.InitialResync);
}
- topologyAugmentBuilder = new Node1Builder().setPathComputationClient(pccBuilder.build());
- topologyAugmentId = InstanceIdentifier.builder(topologyNodeId).node(Node1.class).toInstance();
- trans.putRuntimeData(topologyAugmentId, topologyAugmentBuilder.build());
+ this.topologyAugmentBuilder = new Node1Builder().setPathComputationClient(this.pccBuilder.build());
+ this.topologyAugmentId = InstanceIdentifier.builder(this.topologyNodeId).node(Node1.class).toInstance();
+ trans.putRuntimeData(this.topologyAugmentId, this.topologyAugmentBuilder.build());
// All set, commit the modifications
final Future<RpcResult<TransactionStatus>> s = trans.commit();
final DataModificationTransaction trans = ServerSessionManager.this.dataProvider.beginTransaction();
// The session went down. Undo all the Topology changes we have done.
- trans.removeRuntimeData(topologyAugmentId);
- if (ownsTopology) {
- trans.removeRuntimeData(topologyNodeId);
+ trans.removeRuntimeData(this.topologyAugmentId);
+ if (this.ownsTopology) {
+ trans.removeRuntimeData(this.topologyNodeId);
}
/*
}
private InstanceIdentifier<ReportedLsps> lspIdentifier(final SymbolicPathName name) {
- return InstanceIdentifier.builder(topologyAugmentId).
- node(ReportedLsps.class, new ReportedLspsKey(name.getPathName())).toInstance();
+ return InstanceIdentifier.builder(this.topologyAugmentId).node(ReportedLsps.class, new ReportedLspsKey(name.getPathName())).toInstance();
}
@Override
if (lsp.isSync() && !this.synced) {
// Update synchronization flag
- synced = true;
- topologyAugmentBuilder.setPathComputationClient(pccBuilder.setStateSync(PccSyncState.Synchronized).build());
- trans.putRuntimeData(topologyAugmentId, topologyAugmentBuilder.build());
+ this.synced = true;
+ this.topologyAugmentBuilder.setPathComputationClient(this.pccBuilder.setStateSync(PccSyncState.Synchronized).build());
+ trans.putRuntimeData(this.topologyAugmentId, this.topologyAugmentBuilder.build());
LOG.debug("Session {} achieved synchronized state", session);
}
private final DataProviderService dataProvider;
private final InstructionScheduler scheduler;
- public ServerSessionManager(final InstructionScheduler scheduler,
- final DataProviderService dataProvider, final InstanceIdentifier<Topology> topology) {
+ public ServerSessionManager(final InstructionScheduler scheduler, final DataProviderService dataProvider,
+ final InstanceIdentifier<Topology> topology) {
this.dataProvider = Preconditions.checkNotNull(dataProvider);
this.topology = Preconditions.checkNotNull(topology);
this.scheduler = Preconditions.checkNotNull(scheduler);
}
};
- final Failure f = scheduler.submitInstruction(input, e);
+ final Failure f = this.scheduler.submitInstruction(input, e);
final AddLspOutputBuilder b = new AddLspOutputBuilder();
if (f != null) {
b.setResult(new FailureBuilder().setFailure(f).build());
}
};
- final Failure f = scheduler.submitInstruction(input, e);
+ final Failure f = this.scheduler.submitInstruction(input, e);
final RemoveLspOutputBuilder b = new RemoveLspOutputBuilder();
if (f != null) {
b.setResult(new FailureBuilder().setFailure(f).build());
}
};
- final Failure f = scheduler.submitInstruction(input, e);
+ final Failure f = this.scheduler.submitInstruction(input, e);
final UpdateLspOutputBuilder b = new UpdateLspOutputBuilder();
if (f != null) {
b.setResult(new FailureBuilder().setFailure(f).build());
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>programming-topology-api</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.m2e.core.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.m2e.core.maven2Nature</nature>
+ </natures>
+</projectDescription>