/* * Copyright 2014-2016 CyberVision, Inc. * * 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.kaaproject.kaa.client.channel.impl.transports; import org.kaaproject.kaa.client.KaaClientProperties; import org.kaaproject.kaa.client.channel.ProfileTransport; import org.kaaproject.kaa.client.profile.ProfileManager; import org.kaaproject.kaa.common.TransportType; import org.kaaproject.kaa.common.endpoint.gen.ProfileSyncRequest; import org.kaaproject.kaa.common.endpoint.gen.ProfileSyncResponse; import org.kaaproject.kaa.common.endpoint.gen.SyncResponseStatus; import org.kaaproject.kaa.common.hash.EndpointObjectHash; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.ByteBuffer; public class DefaultProfileTransport extends AbstractKaaTransport implements ProfileTransport { private static final Logger LOG = LoggerFactory.getLogger(DefaultProfileTransport.class); private ProfileManager manager; private KaaClientProperties properties; private boolean isProfileOutDated(EndpointObjectHash currentProfileHash) { EndpointObjectHash currentHash = clientState.getProfileHash(); return currentHash == null || !currentHash.equals(currentProfileHash); } @Override public void sync() { syncAll(TransportType.PROFILE); } @Override public ProfileSyncRequest createProfileRequest() throws IOException { if (clientState != null && manager != null && properties != null) { byte[] serializedProfile = manager.getSerializedProfile(); EndpointObjectHash currentProfileHash = EndpointObjectHash.fromSha1(serializedProfile); if (isProfileOutDated(currentProfileHash) || !clientState.isRegistered() || clientState.isNeedProfileResync()) { clientState.setProfileHash(currentProfileHash); ProfileSyncRequest request = new ProfileSyncRequest(); request.setEndpointAccessToken(clientState.getEndpointAccessToken()); if (!clientState.isRegistered()) { request.setEndpointPublicKey(ByteBuffer.wrap(clientState.getPublicKey().getEncoded())); } request.setProfileBody(ByteBuffer.wrap(serializedProfile)); return request; } else { LOG.info("Profile is up to date"); } } else { LOG.error("Failed to create ProfileSyncRequest clientState {}, manager {}, properties {}", clientState, manager, properties); } return null; } @Override public void onProfileResponse(ProfileSyncResponse response) throws Exception { if (response.getResponseStatus() == SyncResponseStatus.RESYNC) { clientState.setIfNeedProfileResync(true); sync(); } else if (clientState != null && !clientState.isRegistered()) { clientState.setRegistered(true); } LOG.info("Processed profile response"); } @Override public void setProfileManager(ProfileManager manager) { this.manager = manager; } @Override public void setClientProperties(KaaClientProperties properties) { this.properties = properties; } @Override protected TransportType getTransportType() { return TransportType.PROFILE; } }