From 6c4c84d4b4a21b0c92a6e1bf0bfa3ea048761657 Mon Sep 17 00:00:00 2001 From: Jung Seungho Date: Wed, 10 Aug 2016 18:52:35 +0900 Subject: [PATCH] Implement acl/invite resource in cloud account server. Add invite feature to invite user Change-Id: I7a4c1922de4b312afda92423338092423fa573c7 Signed-off-by: Minji Park Signed-off-by: Jung Seungho Reviewed-on: https://gerrit.iotivity.org/gerrit/9975 Tested-by: jenkins-iotivity Reviewed-by: Jee Hyeok Kim --- .../cloud/accountserver/AccountServer.java | 7 +- .../iotivity/cloud/accountserver/Constants.java | 22 ++- .../cloud/accountserver/db/AccountDBManager.java | 9 + .../cloud/accountserver/db/InviteTable.java | 63 +++++++ .../resources/account/AccountResource.java | 3 +- .../resources/acl/invite/InviteManager.java | 209 +++++++++++++++++++++ .../resources/acl/invite/InviteResource.java | 157 ++++++++++++++++ .../cloud/ciserver/CloudInterfaceServer.java | 29 +-- .../ciserver/resources/proxy/account/Account.java | 16 +- .../ciserver/resources/proxy/account/AclGroup.java | 7 +- .../resources/proxy/account/AclInvite.java | 87 +++++++++ .../resources/proxy/rd/DevicePresence.java | 106 ++++++----- .../ciserver/resources/proxy/rd/ResourceFind.java | 106 ++++++----- .../resources/proxy/rd/ResourcePresence.java | 106 ++++++----- .../java/org/iotivity/cloud/base/OCFConstants.java | 43 ++--- .../org/iotivity/cloud/base/protocols/Message.java | 2 +- 16 files changed, 778 insertions(+), 194 deletions(-) create mode 100644 cloud/account/src/main/java/org/iotivity/cloud/accountserver/db/InviteTable.java create mode 100644 cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/acl/invite/InviteManager.java create mode 100644 cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/acl/invite/InviteResource.java create mode 100644 cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/AclInvite.java diff --git a/cloud/account/src/main/java/org/iotivity/cloud/accountserver/AccountServer.java b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/AccountServer.java index efcd4cd..ae7a577 100755 --- a/cloud/account/src/main/java/org/iotivity/cloud/accountserver/AccountServer.java +++ b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/AccountServer.java @@ -28,6 +28,7 @@ import org.iotivity.cloud.accountserver.resources.account.AccountResource; import org.iotivity.cloud.accountserver.resources.account.session.SessionResource; import org.iotivity.cloud.accountserver.resources.account.tokenrefresh.TokenRefreshResource; import org.iotivity.cloud.accountserver.resources.acl.group.GroupResource; +import org.iotivity.cloud.accountserver.resources.acl.invite.InviteResource; import org.iotivity.cloud.accountserver.resources.certificate.CertificateResource; import org.iotivity.cloud.base.ServerSystem; import org.iotivity.cloud.base.server.CoapServer; @@ -62,8 +63,10 @@ public class AccountServer { serverSystem.addResource(new CertificateResource()); - serverSystem.addServer(new CoapServer( - new InetSocketAddress(Integer.parseInt(args[0])))); + serverSystem.addResource(new InviteResource()); + + serverSystem.addServer(new CoapServer(new InetSocketAddress(Integer + .parseInt(args[0])))); boolean tlsMode = Integer.parseInt(args[1]) == 1; diff --git a/cloud/account/src/main/java/org/iotivity/cloud/accountserver/Constants.java b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/Constants.java index 6bb9db7..f53de46 100755 --- a/cloud/account/src/main/java/org/iotivity/cloud/accountserver/Constants.java +++ b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/Constants.java @@ -37,6 +37,8 @@ public class Constants extends OCFConstants { public static final String GROUP_TABLE = "GROUP_TABLE"; + public static final String INVITE_TABLE = "INVITE_TABLE"; + public static final String DEVICE_TABLE = "DEVICE_TABLE"; public static final String ACL_TABLE = "ACL_TABLE"; @@ -71,6 +73,10 @@ public class Constants extends OCFConstants { public static final String KEYFIELD_EXPIRED_TIME = "expiredtime"; + public static final String KEYFIELD_INVITE_USER = "inviteUser"; + + public static final String KEYFIELD_INVITED_USER = "invitedUser"; + // Request payload key public static final String REQ_DEVICE_ID = "di"; @@ -109,7 +115,9 @@ public class Constants extends OCFConstants { public static final String REQ_GTYPE_PUBLIC = "Public"; - public static final String REQ_CSR = "csr"; + public static final String REQ_CSR = "csr"; + + public static final String REQ_INVITE = "invite"; // Response payload key @@ -135,11 +143,15 @@ public class Constants extends OCFConstants { public static final String RESP_USER_LIST = "ulist"; - public static final String RESP_DEVICE_ID = "di"; + public static final String RESP_DEVICE_ID = "di"; + + public static final String RESP_CERT = "cert"; + + public static final String RESP_CACERT = "cacert"; + + public static final String RESP_INVITE = "invite"; - public static final String RESP_CERT = "cert"; - - public static final String RESP_CACERT = "cacert"; + public static final String RESP_INVITED = "invited"; // static token type diff --git a/cloud/account/src/main/java/org/iotivity/cloud/accountserver/db/AccountDBManager.java b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/db/AccountDBManager.java index f424f9c..06f3e62 100644 --- a/cloud/account/src/main/java/org/iotivity/cloud/accountserver/db/AccountDBManager.java +++ b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/db/AccountDBManager.java @@ -69,6 +69,7 @@ public class AccountDBManager { mongoDB.createTable(Constants.USER_TABLE); mongoDB.createTable(Constants.TOKEN_TABLE); mongoDB.createTable(Constants.GROUP_TABLE); + mongoDB.createTable(Constants.INVITE_TABLE); mongoDB.createTable(Constants.DEVICE_TABLE); mongoDB.createTable(Constants.ACL_TABLE); mongoDB.createTable(Constants.ACLTEMPLATE_TABLE); @@ -96,6 +97,14 @@ public class AccountDBManager { keyField.put(Constants.GROUP_TABLE, keys); keys = new ArrayList<>(); + keys.add(Constants.KEYFIELD_INVITE_USER); + keys.add(Constants.KEYFIELD_GID); + keys.add(Constants.KEYFIELD_INVITED_USER); + + mongoDB.createIndex(Constants.INVITE_TABLE, keys); + keyField.put(Constants.INVITE_TABLE, keys); + + keys = new ArrayList<>(); keys.add(Constants.KEYFIELD_UUID); keys.add(Constants.KEYFIELD_DID); diff --git a/cloud/account/src/main/java/org/iotivity/cloud/accountserver/db/InviteTable.java b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/db/InviteTable.java new file mode 100644 index 0000000..151c56f --- /dev/null +++ b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/db/InviteTable.java @@ -0,0 +1,63 @@ +/* + * //****************************************************************** + * // + * // Copyright 2016 Samsung Electronics All Rights Reserved. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ +package org.iotivity.cloud.accountserver.db; + +public class InviteTable { + + String gid; + String inviteUser; + String invitedUser; + + public InviteTable() { + } + + public InviteTable(String inviteUser, String gid, String invitedUser) { + this.inviteUser = inviteUser; + this.gid = gid; + this.invitedUser = invitedUser; + } + + public String getGid() { + return gid; + } + + public void setGid(String gid) { + this.gid = gid; + } + + public String getInviteUser() { + return inviteUser; + } + + public void setInviteUser(String inviteUser) { + this.inviteUser = inviteUser; + } + + public String getInvitedUser() { + return invitedUser; + } + + public void setInvitedUser(String invitedUser) { + this.invitedUser = invitedUser; + } + +} \ No newline at end of file diff --git a/cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/account/AccountResource.java b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/account/AccountResource.java index 4fb9501..12d80d5 100644 --- a/cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/account/AccountResource.java +++ b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/account/AccountResource.java @@ -145,8 +145,7 @@ public class AccountResource extends Resource { "uid and search query param are null"); } - - return MessageBuilder.createResponse(request, ResponseStatus.CHANGED, + return MessageBuilder.createResponse(request, ResponseStatus.CONTENT, ContentFormat.APPLICATION_CBOR, mCbor.encodingPayloadToCbor(responsePayload)); } diff --git a/cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/acl/invite/InviteManager.java b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/acl/invite/InviteManager.java new file mode 100644 index 0000000..05d4b68 --- /dev/null +++ b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/acl/invite/InviteManager.java @@ -0,0 +1,209 @@ +/* + * //****************************************************************** + * // + * // Copyright 2016 Samsung Electronics All Rights Reserved. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ +package org.iotivity.cloud.accountserver.resources.acl.invite; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.iotivity.cloud.accountserver.Constants; +import org.iotivity.cloud.accountserver.db.AccountDBManager; +import org.iotivity.cloud.accountserver.db.InviteTable; +import org.iotivity.cloud.accountserver.util.TypeCastingManager; +import org.iotivity.cloud.base.device.Device; +import org.iotivity.cloud.base.protocols.IRequest; +import org.iotivity.cloud.base.protocols.MessageBuilder; +import org.iotivity.cloud.base.protocols.enums.ContentFormat; +import org.iotivity.cloud.base.protocols.enums.ResponseStatus; +import org.iotivity.cloud.util.Cbor; + +public class InviteManager { + + private TypeCastingManager mTypeInvite = new TypeCastingManager<>(); + + private class InviteSubscriber { + InviteSubscriber(Device subscriber, IRequest request) { + mSubscriber = subscriber; + mRequest = request; + } + + public Device mSubscriber; + public IRequest mRequest; + } + + private HashMap mSubscribers = new HashMap<>(); + + public void addInvitation(String uid, String gid, String mid) { + + InviteTable newInviteTable = new InviteTable(uid, gid, mid); + + HashMap condition = new HashMap<>(); + condition.put(Constants.KEYFIELD_INVITE_USER, uid); + condition.put(Constants.KEYFIELD_GID, gid); + condition.put(Constants.KEYFIELD_INVITED_USER, mid); + + if (AccountDBManager.getInstance() + .selectRecord(Constants.INVITE_TABLE, condition).isEmpty()) { + AccountDBManager.getInstance().insertRecord(Constants.INVITE_TABLE, + mTypeInvite.convertObjectToMap(newInviteTable)); + notifyToSubscriber(uid); + notifyToSubscriber(mid); + } + } + + public void deleteInvitation(String mid, String gid) { + HashMap condition = new HashMap<>(); + condition.put(Constants.REQ_GROUP_ID, gid); + condition.put(Constants.KEYFIELD_INVITED_USER, mid); + + InviteTable getInviteTable = new InviteTable(); + + List> getInviteList = AccountDBManager + .getInstance().selectRecord(Constants.INVITE_TABLE, condition); + + ArrayList uidList = new ArrayList<>(); + for (HashMap getInvite : getInviteList) { + getInviteTable = mTypeInvite.convertMaptoObject(getInvite, + getInviteTable); + uidList.add(getInviteTable.getInviteUser()); + } + + AccountDBManager.getInstance().deleteRecord(Constants.INVITE_TABLE, + condition); + + notifyToSubscriber(mid); + for (String uid : uidList) { + notifyToSubscriber(uid); + } + } + + public void cancelInvitation(String uid, String gid, String mid) { + + HashMap condition = new HashMap<>(); + + condition.put(Constants.REQ_GROUP_ID, gid); + condition.put(Constants.KEYFIELD_INVITED_USER, mid); + condition.put(Constants.KEYFIELD_INVITE_USER, uid); + + AccountDBManager.getInstance().deleteRecord(Constants.INVITE_TABLE, + condition); + + notifyToSubscriber(uid); + notifyToSubscriber(mid); + } + + public HashMap getInvitationInfo(String uid) { + HashMap responsePayload = new HashMap<>(); + + ArrayList invitePayloadData = null; + ArrayList invitedPayloadData = null; + + List inviteList = getInviteTableList( + Constants.KEYFIELD_INVITE_USER, uid); + if (inviteList != null) { + invitePayloadData = new ArrayList<>(); + for (InviteTable invite : inviteList) { + HashMap inviteElement = new HashMap<>(); + inviteElement.put(Constants.REQ_GROUP_ID, invite.getGid()); + inviteElement.put(Constants.REQ_MEMBER, + invite.getInvitedUser()); + invitePayloadData.add(inviteElement); + } + } + + List invitedList = getInviteTableList( + Constants.KEYFIELD_INVITED_USER, uid); + if (invitedList != null) { + invitedPayloadData = new ArrayList<>(); + for (InviteTable invited : invitedList) { + HashMap invitedElement = new HashMap<>(); + invitedElement.put(Constants.REQ_GROUP_ID, invited.getGid()); + invitedElement.put(Constants.REQ_MEMBER, + invited.getInviteUser()); + invitedPayloadData.add(invitedElement); + } + } + + responsePayload.put(Constants.RESP_INVITE, invitePayloadData); + responsePayload.put(Constants.RESP_INVITED, invitedPayloadData); + + return responsePayload; + } + + public HashMap addSubscriber(String uid, Device subscriber, + IRequest request) { + + InviteSubscriber newSubscriber = new InviteSubscriber(subscriber, + request); + mSubscribers.put(uid, newSubscriber); + + return getInvitationInfo(uid); + } + + public HashMap removeSubscriber(String uid) { + + if (mSubscribers.containsKey(uid)) { + mSubscribers.remove(uid); + } + + return getInvitationInfo(uid); + } + + private void notifyToSubscriber(String id) { + + synchronized (mSubscribers) { + if (!mSubscribers.containsKey(id)) { + return; + } + Cbor> cbor = new Cbor<>(); + mSubscribers.get(id).mSubscriber.sendResponse( + MessageBuilder.createResponse(mSubscribers.get(id).mRequest, + ResponseStatus.CONTENT, + ContentFormat.APPLICATION_CBOR, + cbor.encodingPayloadToCbor(getInvitationInfo(id)))); + } + } + + private List getInviteTableList(String property, String uid) { + + InviteTable getInviteTable = new InviteTable(); + ArrayList inviteList = null; + + HashMap condition = new HashMap<>(); + condition.put(property, uid); + ArrayList> mapInviteList = AccountDBManager + .getInstance().selectRecord(Constants.INVITE_TABLE, condition); + if (!mapInviteList.isEmpty()) { + inviteList = new ArrayList<>(); + } + + for (HashMap mapInviteTable : mapInviteList) { + + getInviteTable = mTypeInvite.convertMaptoObject(mapInviteTable, + getInviteTable); + inviteList.add(getInviteTable); + } + return inviteList; + + } + +} diff --git a/cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/acl/invite/InviteResource.java b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/acl/invite/InviteResource.java new file mode 100644 index 0000000..080eafe --- /dev/null +++ b/cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/acl/invite/InviteResource.java @@ -0,0 +1,157 @@ +/* + * //****************************************************************** + * // + * // Copyright 2016 Samsung Electronics All Rights Reserved. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ +package org.iotivity.cloud.accountserver.resources.acl.invite; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import org.iotivity.cloud.accountserver.Constants; +import org.iotivity.cloud.base.device.Device; +import org.iotivity.cloud.base.exception.ServerException; +import org.iotivity.cloud.base.exception.ServerException.BadRequestException; +import org.iotivity.cloud.base.exception.ServerException.PreconditionFailedException; +import org.iotivity.cloud.base.protocols.IRequest; +import org.iotivity.cloud.base.protocols.IResponse; +import org.iotivity.cloud.base.protocols.MessageBuilder; +import org.iotivity.cloud.base.protocols.enums.ContentFormat; +import org.iotivity.cloud.base.protocols.enums.ResponseStatus; +import org.iotivity.cloud.base.resource.Resource; +import org.iotivity.cloud.util.Cbor; + +public class InviteResource extends Resource { + + private InviteManager mInviteManager = new InviteManager(); + + private Cbor> mCbor = new Cbor<>(); + + public InviteResource() { + super(Arrays.asList(Constants.PREFIX_WELL_KNOWN, Constants.PREFIX_OCF, + Constants.ACL_URI, Constants.INVITE_URI)); + } + + @Override + public void onDefaultRequestReceived(Device srcDevice, IRequest request) + throws ServerException { + + IResponse response = null; + + switch (request.getMethod()) { + case GET: + response = handleGetRequest(srcDevice, request); + break; + case POST: + response = handlePostRequest(request); + break; + case DELETE: + response = handleDeleteRequest(request); + break; + default: + throw new BadRequestException(request.getMethod() + + " request type is not supported"); + } + + srcDevice.sendResponse(response); + } + + private IResponse handleGetRequest(Device srcDevice, IRequest request) + throws ServerException { + + checkQueryException(Constants.REQ_UUID_ID, request.getUriQueryMap()); + + String uid = request.getUriQueryMap().get(Constants.REQ_UUID_ID).get(0); + HashMap responsePayload = null; + + switch (request.getObserve()) { + case NOTHING: + responsePayload = mInviteManager.getInvitationInfo(uid); + break; + case SUBSCRIBE: + responsePayload = mInviteManager.addSubscriber(uid, srcDevice, + request); + break; + case UNSUBSCRIBE: + responsePayload = mInviteManager.removeSubscriber(uid); + break; + default: + break; + } + + return MessageBuilder.createResponse(request, ResponseStatus.CONTENT, + ContentFormat.APPLICATION_CBOR, + mCbor.encodingPayloadToCbor(responsePayload)); + } + + @SuppressWarnings("unchecked") + private IResponse handlePostRequest(IRequest request) + throws ServerException { + + HashMap payload = mCbor.parsePayloadFromCbor( + request.getPayload(), HashMap.class); + + checkPayloadException( + Arrays.asList(Constants.REQ_UUID_ID, Constants.REQ_INVITE), + payload); + + String uid = (String) payload.get(Constants.REQ_UUID_ID); + ArrayList> inviteList = (ArrayList>) payload + .get(Constants.REQ_INVITE); + + for (HashMap invite : inviteList) { + + String gid = invite.get(Constants.REQ_GROUP_ID); + String mid = invite.get(Constants.REQ_MEMBER); + + if (gid == null || mid == null) { + + throw new PreconditionFailedException( + "value of invite property is invalid"); + } + + mInviteManager.addInvitation(uid, gid, mid); + } + + return MessageBuilder.createResponse(request, ResponseStatus.CHANGED); + } + + private IResponse handleDeleteRequest(IRequest request) + throws ServerException { + + HashMap> queryParams = request.getUriQueryMap(); + + checkQueryException(Constants.REQ_GROUP_ID, queryParams); + + String gid = queryParams.get(Constants.REQ_GROUP_ID).get(0); + String uid = queryParams.get(Constants.REQ_UUID_ID).get(0); + + if (queryParams.get(Constants.REQ_MEMBER) == null) { + mInviteManager.deleteInvitation(uid, gid); + } else { + String mid = queryParams.get(Constants.REQ_MEMBER).get(0); + mInviteManager.cancelInvitation(uid, gid, mid); + } + + return MessageBuilder.createResponse(request, ResponseStatus.DELETED); + } + +} \ No newline at end of file diff --git a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/CloudInterfaceServer.java b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/CloudInterfaceServer.java index c2902eb..41f0e83 100755 --- a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/CloudInterfaceServer.java +++ b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/CloudInterfaceServer.java @@ -33,12 +33,13 @@ import org.iotivity.cloud.ciserver.resources.proxy.account.Account; import org.iotivity.cloud.ciserver.resources.proxy.account.AccountSession; import org.iotivity.cloud.ciserver.resources.proxy.account.Acl; import org.iotivity.cloud.ciserver.resources.proxy.account.AclGroup; +import org.iotivity.cloud.ciserver.resources.proxy.account.AclInvite; +import org.iotivity.cloud.ciserver.resources.proxy.account.Certificate; import org.iotivity.cloud.ciserver.resources.proxy.mq.MessageQueue; import org.iotivity.cloud.ciserver.resources.proxy.rd.DevicePresence; import org.iotivity.cloud.ciserver.resources.proxy.rd.ResourceDirectory; import org.iotivity.cloud.ciserver.resources.proxy.rd.ResourceFind; import org.iotivity.cloud.ciserver.resources.proxy.rd.ResourcePresence; -import org.iotivity.cloud.ciserver.resources.proxy.account.Certificate; import org.iotivity.cloud.util.Log; public class CloudInterfaceServer { @@ -56,15 +57,12 @@ public class CloudInterfaceServer { boolean tlsMode = Integer.parseInt(args[7]) == 1; - ConnectorPool.addConnection("rd", - new InetSocketAddress(args[1], Integer.parseInt(args[2])), - tlsMode); - ConnectorPool.addConnection("account", - new InetSocketAddress(args[3], Integer.parseInt(args[4])), - tlsMode); - ConnectorPool.addConnection("mq", - new InetSocketAddress(args[5], Integer.parseInt(args[6])), - tlsMode); + ConnectorPool.addConnection("rd", new InetSocketAddress(args[1], + Integer.parseInt(args[2])), tlsMode); + ConnectorPool.addConnection("account", new InetSocketAddress(args[3], + Integer.parseInt(args[4])), tlsMode); + ConnectorPool.addConnection("mq", new InetSocketAddress(args[5], + Integer.parseInt(args[6])), tlsMode); DeviceServerSystem deviceServer = new DeviceServerSystem(); @@ -78,6 +76,7 @@ public class CloudInterfaceServer { Acl aclHandler = new Acl(); AclGroup aclGroupHandler = new AclGroup(); Certificate certHandler = new Certificate(); + AclInvite aclInviteHandler = new AclInvite(); CoapDevicePool devicePool = deviceServer.getDevicePool(); @@ -101,15 +100,17 @@ public class CloudInterfaceServer { deviceServer.addResource(certHandler); - KeepAliveResource resKeepAlive = new KeepAliveResource( - new int[] { 1, 2, 4, 8 }); + deviceServer.addResource(aclInviteHandler); + + KeepAliveResource resKeepAlive = new KeepAliveResource(new int[] { 1, + 2, 4, 8 }); deviceServer.addResource(resKeepAlive); deviceServer.addResource(new DiResource(devicePool)); - deviceServer.addServer(new CoapServer( - new InetSocketAddress(Integer.parseInt(args[0])))); + deviceServer.addServer(new CoapServer(new InetSocketAddress(Integer + .parseInt(args[0])))); // deviceServer.addServer(new HttpServer(new InetSocketAddress(8080))); diff --git a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/Account.java b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/Account.java index c0512c0..dd651ee 100644 --- a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/Account.java +++ b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/Account.java @@ -47,15 +47,13 @@ public class Account extends Resource { public void onDefaultRequestReceived(Device srcDevice, IRequest request) throws ServerException { if (request.getMethod().equals(RequestMethod.DELETE)) { - String di = request.getUriQueryMap().get(Constants.REQ_DEVICE_ID) - .get(0); - StringBuffer uriQuery = new StringBuffer(); - uriQuery.append(Constants.REQ_DEVICE_ID + "=" + di); - uriQuery.append(";"); - uriQuery.append(Constants.USER_ID + "=" + srcDevice.getUserId()); - - request = MessageBuilder.modifyRequest(request, null, - uriQuery.toString(), null, null); + StringBuffer additionalQuery = new StringBuffer(); + additionalQuery + .append(Constants.USER_ID + "=" + srcDevice.getUserId()); + String uriQuery = request.getUriQuery() + ";" + + additionalQuery.toString(); + request = MessageBuilder.modifyRequest(request, null, uriQuery, + null, null); } mAuthServer.sendRequest(request, srcDevice); } diff --git a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/AclGroup.java b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/AclGroup.java index a7a14fb..6168556 100644 --- a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/AclGroup.java +++ b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/AclGroup.java @@ -62,9 +62,7 @@ public class AclGroup extends Resource { payloadData.put(Constants.REQ_GROUP_MASTER_ID, srcDevice.getUserId()); } else { - if (!payloadData.containsKey(Constants.REQ_DEVICE_LIST) - && !payloadData - .containsKey(Constants.REQ_MEMBER_LIST)) { + if (payloadData.isEmpty()) { payloadData.put(Constants.REQ_MEMBER_LIST, Arrays.asList(srcDevice.getUserId())); } @@ -81,13 +79,12 @@ public class AclGroup extends Resource { uriGetQuery.toString(), null, null); break; case DELETE: - String uriDeleteQuery; StringBuffer additionalQuery = new StringBuffer(); if (getUriPathSegments() .containsAll(request.getUriPathSegments())) { additionalQuery.append(Constants.REQ_GROUP_MASTER_ID + "=" + srcDevice.getUserId()); - uriDeleteQuery = request.getUriQuery() + ";" + String uriDeleteQuery = request.getUriQuery() + ";" + additionalQuery.toString(); request = MessageBuilder.modifyRequest(request, null, uriDeleteQuery, null, null); diff --git a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/AclInvite.java b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/AclInvite.java new file mode 100644 index 0000000..46c28f5 --- /dev/null +++ b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/AclInvite.java @@ -0,0 +1,87 @@ +/* + * //****************************************************************** + * // + * // Copyright 2016 Samsung Electronics All Rights Reserved. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + */ +package org.iotivity.cloud.ciserver.resources.proxy.account; + +import java.util.Arrays; +import java.util.HashMap; + +import org.iotivity.cloud.base.connector.ConnectorPool; +import org.iotivity.cloud.base.device.Device; +import org.iotivity.cloud.base.device.IRequestChannel; +import org.iotivity.cloud.base.exception.ServerException; +import org.iotivity.cloud.base.protocols.IRequest; +import org.iotivity.cloud.base.protocols.MessageBuilder; +import org.iotivity.cloud.base.protocols.enums.ContentFormat; +import org.iotivity.cloud.base.resource.Resource; +import org.iotivity.cloud.ciserver.Constants; +import org.iotivity.cloud.util.Cbor; + +public class AclInvite extends Resource { + + IRequestChannel mAuthServer = null; + + public AclInvite() { + super(Arrays.asList(Constants.PREFIX_WELL_KNOWN, Constants.PREFIX_OCF, + Constants.ACL_URI, Constants.INVITE_URI)); + + mAuthServer = ConnectorPool.getConnection("account"); + + } + + @Override + public void onDefaultRequestReceived(Device srcDevice, IRequest request) + throws ServerException { + + switch (request.getMethod()) { + + case POST: + + Cbor> cbor = new Cbor<>(); + HashMap payload = cbor.parsePayloadFromCbor( + request.getPayload(), HashMap.class); + + payload.put(Constants.USER_ID, srcDevice.getUserId()); + + request = MessageBuilder.modifyRequest(request, null, null, + ContentFormat.APPLICATION_CBOR, + cbor.encodingPayloadToCbor(payload)); + break; + + default: + + StringBuffer additionalQuery = new StringBuffer(); + additionalQuery.append( + Constants.USER_ID + "=" + srcDevice.getUserId()); + + String uriQuery = additionalQuery.toString() + + (request.getUriQuery() != null + ? (";" + request.getUriQuery()) : ""); + request = MessageBuilder.modifyRequest(request, null, uriQuery, + null, null); + + break; + } + + mAuthServer.sendRequest(request, srcDevice); + } + +} \ No newline at end of file diff --git a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/DevicePresence.java b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/DevicePresence.java index 3b690de..8f0fed7 100644 --- a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/DevicePresence.java +++ b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/DevicePresence.java @@ -30,13 +30,12 @@ import org.iotivity.cloud.base.device.Device; import org.iotivity.cloud.base.device.IRequestChannel; import org.iotivity.cloud.base.device.IResponseEventHandler; import org.iotivity.cloud.base.exception.ClientException; -import org.iotivity.cloud.base.exception.ClientException.BadResponseException; import org.iotivity.cloud.base.exception.ServerException; -import org.iotivity.cloud.base.exception.ServerException.UnAuthorizedException; import org.iotivity.cloud.base.protocols.IRequest; import org.iotivity.cloud.base.protocols.IResponse; import org.iotivity.cloud.base.protocols.MessageBuilder; import org.iotivity.cloud.base.protocols.enums.RequestMethod; +import org.iotivity.cloud.base.protocols.enums.ResponseStatus; import org.iotivity.cloud.base.resource.Resource; import org.iotivity.cloud.ciserver.Constants; import org.iotivity.cloud.util.Cbor; @@ -69,57 +68,74 @@ public class DevicePresence extends Resource { throws ClientException { switch (response.getStatus()) { case CONTENT: - StringBuilder additionalQuery = new StringBuilder(); - HashMap payloadData = mCbor .parsePayloadFromCbor(response.getPayload(), HashMap.class); - List deviceList = (List) payloadData - .get(Constants.REQ_DEVICE_LIST); - if (deviceList != null) { - int index = deviceList.size(); - if (mRequest.getUriQuery() == null) { - for (String device : deviceList) { - if (!device.equals(mSrcDevice.getDeviceId())) { - additionalQuery - .append(Constants.REQ_DEVICE_ID - + "=" + device); - if (--index > 0) { - additionalQuery.append(";"); - } - } - } - String uriQuery = (mRequest.getUriQuery() == null - ? "" : mRequest.getUriQuery()) + ";" - + additionalQuery.toString(); - mRequest = MessageBuilder.modifyRequest(mRequest, - null, uriQuery, null, null); - } else { - List originDeviceList = mRequest - .getUriQueryMap() - .get(Constants.REQ_DEVICE_ID); - if (originDeviceList == null) { - throw new UnAuthorizedException( - "device is not include in group"); - } - for (String device : originDeviceList) { - if (!deviceList.contains(device)) { - throw new UnAuthorizedException(device - + " device is not include in group"); - } - } + + if (mRequest.getUriQuery() != null + && mRequest.getUriQueryMap() + .containsKey(Constants.REQ_DEVICE_ID)) { + if (!getResponseDeviceList(payloadData) + .containsAll(mRequest.getUriQueryMap() + .get(Constants.REQ_DEVICE_ID))) { + mSrcDevice.sendResponse( + MessageBuilder.createResponse(mRequest, + ResponseStatus.BAD_REQUEST)); } - mRDServer.sendRequest(mRequest, mSrcDevice); - } else - throw new UnAuthorizedException( - "There is not device in group"); + } else { + String additionalQuery = makeAdditionalQuery( + payloadData, mSrcDevice.getDeviceId()); + if (additionalQuery == null) { + mSrcDevice.sendResponse( + MessageBuilder.createResponse(mRequest, + ResponseStatus.BAD_REQUEST)); + return; + } + mRequest = MessageBuilder.modifyRequest(mRequest, null, + additionalQuery + + (mRequest.getUriQuery() != null + ? ";" + mRequest.getUriQuery() + : ""), + null, null); + } + + mRDServer.sendRequest(mRequest, mSrcDevice); break; default: - throw new BadResponseException( - response.getStatus().toString() - + " response type is not supported"); + mSrcDevice.sendResponse(MessageBuilder.createResponse( + mRequest, ResponseStatus.BAD_REQUEST)); } } + + private String makeAdditionalQuery(HashMap payloadData, + String did) { + + StringBuilder additionalQuery = new StringBuilder(); + + List deviceList = getResponseDeviceList(payloadData); + + if (deviceList.isEmpty()) { + return null; + } + + int index = deviceList.size(); + for (String device : deviceList) { + additionalQuery.append(Constants.REQ_DEVICE_ID + "=" + device); + if (--index > 0) { + additionalQuery.append(";"); + } + } + return additionalQuery.toString(); + } + + @SuppressWarnings("unchecked") + private List getResponseDeviceList( + HashMap payloadData) { + List deviceList = (List) payloadData + .get(Constants.REQ_DEVICE_LIST); + + return deviceList; + } } @Override diff --git a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourceFind.java b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourceFind.java index 00312b5..635a1b0 100644 --- a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourceFind.java +++ b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourceFind.java @@ -30,13 +30,12 @@ import org.iotivity.cloud.base.device.Device; import org.iotivity.cloud.base.device.IRequestChannel; import org.iotivity.cloud.base.device.IResponseEventHandler; import org.iotivity.cloud.base.exception.ClientException; -import org.iotivity.cloud.base.exception.ClientException.BadResponseException; import org.iotivity.cloud.base.exception.ServerException; -import org.iotivity.cloud.base.exception.ServerException.UnAuthorizedException; import org.iotivity.cloud.base.protocols.IRequest; import org.iotivity.cloud.base.protocols.IResponse; import org.iotivity.cloud.base.protocols.MessageBuilder; import org.iotivity.cloud.base.protocols.enums.RequestMethod; +import org.iotivity.cloud.base.protocols.enums.ResponseStatus; import org.iotivity.cloud.base.resource.Resource; import org.iotivity.cloud.ciserver.Constants; import org.iotivity.cloud.util.Cbor; @@ -68,57 +67,74 @@ public class ResourceFind extends Resource { throws ClientException { switch (response.getStatus()) { case CONTENT: - StringBuilder additionalQuery = new StringBuilder(); - HashMap payloadData = mCbor .parsePayloadFromCbor(response.getPayload(), HashMap.class); - List deviceList = (List) payloadData - .get(Constants.REQ_DEVICE_LIST); - if (deviceList != null) { - int index = deviceList.size(); - if (mRequest.getUriQuery() == null) { - for (String device : deviceList) { - if (!device.equals(mSrcDevice.getDeviceId())) { - additionalQuery - .append(Constants.REQ_DEVICE_ID - + "=" + device); - if (--index > 0) { - additionalQuery.append(";"); - } - } - } - String uriQuery = (mRequest.getUriQuery() == null - ? "" : mRequest.getUriQuery()) + ";" - + additionalQuery.toString(); - mRequest = MessageBuilder.modifyRequest(mRequest, - null, uriQuery, null, null); - } else { - List originDeviceList = mRequest - .getUriQueryMap() - .get(Constants.REQ_DEVICE_ID); - if (originDeviceList == null) { - throw new UnAuthorizedException( - "device is not include in group"); - } - for (String device : originDeviceList) { - if (!deviceList.contains(device)) { - throw new UnAuthorizedException(device - + " device is not include in group"); - } - } + + if (mRequest.getUriQuery() != null + && mRequest.getUriQueryMap() + .containsKey(Constants.REQ_DEVICE_ID)) { + if (!getResponseDeviceList(payloadData) + .containsAll(mRequest.getUriQueryMap() + .get(Constants.REQ_DEVICE_ID))) { + mSrcDevice.sendResponse( + MessageBuilder.createResponse(mRequest, + ResponseStatus.BAD_REQUEST)); } - mRDServer.sendRequest(mRequest, mSrcDevice); - } else - throw new UnAuthorizedException( - "There is not device in group"); + } else { + String additionalQuery = makeAdditionalQuery( + payloadData, mSrcDevice.getDeviceId()); + if (additionalQuery == null) { + mSrcDevice.sendResponse( + MessageBuilder.createResponse(mRequest, + ResponseStatus.BAD_REQUEST)); + return; + } + mRequest = MessageBuilder.modifyRequest(mRequest, null, + additionalQuery + + (mRequest.getUriQuery() != null + ? ";" + mRequest.getUriQuery() + : ""), + null, null); + } + + mRDServer.sendRequest(mRequest, mSrcDevice); break; default: - throw new BadResponseException( - response.getStatus().toString() - + " response type is not supported"); + mSrcDevice.sendResponse(MessageBuilder.createResponse( + mRequest, ResponseStatus.BAD_REQUEST)); } } + + private String makeAdditionalQuery(HashMap payloadData, + String did) { + + StringBuilder additionalQuery = new StringBuilder(); + + List deviceList = getResponseDeviceList(payloadData); + + if (deviceList.isEmpty()) { + return null; + } + + int index = deviceList.size(); + for (String device : deviceList) { + additionalQuery.append(Constants.REQ_DEVICE_ID + "=" + device); + if (--index > 0) { + additionalQuery.append(";"); + } + } + return additionalQuery.toString(); + } + + @SuppressWarnings("unchecked") + private List getResponseDeviceList( + HashMap payloadData) { + List deviceList = (List) payloadData + .get(Constants.REQ_DEVICE_LIST); + + return deviceList; + } } @Override diff --git a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourcePresence.java b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourcePresence.java index 53708e5..e87da65 100644 --- a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourcePresence.java +++ b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourcePresence.java @@ -30,13 +30,12 @@ import org.iotivity.cloud.base.device.Device; import org.iotivity.cloud.base.device.IRequestChannel; import org.iotivity.cloud.base.device.IResponseEventHandler; import org.iotivity.cloud.base.exception.ClientException; -import org.iotivity.cloud.base.exception.ClientException.BadResponseException; import org.iotivity.cloud.base.exception.ServerException; -import org.iotivity.cloud.base.exception.ServerException.UnAuthorizedException; import org.iotivity.cloud.base.protocols.IRequest; import org.iotivity.cloud.base.protocols.IResponse; import org.iotivity.cloud.base.protocols.MessageBuilder; import org.iotivity.cloud.base.protocols.enums.RequestMethod; +import org.iotivity.cloud.base.protocols.enums.ResponseStatus; import org.iotivity.cloud.base.resource.Resource; import org.iotivity.cloud.ciserver.Constants; import org.iotivity.cloud.util.Cbor; @@ -68,57 +67,74 @@ public class ResourcePresence extends Resource { throws ClientException { switch (response.getStatus()) { case CONTENT: - StringBuilder additionalQuery = new StringBuilder(); - HashMap payloadData = mCbor .parsePayloadFromCbor(response.getPayload(), HashMap.class); - List deviceList = (List) payloadData - .get(Constants.REQ_DEVICE_LIST); - if (deviceList != null) { - int index = deviceList.size(); - if (mRequest.getUriQuery() == null) { - for (String device : deviceList) { - if (!device.equals(mSrcDevice.getDeviceId())) { - additionalQuery - .append(Constants.REQ_DEVICE_ID - + "=" + device); - if (--index > 0) { - additionalQuery.append(";"); - } - } - } - String uriQuery = (mRequest.getUriQuery() == null - ? "" : mRequest.getUriQuery()) + ";" - + additionalQuery.toString(); - mRequest = MessageBuilder.modifyRequest(mRequest, - null, uriQuery, null, null); - } else { - List originDeviceList = mRequest - .getUriQueryMap() - .get(Constants.REQ_DEVICE_ID); - if (originDeviceList == null) { - throw new UnAuthorizedException( - "device is not include in group"); - } - for (String device : originDeviceList) { - if (!deviceList.contains(device)) { - throw new UnAuthorizedException(device - + " device is not include in group"); - } - } + + if (mRequest.getUriQuery() != null + && mRequest.getUriQueryMap() + .containsKey(Constants.REQ_DEVICE_ID)) { + if (!getResponseDeviceList(payloadData) + .containsAll(mRequest.getUriQueryMap() + .get(Constants.REQ_DEVICE_ID))) { + mSrcDevice.sendResponse( + MessageBuilder.createResponse(mRequest, + ResponseStatus.BAD_REQUEST)); } - mRDServer.sendRequest(mRequest, mSrcDevice); - } else - throw new UnAuthorizedException( - "There is not device in group"); + } else { + String additionalQuery = makeAdditionalQuery( + payloadData, mSrcDevice.getDeviceId()); + if (additionalQuery == null) { + mSrcDevice.sendResponse( + MessageBuilder.createResponse(mRequest, + ResponseStatus.BAD_REQUEST)); + return; + } + mRequest = MessageBuilder.modifyRequest(mRequest, null, + additionalQuery + + (mRequest.getUriQuery() != null + ? ";" + mRequest.getUriQuery() + : ""), + null, null); + } + + mRDServer.sendRequest(mRequest, mSrcDevice); break; default: - throw new BadResponseException( - response.getStatus().toString() - + " response type is not supported"); + mSrcDevice.sendResponse(MessageBuilder.createResponse( + mRequest, ResponseStatus.BAD_REQUEST)); } } + + private String makeAdditionalQuery(HashMap payloadData, + String did) { + + StringBuilder additionalQuery = new StringBuilder(); + + List deviceList = getResponseDeviceList(payloadData); + + if (deviceList.isEmpty()) { + return null; + } + + int index = deviceList.size(); + for (String device : deviceList) { + additionalQuery.append(Constants.REQ_DEVICE_ID + "=" + device); + if (--index > 0) { + additionalQuery.append(";"); + } + } + return additionalQuery.toString(); + } + + @SuppressWarnings("unchecked") + private List getResponseDeviceList( + HashMap payloadData) { + List deviceList = (List) payloadData + .get(Constants.REQ_DEVICE_LIST); + + return deviceList; + } } @Override diff --git a/cloud/stack/src/main/java/org/iotivity/cloud/base/OCFConstants.java b/cloud/stack/src/main/java/org/iotivity/cloud/base/OCFConstants.java index da358ac..da0232d 100755 --- a/cloud/stack/src/main/java/org/iotivity/cloud/base/OCFConstants.java +++ b/cloud/stack/src/main/java/org/iotivity/cloud/base/OCFConstants.java @@ -23,31 +23,31 @@ package org.iotivity.cloud.base; public class OCFConstants { /* resource Interface for keep-alive */ - public static final String DEFAULT_INTERFACE = "oic.if.baseline"; + public static final String DEFAULT_INTERFACE = "oic.if.baseline"; - public static final String LINK_INTERFACE = "oic.if.ll"; + public static final String LINK_INTERFACE = "oic.if.ll"; - public static final String PREFIX_WELL_KNOWN = ".well-known"; + public static final String PREFIX_WELL_KNOWN = ".well-known"; - public static final String PREFIX_OCF = "ocf"; + public static final String PREFIX_OCF = "ocf"; - public static final String PREFIX_OIC = "oic"; + public static final String PREFIX_OIC = "oic"; - public static final String RS_INTERFACE = "if"; + public static final String RS_INTERFACE = "if"; /* resource url for account */ - public static final String ACCOUNT_URI = "account"; + public static final String ACCOUNT_URI = "account"; - public static final String SESSION_URI = "session"; + public static final String SESSION_URI = "session"; - public static final String DEVICE_URI = "device"; + public static final String DEVICE_URI = "device"; - public static final String TOKEN_REFRESH_URI = "tokenrefresh"; + public static final String TOKEN_REFRESH_URI = "tokenrefresh"; /* resource url for acl */ - public static final String CREDPROV_URI = "credprov"; + public static final String CREDPROV_URI = "credprov"; - public static final String CERT_URI = "cert"; + public static final String CERT_URI = "cert"; /* resource url for acl */ public static final String ACL_URI = "acl"; @@ -58,31 +58,32 @@ public class OCFConstants { public static final String ID_URI = "id"; + public static final String INVITE_URI = "invite"; + /* resource uri to publish, update, delete resource info */ - public static final String RD_URI = "rd"; + public static final String RD_URI = "rd"; /* resource uri for keep-alive */ - public static final String KEEP_ALIVE_URI = "ping"; + public static final String KEEP_ALIVE_URI = "ping"; /* resource uri to discover resource info */ - public static final String WELL_KNOWN_URI = "res"; + public static final String WELL_KNOWN_URI = "res"; /* resource uri for resource presence */ - public static final String RES_PRESENCE_URI = "ad"; + public static final String RES_PRESENCE_URI = "ad"; /* resource uri for device presence */ public static final String DEVICE_PRESENCE_URI = "prs"; /* resource uri for message queue */ - public static final String MQ_BROKER_URI = "ps"; - public static final String MQ_BROKER_RT = "oic.wk.ps"; + public static final String MQ_BROKER_URI = "ps"; /* file path for tls communication - Modify filePath to yours */ - public static final String ROOT_CERT_FILE = "./rootca.crt"; + public static final String ROOT_CERT_FILE = "./rootca.crt"; - public static final String CLOUD_CERT_FILE = "./iotivitycloud.crt"; + public static final String CLOUD_CERT_FILE = "./iotivitycloud.crt"; - public static final String CLOUD_KEY_FILE = "./iotivitycloud.key"; + public static final String CLOUD_KEY_FILE = "./iotivitycloud.key"; /* cloud uuid */ public static final String CLOUD_UUID = "2a6085d1-815d-4277-baba-4e4e4df91308"; diff --git a/cloud/stack/src/main/java/org/iotivity/cloud/base/protocols/Message.java b/cloud/stack/src/main/java/org/iotivity/cloud/base/protocols/Message.java index 91e3df8..9e2a503 100644 --- a/cloud/stack/src/main/java/org/iotivity/cloud/base/protocols/Message.java +++ b/cloud/stack/src/main/java/org/iotivity/cloud/base/protocols/Message.java @@ -72,7 +72,7 @@ public abstract class Message implements IRequest, IResponse { for (byte[] querySegment : uri_query) { uriQuery.append(new String(querySegment, StandardCharsets.UTF_8)); if (--nItem > 0) { - uriQuery.append('&'); + uriQuery.append(';'); } } return uriQuery.toString(); -- 2.7.4