private static RobotCapabilities deserialize(ProtoRobotCapabilities data) { Map<EventType, Capability> capabilities = Maps.newHashMap(); for (ProtoRobotCapability capabilityData: data.getCapabilityList()) { Capability capability = deserialize(capabilityData); capabilities.put(capability.getEventType(), capability); } return new RobotCapabilities(capabilities, data.getCapabilitiesHash(), ProtocolVersion.fromVersionString(data.getProtocolVersion())); }
private static ProtoRobotCapabilities serialize(RobotCapabilities capabilities) { ProtoRobotCapabilities.Builder builder = ProtoRobotCapabilities.newBuilder(); builder.setProtocolVersion(capabilities.getProtocolVersion().getVersionString()); builder.setCapabilitiesHash(capabilities.getCapabilitiesHash()); if (capabilities.getCapabilitiesMap() != null) { for (Capability capability: capabilities.getCapabilitiesMap().values()) { builder.addCapability(serialize(capability)); } } return builder.build(); }
return false; } else if (!capabilities.equals(other.capabilities)) { return false;
eventGenerator.generateEvents(wavelet, capabilities.getCapabilitiesMap(), converterManager.getEventDataConverter(capabilities.getProtocolVersion())); connector.sendMessageBundle(messages, this, capabilities.getProtocolVersion()); LOG.info(robotName + ": received operations");
/** * Handles an {@link OperationResults} by submitting the deltas it generates * and sending off any events to the robot. Note that currently no events are * send off to the robot. * * @param results the results of the operations performed * @param account the account for which to handle results of robot operations. */ private void handleResults(OperationResults results, RobotAccountData account) { OperationUtil.submitDeltas(results, waveletProvider, LOGGING_REQUEST_LISTENER); // TODO(ljvderijk): In theory we should be sending off all events that are // generated by the operations. Currently not done in production. We should // make it possible though. boolean notifyOnError = account.getCapabilities().getCapabilitiesMap().containsKey(EventType.OPERATION_ERROR); } }
if (capabilities != null && capabilitiesHash.equals(capabilities.getCapabilitiesHash())) {
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((capabilities == null) ? 0 : capabilities.hashCode()); result = prime * result + ((consumerSecret == null) ? 0 : consumerSecret.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + (isVerified ? 1231 : 1237); result = prime * result + ((url == null) ? 0 : url.hashCode()); return result; }
private boolean compareRobotCapabilities(RobotCapabilities r1, RobotCapabilities r2) { if (r1.getProtocolVersion() != r2.getProtocolVersion() || !r1.getCapabilitiesHash().equals(r2.getCapabilitiesHash())) { return false; } Map<EventType, Capability> map1 = r1.getCapabilitiesMap(); Map<EventType, Capability> map2 = r1.getCapabilitiesMap(); for (EventType eventType : map1.keySet()) { Capability c1 = map1.get(eventType); Capability c2 = map2.get(eventType); if (c2 == null || !compareCapability(c1, c2)) { return false; } } for (EventType eventType : map2.keySet()) { if (!map1.containsKey(eventType)) { return false; } } return true; }
@SuppressWarnings("unchecked") private RobotCapabilities objectToCapabilities(DBObject object) { if (object == null) { return null; } Map<String, Object> capabilitiesObj = (Map<String, Object>) object.get(CAPABILITIES_CAPABILITIES_FIELD); Map<EventType, Capability> capabilities = CollectionUtils.newHashMap(); for (Entry<String, Object> capability : capabilitiesObj.entrySet()) { EventType eventType = EventType.valueOf(capability.getKey()); List<Context> contexts = CollectionUtils.newArrayList(); DBObject capabilityObj = (DBObject) capability.getValue(); DBObject contextsObj = (DBObject) capabilityObj.get(CAPABILITY_CONTEXTS_FIELD); for (String contextId : contextsObj.keySet()) { contexts.add(Context.valueOf((String) contextsObj.get(contextId))); } String filter = (String) capabilityObj.get(CAPABILITY_FILTER_FIELD); capabilities.put(eventType, new Capability(eventType, contexts, filter)); } String capabilitiesHash = (String) object.get(CAPABILITIES_HASH_FIELD); ProtocolVersion version = ProtocolVersion.valueOf((String) object.get(CAPABILITIES_VERSION_FIELD)); return new RobotCapabilities(capabilities, capabilitiesHash, version); } }
private boolean compareRobotCapabilities(RobotCapabilities r1, RobotCapabilities r2) { if (r1.getProtocolVersion() != r2.getProtocolVersion() || !r1.getCapabilitiesHash().equals(r2.getCapabilitiesHash())) { return false; } Map<EventType, Capability> map1 = r1.getCapabilitiesMap(); Map<EventType, Capability> map2 = r1.getCapabilitiesMap(); for (EventType eventType : map1.keySet()) { Capability c1 = map1.get(eventType); Capability c2 = map2.get(eventType); if (c2 == null || !compareCapability(c1, c2)) { return false; } } for (EventType eventType : map2.keySet()) { if (!map1.containsKey(eventType)) { return false; } } return true; }
@Override protected void setUp() throws Exception { super.setUp(); robotAccount = new RobotAccountDataImpl(ROBOT_ID, "example.com", "secret", null, false); // For the updatedRobotAccount, we'll put a few capabilities in with a mix // of field values. Map<EventType, Capability> capabilities = CollectionUtils.newHashMap(); capabilities.put( EventType.WAVELET_BLIP_CREATED, new Capability(EventType.WAVELET_BLIP_CREATED)); capabilities.put(EventType.DOCUMENT_CHANGED, new Capability(EventType.DOCUMENT_CHANGED, CollectionUtils.newArrayList(Context.SIBLINGS))); capabilities.put(EventType.BLIP_SUBMITTED, new Capability(EventType.BLIP_SUBMITTED, CollectionUtils.newArrayList(Context.SIBLINGS, Context.PARENT), "blah")); updatedRobotAccount = new RobotAccountDataImpl(ROBOT_ID, "example.com", "secret", new RobotCapabilities( capabilities, "FAKEHASH", ProtocolVersion.DEFAULT), true); convertedRobot = new HumanAccountDataImpl(ROBOT_ID); }
private DBObject capabilitiesToObject(RobotCapabilities capabilities) { if (capabilities == null) { return null; } BasicDBObject capabilitiesObj = new BasicDBObject(); for (Capability capability : capabilities.getCapabilitiesMap().values()) { BasicBSONList contexts = new BasicBSONList(); for (Context c : capability.getContexts()) { contexts.add(c.name()); } capabilitiesObj.put(capability.getEventType().name(), new BasicDBObject() .append(CAPABILITY_CONTEXTS_FIELD, contexts) .append(CAPABILITY_FILTER_FIELD, capability.getFilter())); } BasicDBObject object = new BasicDBObject() .append(CAPABILITIES_CAPABILITIES_FIELD, capabilitiesObj) .append(CAPABILITIES_HASH_FIELD, capabilities.getCapabilitiesHash()) .append(CAPABILITIES_VERSION_FIELD, capabilities.getProtocolVersion().name()); return object; }
@Override protected void setUp() throws Exception { super.setUp(); robotAccount = new RobotAccountDataImpl(ROBOT_ID, "example.com", "secret", null, false); // For the updatedRobotAccount, we'll put a few capabilities in with a mix // of field values. Map<EventType, Capability> capabilities = CollectionUtils.newHashMap(); capabilities.put( EventType.WAVELET_BLIP_CREATED, new Capability(EventType.WAVELET_BLIP_CREATED)); capabilities.put(EventType.DOCUMENT_CHANGED, new Capability(EventType.DOCUMENT_CHANGED, CollectionUtils.newArrayList(Context.SIBLINGS))); capabilities.put(EventType.BLIP_SUBMITTED, new Capability(EventType.BLIP_SUBMITTED, CollectionUtils.newArrayList(Context.SIBLINGS, Context.PARENT), "blah")); updatedRobotAccount = new RobotAccountDataImpl(ROBOT_ID, "example.com", "secret", new RobotCapabilities( capabilities, "FAKEHASH", ProtocolVersion.DEFAULT), true); convertedRobot = new HumanAccountDataImpl(ROBOT_ID); }
public void testFetchCapabilities() throws Exception { when(connection.get(TEST_CAPABILITIES_ENDPOINT)).thenReturn(CAPABILITIES_XML); RobotAccountData accountData = connector.fetchCapabilities(ROBOT_ACCOUNT, ""); RobotCapabilities capabilities = accountData.getCapabilities(); assertEquals("Expected capabilities hash as specified in the xml", CAPABILITIES_HASH, capabilities.getCapabilitiesHash()); assertEquals("Expected protocol version as specified in the xml", ProtocolVersion.V2_2, capabilities.getProtocolVersion()); Map<EventType, Capability> capabilitiesMap = capabilities.getCapabilitiesMap(); assertTrue("Expected capabilities as specified in the xml", capabilitiesMap.size() == 2); assertTrue("Expected capabilities as specified in the xml", capabilitiesMap.containsKey(EventType.WAVELET_SELF_ADDED)); assertTrue("Expected capabilities as specified in the xml", capabilitiesMap.containsKey(EventType.OPERATION_ERROR)); // Only one connection should be made verify(connection).get(TEST_CAPABILITIES_ENDPOINT); } }
@Override protected void setUp() throws Exception { super.setUp(); robotAccount = new RobotAccountDataImpl(ROBOT_ID, "example.com", "secret", null, false); Map<EventType, Capability> capabilities = CollectionUtils.newHashMap(); capabilities.put( EventType.WAVELET_BLIP_CREATED, new Capability(EventType.WAVELET_BLIP_CREATED)); capabilities.put(EventType.DOCUMENT_CHANGED, new Capability(EventType.DOCUMENT_CHANGED, CollectionUtils.newArrayList(Context.SIBLINGS))); capabilities.put(EventType.BLIP_SUBMITTED, new Capability(EventType.BLIP_SUBMITTED, CollectionUtils.newArrayList(Context.SIBLINGS, Context.PARENT), "blah")); robotAccountWithCapabilities = new RobotAccountDataImpl(ROBOT_ID, "example.com", "secret", new RobotCapabilities( capabilities, "FAKEHASH", ProtocolVersion.DEFAULT), true); humanAccount = new HumanAccountDataImpl(HUMAN_ID); humanAccountWithDigest = new HumanAccountDataImpl(HUMAN_ID, new PasswordDigest("password".toCharArray())); }
public void testFetchCapabilities() throws Exception { when(connection.get(TEST_CAPABILITIES_ENDPOINT)).thenReturn(CAPABILITIES_XML); RobotAccountData accountData = connector.fetchCapabilities(ROBOT_ACCOUNT, ""); RobotCapabilities capabilities = accountData.getCapabilities(); assertEquals("Expected capabilities hash as specified in the xml", CAPABILITIES_HASH, capabilities.getCapabilitiesHash()); assertEquals("Expected protocol version as specified in the xml", ProtocolVersion.V2_2, capabilities.getProtocolVersion()); Map<EventType, Capability> capabilitiesMap = capabilities.getCapabilitiesMap(); assertTrue("Expected capabilities as specified in the xml", capabilitiesMap.size() == 2); assertTrue("Expected capabilities as specified in the xml", capabilitiesMap.containsKey(EventType.WAVELET_SELF_ADDED)); assertTrue("Expected capabilities as specified in the xml", capabilitiesMap.containsKey(EventType.OPERATION_ERROR)); // Only one connection should be made verify(connection).get(TEST_CAPABILITIES_ENDPOINT); } }
@Override protected void setUp() throws Exception { super.setUp(); robotAccount = new RobotAccountDataImpl(ROBOT_ID, "example.com", "secret", null, false); Map<EventType, Capability> capabilities = CollectionUtils.newHashMap(); capabilities.put( EventType.WAVELET_BLIP_CREATED, new Capability(EventType.WAVELET_BLIP_CREATED)); capabilities.put(EventType.DOCUMENT_CHANGED, new Capability(EventType.DOCUMENT_CHANGED, CollectionUtils.newArrayList(Context.SIBLINGS))); capabilities.put(EventType.BLIP_SUBMITTED, new Capability(EventType.BLIP_SUBMITTED, CollectionUtils.newArrayList(Context.SIBLINGS, Context.PARENT), "blah")); robotAccountWithCapabilities = new RobotAccountDataImpl(ROBOT_ID, "example.com", "secret", new RobotCapabilities( capabilities, "FAKEHASH", ProtocolVersion.DEFAULT), true); humanAccount = new HumanAccountDataImpl(HUMAN_ID); humanAccountWithDigest = new HumanAccountDataImpl(HUMAN_ID, new PasswordDigest("password".toCharArray())); }
/** * Returns a new {@link RobotAccountData} updated with the new capabilities * using the given {@link RobotAccountData}. * * @param account The {@link RobotAccountData} to update the capabilities for. * @param activeApiUrl the url of the Active Robot API. * @throws CapabilityFetchException if the capabilities couldn't be retrieved * or parsed. */ public RobotAccountData fetchCapabilities(RobotAccountData account, String activeApiUrl) throws CapabilityFetchException { RobotCapabilitiesParser parser = new RobotCapabilitiesParser( account.getUrl() + Robot.CAPABILITIES_URL, connection, activeApiUrl); RobotCapabilities capabilities = new RobotCapabilities( parser.getCapabilities(), parser.getCapabilitiesHash(), parser.getProtocolVersion()); return new RobotAccountDataImpl(account.getId(), account.getUrl(), account.getConsumerSecret(), capabilities, account.isVerified()); } }