blob: 0f40a622101774ee97901627cf42d54a202319b4 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* 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 com.android.statementservice.retriever;
import android.annotation.NonNull;
/**
* An immutable value type representing a statement, consisting of a source, target, and relation.
* This reflects an assertion that the relation holds for the source, target pair. For example, if a
* web site has the following in its assetlinks.json file:
*
* <pre>
* {
* "relation": ["delegate_permission/common.handle_all_urls"],
* "target" : {"namespace": "android_app", "package_name": "com.example.app",
* "sha256_cert_fingerprints": ["00:11:22:33"] }
* }
* </pre>
*
* Then invoking {@link AbstractStatementRetriever#retrieveStatements(AbstractAsset)} will return a
* {@link Statement} with {@link #getSource} equal to the input parameter, {@link #getRelation}
* equal to
*
* <pre>Relation.create("delegate_permission", "common.get_login_creds");</pre>
*
* and with {@link #getTarget} equal to
*
* <pre>AbstractAsset.create("{\"namespace\" : \"android_app\","
* + "\"package_name\": \"com.example.app\"}"
* + "\"sha256_cert_fingerprints\": \"[\"00:11:22:33\"]\"}");
* </pre>
*/
public final class Statement {
private final AbstractAsset mTarget;
private final Relation mRelation;
private final AbstractAsset mSource;
private Statement(AbstractAsset source, AbstractAsset target, Relation relation) {
mSource = source;
mTarget = target;
mRelation = relation;
}
/**
* Returns the source asset of the statement.
*/
@NonNull
public AbstractAsset getSource() {
return mSource;
}
/**
* Returns the target asset of the statement.
*/
@NonNull
public AbstractAsset getTarget() {
return mTarget;
}
/**
* Returns the relation of the statement.
*/
@NonNull
public Relation getRelation() {
return mRelation;
}
/**
* Creates a new Statement object for the specified target asset and relation. For example:
* <pre>
* Asset asset = Asset.Factory.create(
* "{\"namespace\" : \"web\",\"site\": \"https://www.test.com\"}");
* Relation relation = Relation.create("delegate_permission", "common.get_login_creds");
* Statement statement = Statement.create(asset, relation);
* </pre>
*/
public static Statement create(@NonNull AbstractAsset source, @NonNull AbstractAsset target,
@NonNull Relation relation) {
return new Statement(source, target, relation);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Statement statement = (Statement) o;
if (!mRelation.equals(statement.mRelation)) {
return false;
}
if (!mTarget.equals(statement.mTarget)) {
return false;
}
if (!mSource.equals(statement.mSource)) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = mTarget.hashCode();
result = 31 * result + mRelation.hashCode();
result = 31 * result + mSource.hashCode();
return result;
}
@Override
public String toString() {
StringBuilder statement = new StringBuilder();
statement.append("Statement: ");
statement.append(mSource);
statement.append(", ");
statement.append(mTarget);
statement.append(", ");
statement.append(mRelation);
return statement.toString();
}
}