/* SAAF: A static analyzer for APK files. * Copyright (C) 2013 syssec.rub.de * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package de.rub.syssec.saaf.db.persistence.sql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import de.rub.syssec.saaf.db.persistence.exceptions.InvalidEntityException; import de.rub.syssec.saaf.db.persistence.exceptions.PersistenceException; import de.rub.syssec.saaf.db.persistence.interfaces.AnalysisEntityManagerInterface; import de.rub.syssec.saaf.db.persistence.interfaces.ApplicationEntityManagerInterface; import de.rub.syssec.saaf.db.persistence.interfaces.BTPatternEntityManagerInterface; import de.rub.syssec.saaf.db.persistence.interfaces.BTResultEntityManagerInterface; import de.rub.syssec.saaf.db.persistence.interfaces.ClassEntityManagerInterface; import de.rub.syssec.saaf.db.persistence.interfaces.EntityManagerFacade; import de.rub.syssec.saaf.db.persistence.interfaces.HPatternEntityManagerInterface; import de.rub.syssec.saaf.db.persistence.interfaces.HResultEntityManagerInterface; import de.rub.syssec.saaf.db.persistence.interfaces.MethodEntityManagerInterface; import de.rub.syssec.saaf.db.persistence.interfaces.PackageEntityManagerInterface; import de.rub.syssec.saaf.db.persistence.interfaces.PermissionEntityManagerInterface; import de.rub.syssec.saaf.db.persistence.interfaces.PermissionRequestEntityManagerInterface; import de.rub.syssec.saaf.db.persistence.interfaces.SAAFExceptionEntityManagerInterface; import de.rub.syssec.saaf.misc.config.Config; import de.rub.syssec.saaf.misc.config.ConfigKeys; import de.rub.syssec.saaf.model.Entity; import de.rub.syssec.saaf.model.analysis.AnalysisInterface; import de.rub.syssec.saaf.model.analysis.BTPatternInterface; import de.rub.syssec.saaf.model.analysis.BTResultInterface; import de.rub.syssec.saaf.model.analysis.HPatternInterface; import de.rub.syssec.saaf.model.analysis.HResultInterface; import de.rub.syssec.saaf.model.application.ApplicationInterface; import de.rub.syssec.saaf.model.application.ClassInterface; import de.rub.syssec.saaf.model.application.MethodInterface; import de.rub.syssec.saaf.model.application.PackageInterface; import de.rub.syssec.saaf.model.application.manifest.PermissionRequestInterface; /** * Default Implementation of GenericEntityManager that works as a facade. * * @author Tilman Bender <tilman.bender@rub.de> * */ public class EntityManagerImpl implements EntityManagerFacade { private ApplicationEntityManagerInterface appManager; private PackageEntityManagerInterface packageManger; private ClassEntityManagerInterface classManager; private MethodEntityManagerInterface methodManager; private AnalysisEntityManagerInterface analysisManager; private BTResultEntityManagerInterface btResultManager; private HResultEntityManagerInterface hResultManager; private BTPatternEntityManagerInterface btPatternManager; private HPatternEntityManagerInterface hPatternManager; private PermissionRequestEntityManagerInterface permRequestManager; private SAAFExceptionEntityManagerInterface exceptionManager; private Connection connection; private PermissionEntityManagerInterface permissionManager; /** * * @param config * @throws PersistenceException */ public EntityManagerImpl(Config config) throws PersistenceException{ super(); String driver = config.getConfigValue(ConfigKeys.DATABASE_DRIVER); String connectString = config.getConfigValue(ConfigKeys.DATABASE_CONNECTION_STRING); String username = config.getConfigValue(ConfigKeys.DATABASE_USER); String password = config.getConfigValue(ConfigKeys.DATABASE_PASSWORD); this.connection = null; try { Class.forName(driver); // create a database connection connection = DriverManager.getConnection(connectString, username, password); this.appManager = new ApplicationEntityManager(connection); this.packageManger = new PackageEntityManager(connection); this.classManager = new ClassEntityManager(connection); this.methodManager = new MethodEntityManager(connection); this.analysisManager = new AnalysisEntityManager(connection); this.btResultManager = new BTResultEntityManager(connection); this.hResultManager = new HResultEntityManager(connection); this.btPatternManager = new BTPatternEntityManager(connection); this.hPatternManager = new HPatternEntityManager(connection); this.permissionManager = new PermissionEntityManager(connection); this.permRequestManager = new PermissionRequestEntityManager(connection); this.exceptionManager = new ExceptionEntityManager(connection); } catch (ClassNotFoundException e) { throw new PersistenceException("Error setting up EntityManagers", e); } catch (SQLException e) { throw new PersistenceException("Error setting up EntityManagers", e); } } @Override public boolean save(Entity entity) throws InvalidEntityException, PersistenceException { if (entity instanceof ApplicationInterface) return this.appManager.save((ApplicationInterface) entity); if (entity instanceof BTPatternInterface) return this.btPatternManager.save((BTPatternInterface) entity); if (entity instanceof HPatternInterface) return this.hPatternManager.save((HPatternInterface) entity); if (entity instanceof ClassInterface) return this.classManager.save((ClassInterface) entity); if (entity instanceof MethodInterface) return this.methodManager.save((MethodInterface) entity); if (entity instanceof PackageInterface) return this.packageManger.save((PackageInterface) entity); if (entity instanceof AnalysisInterface) { AnalysisInterface analysis = (AnalysisInterface) entity; boolean success = this.analysisManager.save(analysis); if(success) { List<BTResultInterface> btresults = analysis.getBTResults(); if (btresults != null) { btResultManager.saveAll(btresults); } List<HResultInterface> hresults = analysis.getHResults(); if (hresults != null) { hResultManager.saveAll(hresults); } if(analysis.getApp()!=null && analysis.getApp().getManifest()!=null) { Collection<PermissionRequestInterface> permrequests = analysis.getApp().getManifest().getRequestedPermissions(); for(PermissionRequestInterface request : permrequests) { if(request.getAnalysis()==null) { request.setAnalysis(analysis); } permRequestManager.save(request); } } exceptionManager.saveAll(((AnalysisInterface) entity).getNonCriticalExceptions()); exceptionManager.saveAll(((AnalysisInterface) entity).getCriticalExceptions()); } return success; } if (entity instanceof HResultInterface) return this.hResultManager.save((HResultInterface) entity); if (entity instanceof BTResultInterface) return this.btResultManager.save((BTResultInterface) entity); return false; } @Override public boolean delete(Entity entity) throws InvalidEntityException, PersistenceException { if (entity instanceof ApplicationInterface) return this.appManager.delete((ApplicationInterface) entity); if (entity instanceof BTPatternInterface) return this.btPatternManager.delete((BTPatternInterface) entity); if (entity instanceof HPatternInterface) return this.hPatternManager.delete((HPatternInterface) entity); if (entity instanceof ClassInterface) return this.classManager.delete((ClassInterface) entity); if (entity instanceof MethodInterface) return this.methodManager.delete((MethodInterface) entity); if (entity instanceof PackageInterface) return this.packageManger.delete((PackageInterface) entity); if (entity instanceof AnalysisInterface) return this.analysisManager.delete((AnalysisInterface) entity); if (entity instanceof HResultInterface) return this.hResultManager.delete((HResultInterface) entity); if (entity instanceof BTResultInterface) return this.btResultManager.delete((BTResultInterface) entity); return false; } @Override public boolean validate(Entity entity) throws InvalidEntityException { if (entity instanceof ApplicationInterface) return this.appManager.validate((ApplicationInterface) entity); if (entity instanceof BTPatternInterface) return this.btPatternManager.validate((BTPatternInterface) entity); if (entity instanceof HPatternInterface) return this.hPatternManager.validate((HPatternInterface) entity); if (entity instanceof ClassInterface) return this.classManager.validate((ClassInterface) entity); if (entity instanceof MethodInterface) return this.methodManager.validate((MethodInterface) entity); if (entity instanceof PackageInterface) return this.packageManger.validate((PackageInterface) entity); if (entity instanceof AnalysisInterface) return this.analysisManager.validate((AnalysisInterface) entity); if (entity instanceof HResultInterface) return this.hResultManager.validate((HResultInterface) entity); if (entity instanceof BTResultInterface) return this.btResultManager.validate((BTResultInterface) entity); return false; } @Override public List<?> readAll(Class<?> entitClass) throws PersistenceException { if (entitClass.equals(AnalysisInterface.class)) return analysisManager.readAll(); if (entitClass.equals(PackageInterface.class)) return packageManger.readAll(); if (entitClass.equals(ClassInterface.class)) return classManager.readAll(); if (entitClass.equals(MethodInterface.class)) return methodManager.readAll(); if (entitClass.equals(BTResultInterface.class)) return btResultManager.readAll(); if (entitClass.equals(HResultInterface.class)) return hResultManager.readAll(); if (entitClass.equals(BTPatternInterface.class)) return btPatternManager.readAll(); if (entitClass.equals(HPatternInterface.class)) return hPatternManager.readAll(); return new ArrayList<Object>(); } @Override public List<Entity> readAll() { throw new UnsupportedOperationException( "Cannot implement this generic Method here. Use parameterized Method instead."); } @Override public boolean saveAll(List<Entity> entities) throws PersistenceException, InvalidEntityException { for (Entity entity : entities) { this.save(entity); } return true; } @Override public void shutdown() throws PersistenceException { appManager.shutdown(); packageManger.shutdown(); classManager.shutdown(); methodManager.shutdown(); analysisManager.shutdown(); btResultManager.shutdown(); hResultManager.shutdown(); btPatternManager.shutdown(); hPatternManager.shutdown(); permRequestManager.shutdown(); try { if(!this.connection.isClosed()) { this.connection.close(); } } catch (SQLException e) { throw new PersistenceException(e); } } /** * @return the appManager */ @Override public ApplicationEntityManagerInterface getAppManager() { return appManager; } /** * @param appManager the appManager to set */ @Override public void setAppManager(ApplicationEntityManagerInterface appManager) { this.appManager = appManager; } /** * @return the packageManger */ @Override public PackageEntityManagerInterface getPackageManger() { return packageManger; } /** * @param packageManger the packageManger to set */ @Override public void setPackageManger(PackageEntityManagerInterface packageManger) { this.packageManger = packageManger; } /** * @return the classManager */ @Override public ClassEntityManagerInterface getClassManager() { return classManager; } /** * @param classManager the classManager to set */ @Override public void setClassManager(ClassEntityManagerInterface classManager) { this.classManager = classManager; } /** * @return the methodManager */ @Override public MethodEntityManagerInterface getMethodManager() { return methodManager; } /** * @param methodManager the methodManager to set */ @Override public void setMethodManager(MethodEntityManagerInterface methodManager) { this.methodManager = methodManager; } /** * @return the analysisManager */ @Override public AnalysisEntityManagerInterface getAnalysisManager() { return analysisManager; } /** * @param analysisManager the analysisManager to set */ @Override public void setAnalysisManager(AnalysisEntityManagerInterface analysisManager) { this.analysisManager = analysisManager; } /** * @return the btResultManager */ @Override public BTResultEntityManagerInterface getBtResultManager() { return btResultManager; } /** * @param btResultManager the btResultManager to set */ @Override public void setBtResultManager(BTResultEntityManagerInterface btResultManager) { this.btResultManager = btResultManager; } /** * @return the hResultManager */ @Override public HResultEntityManagerInterface gethResultManager() { return hResultManager; } /** * @param hResultManager the hResultManager to set */ @Override public void sethResultManager(HResultEntityManagerInterface hResultManager) { this.hResultManager = hResultManager; } /** * @return the btPatternManager */ @Override public BTPatternEntityManagerInterface getBtPatternManager() { return btPatternManager; } /** * @param btPatternManager the btPatternManager to set */ @Override public void setBtPatternManager(BTPatternEntityManagerInterface btPatternManager) { this.btPatternManager = btPatternManager; } /** * @return the hPatternManager */ @Override public HPatternEntityManagerInterface gethPatternManager() { return hPatternManager; } /** * @param hPatternManager the hPatternManager to set */ @Override public void sethPatternManager(HPatternEntityManagerInterface hPatternManager) { this.hPatternManager = hPatternManager; } /** * @return the permRequestManager */ @Override public PermissionRequestEntityManagerInterface getPermRequestManager() { return permRequestManager; } /** * @param permRequestManager the permRequestManager to set */ @Override public void setPermRequestManager( PermissionRequestEntityManagerInterface permRequestManager) { this.permRequestManager = permRequestManager; } /** * @return the exceptionManager */ @Override public SAAFExceptionEntityManagerInterface getExceptionManager() { return exceptionManager; } /** * @param exceptionManager the exceptionManager to set */ @Override public void setExceptionManager(SAAFExceptionEntityManagerInterface exceptionManager) { this.exceptionManager = exceptionManager; } @Override public PermissionEntityManagerInterface getPermissionManager() { return this.permissionManager; } @Override public void setPermissionEntityManager(PermissionEntityManagerInterface permissionManager) { this.permissionManager=permissionManager; } }