/*
* Copyright (C) 2015 The Pennsylvania State University and the University of Wisconsin
* Systems and Internet Infrastructure Security Laboratory
*
* Author: Damien Octeau
*
* 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 edu.psu.cse.siis.ic3.db;
import java.sql.SQLException;
import java.sql.Types;
public class ComponentTable extends Table {
private static final String INSERT = "INSERT INTO Components "
+ "(class_id, kind, exported, permission, missing) VALUES (?, ?, ?, ?, ?)";
private static final String FIND =
"SELECT id FROM Components WHERE class_id = ? AND kind = ? AND exported = ? "
+ "AND permission %s ? AND missing %s ?";
// private static final String FIND_COMPONENT_FOR_EXPLICIT_INTENT =
// "SELECT Components.id, kind FROM Applications " +
// "JOIN Classes ON Applications.id = Classes.app_id " +
// "JOIN Components ON Classes.id = Components.class_id " +
// "LEFT JOIN UsesPermissions ON Applications.id = UsesPermissions.app_id " +
// "WHERE (Applications.id = ? OR exported = ?) " +
// "AND class = ? " +
// "AND (permission IS ?";
// private PreparedStatement findComponentForIntentStatement = null;
public int insert(int classId, String type, boolean exported, int permission,
Integer missingIntentFilters) throws SQLException {
int id = find(classId, type, exported, permission, missingIntentFilters);
if (id != NOT_FOUND) {
return id;
}
if (insertStatement == null || insertStatement.isClosed()) {
insertStatement = getConnection().prepareStatement(INSERT);
}
insertStatement.setInt(1, classId);
insertStatement.setString(2, type);
insertStatement.setBoolean(3, exported);
if (permission == NOT_FOUND) {
insertStatement.setNull(4, Types.INTEGER);
} else {
insertStatement.setInt(4, permission);
}
if (missingIntentFilters == null) {
insertStatement.setNull(5, Types.INTEGER);
} else {
insertStatement.setInt(5, missingIntentFilters);
}
if (insertStatement.executeUpdate() == 0) {
return NOT_FOUND;
}
return findAutoIncrement();
}
public int find(int classId, String type, boolean exported, int permission,
Integer missingIntentFilters) throws SQLException {
String formatArg1 = (permission == NOT_FOUND) ? "IS" : "=";
String formatArg2 = (missingIntentFilters == null) ? "IS" : "=";
findStatement = getConnection().prepareStatement(String.format(FIND, formatArg1, formatArg2));
findStatement.setInt(1, classId);
findStatement.setString(2, type);
findStatement.setBoolean(3, exported);
if (permission == NOT_FOUND) {
findStatement.setNull(4, Types.VARCHAR);
} else {
findStatement.setInt(4, permission);
}
if (missingIntentFilters == null) {
findStatement.setNull(5, Types.INTEGER);
} else {
findStatement.setInt(5, missingIntentFilters);
}
return processIntFindQuery(findStatement);
}
// public int findComponentForIntent(int appId, String clazz, Set<String> usesPermissions)
// throws SQLException {
// StringBuilder queryBuilder = new StringBuilder(FIND_COMPONENT_FOR_EXPLICIT_INTENT);
//
// if (usesPermissions != null) {
// for (int i = 0; i < usesPermissions.size(); ++i) {
// queryBuilder.append(" OR permission = ?");
// }
// }
// queryBuilder.append(")");
//
// findComponentForIntentStatement = getConnection().prepareStatement(queryBuilder.toString());
//
// int parameterIndex = 1;
// findComponentForIntentStatement.setInt(parameterIndex++, appId);
// findComponentForIntentStatement.setBoolean(parameterIndex++, true);
// findComponentForIntentStatement.setString(parameterIndex++, clazz.replace("/", "."));
// findComponentForIntentStatement.setNull(parameterIndex++, Types.VARCHAR);
// if (usesPermissions != null) {
// for (String usesPermission : usesPermissions) {
// findComponentForIntentStatement.setString(parameterIndex++, usesPermission);
// }
// }
//
// // System.out.println("Explicit matching: " + findComponentForIntentStatement.toString());
// // long startTime = System.nanoTime();
// ResultSet resultSet = findComponentForIntentStatement.executeQuery();
// // long endTime = System.nanoTime();
// // long duration = endTime - startTime;
// // System.out.println(duration);
// int result;
// if (resultSet.next()) {
// result = resultSet.getInt("Components.id");
// } else {
// result = NOT_FOUND;
// }
// resultSet.close();
// return result;
// }
}