/*
* 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.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import edu.psu.cse.siis.coal.values.BasePropagationValue;
import edu.psu.cse.siis.coal.values.BottomPropagationValue;
import edu.psu.cse.siis.coal.values.NullPathValue;
import edu.psu.cse.siis.coal.values.PathValue;
import edu.psu.cse.siis.coal.values.PropagationValue;
import edu.psu.cse.siis.coal.values.TopPropagationValue;
public class DbConnection extends SQLConnection {
public static Map<PathValue, Integer> insertIntentAtExitPoint(String className, String method,
int instruction, BasePropagationValue intentValue, String exit_kind,
Set<String> intentPermissions, Integer missingIntents, Set<String> exitPointComponents,
Map<String, Integer> componentToIdMap) throws SQLException {
PropagationValue propagationValue = null;
if (intentValue == null || intentValue instanceof TopPropagationValue
|| intentValue instanceof BottomPropagationValue) {
missingIntents = 0;
} else if (intentValue instanceof PropagationValue) {
propagationValue = (PropagationValue) intentValue;
if (propagationValue.getPathValues() == null || propagationValue.getPathValues().size() == 0) {
missingIntents = 0;
}
} else {
throw new RuntimeException("Unknown PropagationValue type: " + intentValue.getClass());
}
int exitPointId = insertExitPoint(className, method, instruction, exit_kind, missingIntents);
Set<Pair<Integer, Integer>> exitPointComponentPairs = new HashSet<>();
for (String exitPointComponent : exitPointComponents) {
exitPointComponentPairs.add(new Pair<Integer, Integer>(exitPointId, componentToIdMap
.get(exitPointComponent)));
}
exitPointComponentTable.batchInsert(exitPointComponentPairs);
Map<PathValue, Integer> pairs = new HashMap<PathValue, Integer>();
// if (intentValue.getIgnored()) {
// missedIntentTable.insert(exitPointId, Constants.NOT_FOUND);
// } else {
if (missingIntents == null) {
Set<PathValue> singleIntentValues = propagationValue.getPathValues();
if (singleIntentValues != null) {
for (PathValue singleIntentValue : singleIntentValues) {
if (exit_kind.equals(Constants.ComponentShortType.PROVIDER)) {
insertUriAndValue(exitPointId, singleIntentValue);
} else {
int intentId = insertIntentAndValue(exitPointId, singleIntentValue);
if (intentId != Constants.NOT_FOUND) {
pairs.put(singleIntentValue, intentId);
}
}
}
}
}
// }
if (intentPermissions != null) {
for (String intentPermission : intentPermissions) {
insertIntentPermission(exitPointId, intentPermission);
}
}
return pairs;
}
public static void insertComponentExtras(Set<String> entryPoints,
Map<String, Integer> componentToIdMap, Set<String> extras) throws SQLException {
for (String entryPoint : entryPoints) {
for (String extra : extras) {
componentExtraTable.insert(componentToIdMap.get(entryPoint), extra);
}
}
}
protected static int insertIntentAndValue(int exitPointId, PathValue singleIntentValue)
throws SQLException {
// System.out.println(singleIntentValue);
List<Integer> actionIds = new ArrayList<Integer>();
List<Integer> categoryIds = new ArrayList<Integer>();
insertStrings(actionStringTable,
Collections.singleton(singleIntentValue.getScalarStringFieldValue("action")), actionIds);
insertStrings(categoryStringTable, singleIntentValue.getSetStringFieldValue("categories"),
categoryIds);
// if (find) {
// int intentId =
// intentTable.find(exitPointId, actionIds, categoryIds,
// singleIntentValue.getSingleStringFieldValue("type"),
// singleIntentValue.getStringFieldValue("extras"), false);
// if (intentId != Constants.NOT_FOUND) {
// return intentId;
// }
// }
int intentId =
intentTable.forceInsert(exitPointId,
singleIntentValue.getScalarStringFieldValue("clazz") == null, false);
// for (int actionId : actionIds) {
// intentActionTable.forceInsert(intentId, actionId);
// }
intentActionTable.batchForceInsert(intentId, actionIds);
// for (int categoryId : categoryIds) {
// intentCategoryTable.forceInsert(intentId, categoryId);
// }
intentCategoryTable.batchForceInsert(intentId, categoryIds);
String type = singleIntentValue.getScalarStringFieldValue("dataType");
if (type != null) {
String[] typeParts = null;
if (type.equals(Constants.ANY_STRING)) {
typeParts = new String[] { Constants.ANY_STRING, Constants.ANY_STRING };
} else {
typeParts = type.split("/");
if (typeParts.length != 2) {
typeParts = null;
}
}
if (typeParts != null) {
intentMimeTypeTable.forceInsert(intentId, typeParts[0], typeParts[1]);
}
}
Set<String> extras = singleIntentValue.getSetStringFieldValue("extras");
if (extras != null) {
for (String extra : extras) {
intentExtraTable.forceInsert(intentId, extra);
}
}
int dataId = insertData(singleIntentValue);
if (dataId != Constants.NOT_FOUND) {
intentDataTable.forceInsert(intentId, dataId);
}
String clazz = singleIntentValue.getScalarStringFieldValue("clazz");
if (clazz != null) {
intentClassTable.insert(intentId, clazz);
}
String pkg = singleIntentValue.getScalarStringFieldValue("package");
if (pkg != null) {
intentPackageTable.insert(intentId, pkg);
}
return intentId;
}
protected static void insertUriAndValue(int exitPointId, PathValue singleIntentValue)
throws SQLException {
if (singleIntentValue instanceof NullPathValue) {
return;
}
int dataId = insertData(singleIntentValue);
uriTable.forceInsert(exitPointId, dataId != Constants.NOT_FOUND ? dataId : null);
}
protected static int insertData(PathValue singleIntentValue) throws SQLException {
if (singleIntentValue.containsNonNullFieldValue("scheme")
|| singleIntentValue.containsNonNullFieldValue("ssp")
|| singleIntentValue.containsNonNullFieldValue("uri")
|| singleIntentValue.containsNonNullFieldValue("path")
|| singleIntentValue.containsNonNullFieldValue("query")
|| singleIntentValue.containsNonNullFieldValue("authority")) {
return uriDataTable.forceInsert(singleIntentValue.getScalarStringFieldValue("scheme"),
singleIntentValue.getScalarStringFieldValue("ssp"),
singleIntentValue.getScalarStringFieldValue("uri"),
singleIntentValue.getScalarStringFieldValue("path"),
singleIntentValue.getScalarStringFieldValue("query"),
singleIntentValue.getScalarStringFieldValue("authority"));
} else {
return Constants.NOT_FOUND;
}
}
}