/** * Copyright 2012-2013 Maciej Jaworski, Mariusz Kapcia, Paweł Kędzia, Mateusz Kubuszok * * <p>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</p> * * <p>http://www.apache.org/licenses/LICENSE-2.0</p> * * <p>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.</p> */ package com.autoupdater.client.installation.services; import java.util.SortedSet; import com.autoupdater.client.environment.EnvironmentData; import com.autoupdater.client.installation.EInstallationStatus; import com.autoupdater.client.installation.InstallationServiceMessage; import com.autoupdater.client.installation.runnable.InstallationRunnable; import com.autoupdater.client.models.Update; import com.autoupdater.client.utils.executions.ExecutionWithErrors; import com.autoupdater.client.utils.services.IObserver; import com.autoupdater.client.utils.services.ObservableService; import com.google.common.base.Objects; /** * Installation service that mediates with InstallationRunnable. * * @see com.autoupdater.client.installation.runnable.InstallationRunnable */ public class InstallationService extends ObservableService<InstallationServiceMessage> implements IObserver<InstallationServiceMessage>, ExecutionWithErrors { private final InstallationRunnable installationRunnable; private final Thread installationThread; /** * Creates instance of installation service, that will attempt to install * all required Updates. * * @param environmentData * environmentData instance * @param updates * updates to install */ public InstallationService(EnvironmentData environmentData, SortedSet<Update> updates) { installationRunnable = new InstallationRunnable(environmentData, updates); installationThread = new Thread(installationRunnable); installationRunnable.addObserver(this); } @Override public Throwable getThrownException() { return installationRunnable.getThrownException(); } @Override public void setThrownException(Throwable throwable) { installationRunnable.setThrownException(throwable); } @Override public void throwExceptionIfErrorOccured() throws Throwable { installationRunnable.throwExceptionIfErrorOccured(); } /** * Starts installation. */ public void start() { installationThread.start(); } /** * Makes current thread wait for installation finish (successful or not). * * @throws InterruptedException * thrown if thread was cancelled (should never happen) */ public void joinThread() throws InterruptedException { installationThread.join(); } /** * Returns current state of installation. * * @return current state of installation */ public EInstallationStatus getState() { return installationRunnable.getState(); } @Override public void update(ObservableService<InstallationServiceMessage> observable, InstallationServiceMessage message) { if (Objects.equal(observable, installationRunnable)) { hasChanged(); notifyObservers(message); } } }