16a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen/* 26a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Copyright (C) 2015 The Android Open Source Project 36a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * 46a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Licensed under the Apache License, Version 2.0 (the "License"); 56a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * you may not use this file except in compliance with the License. 66a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * You may obtain a copy of the License at 76a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * 86a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * http://www.apache.org/licenses/LICENSE-2.0 96a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * 106a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Unless required by applicable law or agreed to in writing, software 116a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * distributed under the License is distributed on an "AS IS" BASIS, 126a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * See the License for the specific language governing permissions and 146a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * limitations under the License. 156a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen */ 166a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 176a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wenpackage com.android.statementservice.retriever; 186a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 196a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wenimport android.annotation.NonNull; 206a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 216a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen/** 226a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * An immutable value type representing a statement, consisting of a source, target, and relation. 236a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * This reflects an assertion that the relation holds for the source, target pair. For example, if a 24871fe6ed66e9de1369fbc7e4a145f98272b88c0bJoseph Wen * web site has the following in its assetlinks.json file: 256a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * 266a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * <pre> 276a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * { 286a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * "relation": ["delegate_permission/common.handle_all_urls"], 296a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * "target" : {"namespace": "android_app", "package_name": "com.example.app", 306a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * "sha256_cert_fingerprints": ["00:11:22:33"] } 316a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * } 326a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * </pre> 336a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * 346a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Then invoking {@link AbstractStatementRetriever#retrieveStatements(AbstractAsset)} will return a 356a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * {@link Statement} with {@link #getSource} equal to the input parameter, {@link #getRelation} 366a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * equal to 376a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * 386a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * <pre>Relation.create("delegate_permission", "common.get_login_creds");</pre> 396a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * 406a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * and with {@link #getTarget} equal to 416a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * 426a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * <pre>AbstractAsset.create("{\"namespace\" : \"android_app\"," 436a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * + "\"package_name\": \"com.example.app\"}" 446a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * + "\"sha256_cert_fingerprints\": \"[\"00:11:22:33\"]\"}"); 456a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * </pre> 466a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen */ 476a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wenpublic final class Statement { 486a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 496a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen private final AbstractAsset mTarget; 506a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen private final Relation mRelation; 516a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen private final AbstractAsset mSource; 526a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 536a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen private Statement(AbstractAsset source, AbstractAsset target, Relation relation) { 546a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen mSource = source; 556a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen mTarget = target; 566a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen mRelation = relation; 576a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 586a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 596a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen /** 606a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Returns the source asset of the statement. 616a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen */ 626a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen @NonNull 636a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen public AbstractAsset getSource() { 646a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen return mSource; 656a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 666a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 676a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen /** 686a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Returns the target asset of the statement. 696a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen */ 706a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen @NonNull 716a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen public AbstractAsset getTarget() { 726a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen return mTarget; 736a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 746a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 756a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen /** 766a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Returns the relation of the statement. 776a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen */ 786a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen @NonNull 796a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen public Relation getRelation() { 806a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen return mRelation; 816a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 826a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 836a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen /** 846a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Creates a new Statement object for the specified target asset and relation. For example: 856a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * <pre> 866a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Asset asset = Asset.Factory.create( 876a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * "{\"namespace\" : \"web\",\"site\": \"https://www.test.com\"}"); 886a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Relation relation = Relation.create("delegate_permission", "common.get_login_creds"); 896a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Statement statement = Statement.create(asset, relation); 906a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * </pre> 916a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen */ 926a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen public static Statement create(@NonNull AbstractAsset source, @NonNull AbstractAsset target, 936a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen @NonNull Relation relation) { 946a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen return new Statement(source, target, relation); 956a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 966a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 976a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen @Override 986a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen public boolean equals(Object o) { 996a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen if (this == o) { 1006a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen return true; 1016a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 1026a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen if (o == null || getClass() != o.getClass()) { 1036a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen return false; 1046a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 1056a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 1066a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen Statement statement = (Statement) o; 1076a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 1086a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen if (!mRelation.equals(statement.mRelation)) { 1096a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen return false; 1106a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 1116a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen if (!mTarget.equals(statement.mTarget)) { 1126a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen return false; 1136a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 1146a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen if (!mSource.equals(statement.mSource)) { 1156a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen return false; 1166a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 1176a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 1186a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen return true; 1196a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 1206a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 1216a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen @Override 1226a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen public int hashCode() { 1236a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen int result = mTarget.hashCode(); 1246a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen result = 31 * result + mRelation.hashCode(); 1256a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen result = 31 * result + mSource.hashCode(); 1266a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen return result; 1276a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 1286a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 1296a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen @Override 1306a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen public String toString() { 1316a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen StringBuilder statement = new StringBuilder(); 1326a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen statement.append("Statement: "); 1336a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen statement.append(mSource); 1346a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen statement.append(", "); 1356a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen statement.append(mTarget); 1366a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen statement.append(", "); 1376a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen statement.append(mRelation); 1386a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen return statement.toString(); 1396a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 1406a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen} 141