Run reformat and organize imports

This commit is contained in:
Manfred Karrer 2016-01-21 02:48:44 +01:00
parent f723bf5737
commit cb685d3b5c
73 changed files with 802 additions and 829 deletions

View file

@ -19,7 +19,10 @@ package io.bitsquare.locale;
import io.bitsquare.user.Preferences; import io.bitsquare.user.Preferences;
import java.util.*; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class CountryUtil { public class CountryUtil {

View file

@ -387,8 +387,7 @@ public class Notification {
if (stage.isShowing()) { if (stage.isShowing()) {
stage.toFront(); stage.toFront();
} } else {
else {
stage.show(); stage.show();
} }
@ -530,14 +529,11 @@ public class Notification {
final EventHandler<NotificationEvent> HANDLER; final EventHandler<NotificationEvent> HANDLER;
if (NotificationEvent.NOTIFICATION_PRESSED == TYPE) { if (NotificationEvent.NOTIFICATION_PRESSED == TYPE) {
HANDLER = getOnNotificationPressed(); HANDLER = getOnNotificationPressed();
} } else if (NotificationEvent.SHOW_NOTIFICATION == TYPE) {
else if (NotificationEvent.SHOW_NOTIFICATION == TYPE) {
HANDLER = getOnShowNotification(); HANDLER = getOnShowNotification();
} } else if (NotificationEvent.HIDE_NOTIFICATION == TYPE) {
else if (NotificationEvent.HIDE_NOTIFICATION == TYPE) {
HANDLER = getOnHideNotification(); HANDLER = getOnHideNotification();
} } else {
else {
HANDLER = null; HANDLER = null;
} }
if (null == HANDLER) return; if (null == HANDLER) return;

View file

@ -58,8 +58,7 @@ public class FxmlViewLoader implements ViewLoader {
if (fxmlView == null) { if (fxmlView == null) {
convention = defaultConvention; convention = defaultConvention;
specifiedLocation = defaultLocation; specifiedLocation = defaultLocation;
} } else {
else {
convention = fxmlView.convention(); convention = fxmlView.convention();
specifiedLocation = fxmlView.location(); specifiedLocation = fxmlView.location();
} }

View file

@ -18,8 +18,7 @@
package io.bitsquare.gui.common.view; package io.bitsquare.gui.common.view;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.*; import javafx.scene.Node;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -27,7 +26,9 @@ public abstract class AbstractView<R extends Node, M> implements View {
protected final Logger log = LoggerFactory.getLogger(this.getClass()); protected final Logger log = LoggerFactory.getLogger(this.getClass());
protected @FXML R root; protected
@FXML
R root;
protected final M model; protected final M model;
public AbstractView(M model) { public AbstractView(M model) {

View file

@ -17,7 +17,7 @@
package io.bitsquare.gui.common.view; package io.bitsquare.gui.common.view;
import javafx.scene.*; import javafx.scene.Node;
public abstract class ActivatableView<R extends Node, M> extends InitializableView<R, M> { public abstract class ActivatableView<R extends Node, M> extends InitializableView<R, M> {

View file

@ -17,9 +17,8 @@
package io.bitsquare.gui.common.view; package io.bitsquare.gui.common.view;
import java.util.HashMap;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.HashMap;
public class CachingViewLoader implements ViewLoader { public class CachingViewLoader implements ViewLoader {

View file

@ -17,12 +17,11 @@
package io.bitsquare.gui.common.view; package io.bitsquare.gui.common.view;
import java.util.function.Function;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import java.util.function.Function;
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)

View file

@ -17,12 +17,11 @@
package io.bitsquare.gui.common.view; package io.bitsquare.gui.common.view;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.scene.*; import javafx.scene.Node;
import java.net.URL;
import java.util.ResourceBundle;
public abstract class InitializableView<R extends Node, M> extends AbstractView<R, M> implements Initializable { public abstract class InitializableView<R extends Node, M> extends AbstractView<R, M> implements Initializable {

View file

@ -17,7 +17,7 @@
package io.bitsquare.gui.common.view; package io.bitsquare.gui.common.view;
import javafx.scene.*; import javafx.scene.Node;
public interface View { public interface View {
Node getRoot(); Node getRoot();

View file

@ -17,11 +17,9 @@
package io.bitsquare.gui.common.view.guice; package io.bitsquare.gui.common.view.guice;
import io.bitsquare.gui.common.view.ViewFactory;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.inject.Injector; import com.google.inject.Injector;
import io.bitsquare.gui.common.view.ViewFactory;
public class InjectorViewFactory implements ViewFactory { public class InjectorViewFactory implements ViewFactory {

View file

@ -117,8 +117,7 @@ public class InfoDisplay extends Parent {
link.setStyle("-fx-focus-color: transparent;"); link.setStyle("-fx-focus-color: transparent;");
link.setOnAction(onAction.get()); link.setOnAction(onAction.get());
getParent().layout(); getParent().layout();
} } else {
else {
onAction.get().handle(actionEvent); onAction.get().handle(actionEvent);
} }
} }

View file

@ -18,17 +18,18 @@
package io.bitsquare.gui.components; package io.bitsquare.gui.components;
import io.bitsquare.gui.util.validation.InputValidator; import io.bitsquare.gui.util.validation.InputValidator;
import javafx.beans.property.ObjectProperty; import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleObjectProperty;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.geometry.Point2D; import javafx.geometry.Point2D;
import javafx.scene.control.*; import javafx.scene.control.Label;
import javafx.scene.effect.*; import javafx.scene.control.TextField;
import javafx.scene.layout.*; import javafx.scene.effect.BlurType;
import javafx.scene.paint.*; import javafx.scene.effect.DropShadow;
import javafx.scene.effect.Effect;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.stage.Window; import javafx.stage.Window;
import org.controlsfx.control.PopOver; import org.controlsfx.control.PopOver;
/** /**

View file

@ -19,8 +19,10 @@ package io.bitsquare.gui.components;
import javafx.animation.FadeTransition; import javafx.animation.FadeTransition;
import javafx.animation.Interpolator; import javafx.animation.Interpolator;
import javafx.scene.control.*; import javafx.scene.control.Label;
import javafx.scene.layout.*; import javafx.scene.control.ProgressBar;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.util.Duration; import javafx.util.Duration;
// TODO replace with new notification component from lighthouse/bitcoinJ // TODO replace with new notification component from lighthouse/bitcoinJ

View file

@ -25,12 +25,11 @@
package io.bitsquare.gui.components.confidence.behavior; package io.bitsquare.gui.components.confidence.behavior;
import com.sun.javafx.scene.control.behavior.BehaviorBase;
import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator; import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator;
import java.util.Collections; import java.util.Collections;
import com.sun.javafx.scene.control.behavior.BehaviorBase;
// TODO Copied form OpenJFX, check license issues and way how we integrated it // TODO Copied form OpenJFX, check license issues and way how we integrated it
// We changed behaviour which was not exposed via APIs // We changed behaviour which was not exposed via APIs

View file

@ -17,24 +17,25 @@
package io.bitsquare.gui.components.processbar; package io.bitsquare.gui.components.processbar;
import com.sun.javafx.scene.control.behavior.BehaviorBase;
import com.sun.javafx.scene.control.behavior.KeyBinding;
import com.sun.javafx.scene.control.skin.BehaviorSkinBase;
import io.bitsquare.gui.util.Colors; import io.bitsquare.gui.util.Colors;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.layout.Border;
import javafx.scene.layout.BorderStroke;
import javafx.scene.layout.BorderStrokeStyle;
import javafx.scene.layout.BorderWidths;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.paint.*;
import javafx.scene.shape.*;
import com.sun.javafx.scene.control.behavior.BehaviorBase;
import com.sun.javafx.scene.control.behavior.KeyBinding;
import com.sun.javafx.scene.control.skin.BehaviorSkinBase;
class ProcessStepBarSkin<T> extends BehaviorSkinBase<ProcessStepBar<T>, BehaviorBase<ProcessStepBar<T>>> { class ProcessStepBarSkin<T> extends BehaviorSkinBase<ProcessStepBar<T>, BehaviorBase<ProcessStepBar<T>>> {
private final ProcessStepBar<T> controller; private final ProcessStepBar<T> controller;

View file

@ -113,8 +113,7 @@ public class AccountView extends ActivatableView<TabPane, AccountViewModel> {
tab = arbitratorRegistrationTab; tab = arbitratorRegistrationTab;
arbitratorRegistrationView = (ArbitratorRegistrationView) view; arbitratorRegistrationView = (ArbitratorRegistrationView) view;
arbitratorRegistrationView.onTabSelection(true); arbitratorRegistrationView.onTabSelection(true);
} } else {
else {
throw new IllegalArgumentException("View not supported: " + view); throw new IllegalArgumentException("View not supported: " + view);
} }

View file

@ -17,11 +17,10 @@
package io.bitsquare.gui.main.account; package io.bitsquare.gui.main.account;
import com.google.inject.Inject;
import io.bitsquare.gui.common.model.ViewModel; import io.bitsquare.gui.common.model.ViewModel;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import com.google.inject.Inject;
class AccountViewModel implements ViewModel { class AccountViewModel implements ViewModel {
private final User user; private final User user;

View file

@ -22,19 +22,23 @@ import io.bitsquare.gui.common.view.InitializableView;
import io.bitsquare.gui.common.view.Wizard; import io.bitsquare.gui.common.view.Wizard;
import io.bitsquare.gui.main.help.Help; import io.bitsquare.gui.main.help.Help;
import io.bitsquare.gui.main.help.HelpId; import io.bitsquare.gui.main.help.HelpId;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javax.inject.Inject; import javax.inject.Inject;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.layout.*;
@FxmlView @FxmlView
public class ChangePasswordView extends InitializableView<GridPane, ChangePasswordViewModel> implements Wizard.Step { public class ChangePasswordView extends InitializableView<GridPane, ChangePasswordViewModel> implements Wizard.Step {
@FXML HBox buttonsHBox; @FXML
@FXML Button saveButton, skipButton; HBox buttonsHBox;
@FXML PasswordField oldPasswordField, passwordField, repeatedPasswordField; @FXML
Button saveButton, skipButton;
@FXML
PasswordField oldPasswordField, passwordField, repeatedPasswordField;
private Wizard wizard; private Wizard wizard;

View file

@ -17,12 +17,10 @@
package io.bitsquare.gui.main.account.content.changepassword; package io.bitsquare.gui.main.account.content.changepassword;
import com.google.inject.Inject;
import io.bitsquare.gui.common.model.ViewModel; import io.bitsquare.gui.common.model.ViewModel;
import io.bitsquare.gui.util.validation.InputValidator; import io.bitsquare.gui.util.validation.InputValidator;
import io.bitsquare.gui.util.validation.PasswordValidator; import io.bitsquare.gui.util.validation.PasswordValidator;
import com.google.inject.Inject;
import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
@ -74,12 +72,10 @@ class ChangePasswordViewModel implements ViewModel {
return true; return true;
else else
errorMessage = "The 2 passwords does not match."; errorMessage = "The 2 passwords does not match.";
} } else {
else {
errorMessage = result.errorMessage; errorMessage = result.errorMessage;
} }
} } else {
else {
errorMessage = result.errorMessage; errorMessage = result.errorMessage;
} }
return false; return false;

View file

@ -38,8 +38,10 @@ import javax.inject.Inject;
@FxmlView @FxmlView
public class AccountSetupWizard extends ActivatableView implements Wizard { public class AccountSetupWizard extends ActivatableView implements Wizard {
@FXML VBox leftVBox; @FXML
@FXML AnchorPane content; VBox leftVBox;
@FXML
AnchorPane content;
private WizardItem seedWords, password, fiatAccount, restrictions; private WizardItem seedWords, password, fiatAccount, restrictions;
private Navigation.Listener listener; private Navigation.Listener listener;
@ -63,8 +65,7 @@ public class AccountSetupWizard extends ActivatableView implements Wizard {
if (viewClass == SeedWordsView.class) { if (viewClass == SeedWordsView.class) {
seedWords.show(); seedWords.show();
} } else if (viewClass == PasswordView.class) {
else if (viewClass == PasswordView.class) {
seedWords.onCompleted(); seedWords.onCompleted();
password.show(); password.show();
} else if (viewClass == ArbitratorSelectionView.class) { } else if (viewClass == ArbitratorSelectionView.class) {
@ -107,8 +108,7 @@ public class AccountSetupWizard extends ActivatableView implements Wizard {
if (currentStep instanceof SeedWordsView) { if (currentStep instanceof SeedWordsView) {
seedWords.onCompleted(); seedWords.onCompleted();
password.show(); password.show();
} } else if (currentStep instanceof PasswordView) {
else if (currentStep instanceof PasswordView) {
password.onCompleted(); password.onCompleted();
restrictions.show(); restrictions.show();
} else if (currentStep instanceof ArbitratorSelectionView) { } else if (currentStep instanceof ArbitratorSelectionView) {

View file

@ -38,7 +38,8 @@ import javax.inject.Inject;
@FxmlView @FxmlView
public class FundsView extends ActivatableViewAndModel<TabPane, Activatable> { public class FundsView extends ActivatableViewAndModel<TabPane, Activatable> {
@FXML Tab reservedTab, withdrawalTab, transactionsTab; @FXML
Tab reservedTab, withdrawalTab, transactionsTab;
private Navigation.Listener navigationListener; private Navigation.Listener navigationListener;
private ChangeListener<Tab> tabChangeListener; private ChangeListener<Tab> tabChangeListener;

View file

@ -47,7 +47,8 @@ import java.util.stream.Stream;
@FxmlView @FxmlView
public class ReservedView extends ActivatableView<VBox, Void> { public class ReservedView extends ActivatableView<VBox, Void> {
@FXML TableView<ReservedListItem> table; @FXML
TableView<ReservedListItem> table;
@FXML @FXML
TableColumn<ReservedListItem, ReservedListItem> labelColumn, addressColumn, balanceColumn, confidenceColumn; TableColumn<ReservedListItem, ReservedListItem> labelColumn, addressColumn, balanceColumn, confidenceColumn;
@ -154,8 +155,7 @@ public class ReservedView extends ActivatableView<VBox, Void> {
}); });
} }
setGraphic(hyperlink); setGraphic(hyperlink);
} } else {
else {
setGraphic(null); setGraphic(null);
setId(null); setId(null);
} }
@ -233,8 +233,7 @@ public class ReservedView extends ActivatableView<VBox, Void> {
if (item != null && !empty) { if (item != null && !empty) {
setGraphic(item.getProgressIndicator()); setGraphic(item.getProgressIndicator());
} } else {
else {
setGraphic(null); setGraphic(null);
} }
} }

View file

@ -17,8 +17,8 @@
~ along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. ~ along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
--> -->
<?import javafx.scene.control.*?> <?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.AnchorPane?>
<TabPane fx:id="root" fx:controller="io.bitsquare.gui.main.offer.BuyOfferView" <TabPane fx:id="root" fx:controller="io.bitsquare.gui.main.offer.BuyOfferView"
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
AnchorPane.topAnchor="0.0" AnchorPane.topAnchor="0.0"

View file

@ -17,8 +17,8 @@
~ along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. ~ along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
--> -->
<?import javafx.scene.control.*?> <?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.AnchorPane?>
<TabPane fx:id="root" fx:controller="io.bitsquare.gui.main.offer.SellOfferView" <TabPane fx:id="root" fx:controller="io.bitsquare.gui.main.offer.SellOfferView"
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
AnchorPane.topAnchor="0.0" AnchorPane.topAnchor="0.0"

View file

@ -38,7 +38,8 @@ import javax.inject.Inject;
@FxmlView @FxmlView
public class PortfolioView extends ActivatableViewAndModel<TabPane, Activatable> { public class PortfolioView extends ActivatableViewAndModel<TabPane, Activatable> {
@FXML Tab openOffersTab, pendingTradesTab, closedTradesTab; @FXML
Tab openOffersTab, pendingTradesTab, closedTradesTab;
private final Tab failedTradesTab = new Tab("Failed"); private final Tab failedTradesTab = new Tab("Failed");
private Tab currentTab; private Tab currentTab;
private Navigation.Listener navigationListener; private Navigation.Listener navigationListener;

View file

@ -100,8 +100,7 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
offerDetailsPopup.show(tradable.getOffer()); offerDetailsPopup.show(tradable.getOffer());
}); });
setGraphic(hyperlink); setGraphic(hyperlink);
} } else {
else {
setGraphic(null); setGraphic(null);
setId(null); setId(null);
} }

View file

@ -91,8 +91,7 @@ class ClosedTradesViewModel extends ActivatableWithDataModel<ClosedTradesDataMod
log.error("That must not happen. We got a pending state but we are in the closed trades list."); log.error("That must not happen. We got a pending state but we are in the closed trades list.");
return trade.getState().toString(); return trade.getState().toString();
} }
} } else if (item.getTradable() instanceof OpenOffer) {
else if (item.getTradable() instanceof OpenOffer) {
OpenOffer.State state = ((OpenOffer) item.getTradable()).getState(); OpenOffer.State state = ((OpenOffer) item.getTradable()).getState();
log.trace("OpenOffer state {}", state); log.trace("OpenOffer state {}", state);
switch (state) { switch (state) {

View file

@ -32,8 +32,10 @@ import javax.inject.Inject;
@FxmlView @FxmlView
public class FailedTradesView extends ActivatableViewAndModel<VBox, FailedTradesViewModel> { public class FailedTradesView extends ActivatableViewAndModel<VBox, FailedTradesViewModel> {
@FXML TableView<FailedTradesListItem> table; @FXML
@FXML TableColumn<FailedTradesListItem, FailedTradesListItem> priceColumn, amountColumn, volumeColumn, TableView<FailedTradesListItem> table;
@FXML
TableColumn<FailedTradesListItem, FailedTradesListItem> priceColumn, amountColumn, volumeColumn,
directionColumn, dateColumn, tradeIdColumn, stateColumn; directionColumn, dateColumn, tradeIdColumn, stateColumn;
private final TradeDetailsPopup tradeDetailsPopup; private final TradeDetailsPopup tradeDetailsPopup;
@ -86,8 +88,7 @@ public class FailedTradesView extends ActivatableViewAndModel<VBox, FailedTrades
tradeDetailsPopup.show(trade); tradeDetailsPopup.show(trade);
}); });
setGraphic(hyperlink); setGraphic(hyperlink);
} } else {
else {
setGraphic(null); setGraphic(null);
setId(null); setId(null);
} }

View file

@ -17,14 +17,13 @@
package io.bitsquare.gui.main.portfolio.pendingtrades.steps; package io.bitsquare.gui.main.portfolio.pendingtrades.steps;
import io.bitsquare.gui.util.Colors;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import de.jensd.fx.fontawesome.AwesomeDude; import de.jensd.fx.fontawesome.AwesomeDude;
import de.jensd.fx.fontawesome.AwesomeIcon; import de.jensd.fx.fontawesome.AwesomeIcon;
import io.bitsquare.gui.util.Colors;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
public class TradeWizardItem extends Button { public class TradeWizardItem extends Button {
public Class<? extends TradeStepDetailsView> getViewClass() { public Class<? extends TradeStepDetailsView> getViewClass() {

View file

@ -18,14 +18,12 @@
package io.bitsquare.gui.util; package io.bitsquare.gui.util;
import com.google.common.base.Stopwatch; import com.google.common.base.Stopwatch;
import java.util.concurrent.TimeUnit;
import javafx.animation.AnimationTimer; import javafx.animation.AnimationTimer;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.concurrent.TimeUnit;
public class Profiler { public class Profiler {
private static final Logger log = LoggerFactory.getLogger(Profiler.class); private static final Logger log = LoggerFactory.getLogger(Profiler.class);

View file

@ -50,8 +50,7 @@ public class OptionalBtcValidator extends BtcValidator {
result = validateIfNotNegative(input) result = validateIfNotNegative(input)
.and(validateIfNotFractionalBtcValue(input)) .and(validateIfNotFractionalBtcValue(input))
.and(validateIfNotExceedsMaxBtcValue(input)); .and(validateIfNotExceedsMaxBtcValue(input));
} } else {
else {
// we accept zero input // we accept zero input
return new ValidationResult(true); return new ValidationResult(true);
} }

View file

@ -48,8 +48,7 @@ public class OptionalFiatValidator extends FiatValidator {
result = validateIfNotNegative(input) result = validateIfNotNegative(input)
.and(validateIfNotExceedsMinFiatValue(input)) .and(validateIfNotExceedsMinFiatValue(input))
.and(validateIfNotExceedsMaxFiatValue(input)); .and(validateIfNotExceedsMaxFiatValue(input));
} } else {
else {
// we accept zero input // we accept zero input
return new ValidationResult(true); return new ValidationResult(true);
} }

View file

@ -18,7 +18,6 @@
package io.bitsquare.app; package io.bitsquare.app;
import org.junit.Test; import org.junit.Test;
import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource; import org.springframework.core.env.PropertySource;
@ -26,7 +25,7 @@ import org.springframework.mock.env.MockPropertySource;
import static io.bitsquare.app.BitsquareEnvironment.*; import static io.bitsquare.app.BitsquareEnvironment.*;
import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.*; import static org.junit.Assert.assertThat;
import static org.springframework.core.env.PropertySource.named; import static org.springframework.core.env.PropertySource.named;
import static org.springframework.core.env.StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME; import static org.springframework.core.env.StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME;
import static org.springframework.core.env.StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME; import static org.springframework.core.env.StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME;

View file

@ -14,7 +14,7 @@
~ You should have received a copy of the GNU Affero General Public License ~ You should have received a copy of the GNU Affero General Public License
~ along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. ~ along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
--> -->
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns:fx="http://javafx.com/fxml"> <AnchorPane xmlns:fx="http://javafx.com/fxml">
</AnchorPane> </AnchorPane>

View file

@ -15,7 +15,7 @@
~ along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. ~ along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
--> -->
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.AnchorPane?>
<AnchorPane fx:id="root" fx:controller="io.bitsquare.common.fxml.FxmlViewLoaderTests$MissingFxmlViewAnnotation" <AnchorPane fx:id="root" fx:controller="io.bitsquare.common.fxml.FxmlViewLoaderTests$MissingFxmlViewAnnotation"
xmlns:fx="http://javafx.com/fxml"> xmlns:fx="http://javafx.com/fxml">
</AnchorPane> </AnchorPane>

View file

@ -15,7 +15,7 @@
~ along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. ~ along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
--> -->
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.AnchorPane?>
<AnchorPane fx:id="root" fx:controller="io.bitsquare.common.fxml.FxmlViewLoaderTests$WellFormed" <AnchorPane fx:id="root" fx:controller="io.bitsquare.common.fxml.FxmlViewLoaderTests$WellFormed"
xmlns:fx="http://javafx.com/fxml"> xmlns:fx="http://javafx.com/fxml">
</AnchorPane> </AnchorPane>

View file

@ -19,24 +19,18 @@ package io.bitsquare.common.fxml;
import io.bitsquare.gui.common.ViewfxException; import io.bitsquare.gui.common.ViewfxException;
import io.bitsquare.gui.common.fxml.FxmlViewLoader; import io.bitsquare.gui.common.fxml.FxmlViewLoader;
import io.bitsquare.gui.common.view.AbstractView; import io.bitsquare.gui.common.view.*;
import io.bitsquare.gui.common.view.FxmlView;
import io.bitsquare.gui.common.view.View;
import io.bitsquare.gui.common.view.ViewFactory;
import io.bitsquare.gui.common.view.ViewLoader;
import java.util.ResourceBundle;
import javafx.fxml.LoadException; import javafx.fxml.LoadException;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
import java.util.ResourceBundle;
import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.*; import static org.junit.Assert.assertThat;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;

View file

@ -20,11 +20,11 @@ package io.bitsquare.common.support;
import io.bitsquare.gui.common.view.AbstractView; import io.bitsquare.gui.common.view.AbstractView;
import io.bitsquare.gui.common.view.CachingViewLoader; import io.bitsquare.gui.common.view.CachingViewLoader;
import io.bitsquare.gui.common.view.ViewLoader; import io.bitsquare.gui.common.view.ViewLoader;
import org.junit.Test; import org.junit.Test;
import static org.mockito.BDDMockito.then; import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
public class CachingViewLoaderTests { public class CachingViewLoaderTests {

View file

@ -670,7 +670,7 @@ public class SocksDialog extends Dialog implements WindowListener,
}// end guiInit }// end guiInit
/* /*
* // Main //////////////////////////////////// public static void * // Main //////////////////////////////////// public static void
* main(String[] args) throws Exception{ Frame f = new * main(String[] args) throws Exception{ Frame f = new
* Frame("Test for SocksDialog"); f.add("Center", new * Frame("Test for SocksDialog"); f.add("Center", new
* Label("Fill the Dialog")); SocksDialog socksdialog = new SocksDialog(f); * Label("Fill the Dialog")); SocksDialog socksdialog = new SocksDialog(f);

View file

@ -198,7 +198,7 @@ public class SocksServerSocket extends ServerSocket {
private void processReply(ProxyMessage reply) throws SocksException { private void processReply(ProxyMessage reply) throws SocksException {
localPort = reply.port; localPort = reply.port;
/* /*
* If the server have assigned same host as it was contacted on it might * If the server have assigned same host as it was contacted on it might
* return an address of all zeros * return an address of all zeros
*/ */
if (reply.host.equals("0.0.0.0")) { if (reply.host.equals("0.0.0.0")) {

View file

@ -346,7 +346,7 @@ public class SocksSocket extends Socket {
private void processReply(ProxyMessage reply) throws SocksException { private void processReply(ProxyMessage reply) throws SocksException {
localPort = reply.port; localPort = reply.port;
/* /*
* If the server have assigned same host as it was contacted on it might * If the server have assigned same host as it was contacted on it might
* return an address of all zeros * return an address of all zeros
*/ */
if (reply.host.equals("0.0.0.0")) { if (reply.host.equals("0.0.0.0")) {

View file

@ -169,7 +169,7 @@ public class Ident {
// ///////////////////////////////////////////// // /////////////////////////////////////////////
// USED for Testing // USED for Testing
/* /*
* public static void main(String[] args) throws IOException{ * public static void main(String[] args) throws IOException{
* *
* Socket s = null; s = new Socket("gp101-16", 1391); * Socket s = null; s = new Socket("gp101-16", 1391);
* *

View file

@ -25,7 +25,8 @@ public class FileUtilities {
/** /**
* Closes both input and output streams when done. * Closes both input and output streams when done.
* @param in Stream to read from *
* @param in Stream to read from
* @param out Stream to write to * @param out Stream to write to
* @throws java.io.IOException - If close on input or output fails * @throws java.io.IOException - If close on input or output fails
*/ */
@ -39,7 +40,8 @@ public class FileUtilities {
/** /**
* Won't close the input stream when it's done, needed to handle ZipInputStreams * Won't close the input stream when it's done, needed to handle ZipInputStreams
* @param in Won't be closed *
* @param in Won't be closed
* @param out Will be closed * @param out Will be closed
* @throws java.io.IOException - If close on output fails * @throws java.io.IOException - If close on output fails
*/ */
@ -84,7 +86,8 @@ public class FileUtilities {
/** /**
* Reads the input stream, deletes fileToWriteTo if it exists and over writes it with the stream. * Reads the input stream, deletes fileToWriteTo if it exists and over writes it with the stream.
* @param readFrom Stream to read from *
* @param readFrom Stream to read from
* @param fileToWriteTo File to write to * @param fileToWriteTo File to write to
* @throws java.io.IOException - If any of the file operations fail * @throws java.io.IOException - If any of the file operations fail
*/ */
@ -110,8 +113,9 @@ public class FileUtilities {
/** /**
* This has to exist somewhere! Why isn't it a part of the standard Java library? * This has to exist somewhere! Why isn't it a part of the standard Java library?
*
* @param destinationDirectory Directory files are to be extracted to * @param destinationDirectory Directory files are to be extracted to
* @param zipFileInputStream Stream to unzip * @param zipFileInputStream Stream to unzip
* @throws java.io.IOException - If there are any file errors * @throws java.io.IOException - If there are any file errors
*/ */
public static void extractContentFromZip(File destinationDirectory, InputStream zipFileInputStream) public static void extractContentFromZip(File destinationDirectory, InputStream zipFileInputStream)

View file

@ -80,8 +80,7 @@ abstract public class OnionProxyContext {
/** /**
* Sets environment variables and working directory needed for Tor * Sets environment variables and working directory needed for Tor
* *
* @param processBuilder * @param processBuilder we will call start on this to run Tor
* we will call start on this to run Tor
*/ */
void setEnvironmentArgsAndWorkingDirectoryForStart(ProcessBuilder processBuilder) { void setEnvironmentArgsAndWorkingDirectoryForStart(ProcessBuilder processBuilder) {
processBuilder.directory(getWorkingDirectory()); processBuilder.directory(getWorkingDirectory());

View file

@ -50,11 +50,11 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS;
* Note that you will most likely need to actually call into the * Note that you will most likely need to actually call into the
* AndroidOnionProxyManager or JavaOnionProxyManager in order to create the * AndroidOnionProxyManager or JavaOnionProxyManager in order to create the
* right bindings for your environment. * right bindings for your environment.
* <p/> * <p>
* This class is thread safe but that's mostly because we hit everything over * This class is thread safe but that's mostly because we hit everything over
* the head with 'synchronized'. Given the way this class is used there * the head with 'synchronized'. Given the way this class is used there
* shouldn't be any performance implications of this. * shouldn't be any performance implications of this.
* <p/> * <p>
* This class began life as TorPlugin from the Briar Project * This class began life as TorPlugin from the Briar Project
*/ */
public abstract class OnionProxyManager { public abstract class OnionProxyManager {
@ -98,17 +98,13 @@ public abstract class OnionProxyManager {
* given time for bootstrap to finish and if it doesn't then will restart * given time for bootstrap to finish and if it doesn't then will restart
* the bootstrap process the given number of repeats. * the bootstrap process the given number of repeats.
* *
* @param secondsBeforeTimeOut * @param secondsBeforeTimeOut Seconds to wait for boot strapping to finish
* Seconds to wait for boot strapping to finish * @param numberOfRetries Number of times to try recycling the Tor OP before giving up
* @param numberOfRetries * on bootstrapping working
* Number of times to try recycling the Tor OP before giving up
* on bootstrapping working
* @return True if bootstrap succeeded, false if there is a problem or the * @return True if bootstrap succeeded, false if there is a problem or the
* bootstrap couldn't complete in the given time. * bootstrap couldn't complete in the given time.
* @throws java.lang.InterruptedException * @throws java.lang.InterruptedException - You know, if we are interrupted
* - You know, if we are interrupted * @throws java.io.IOException - IO Exceptions
* @throws java.io.IOException
* - IO Exceptions
*/ */
public synchronized boolean startWithRepeat(int secondsBeforeTimeOut, int numberOfRetries) public synchronized boolean startWithRepeat(int secondsBeforeTimeOut, int numberOfRetries)
throws InterruptedException, IOException { throws InterruptedException, IOException {
@ -165,8 +161,7 @@ public abstract class OnionProxyManager {
* listening on * listening on
* *
* @return Discovered socks port * @return Discovered socks port
* @throws java.io.IOException * @throws java.io.IOException - File errors
* - File errors
*/ */
public synchronized int getIPv4LocalHostSocksPort() throws IOException { public synchronized int getIPv4LocalHostSocksPort() throws IOException {
if (isRunning() == false) { if (isRunning() == false) {
@ -191,14 +186,11 @@ public abstract class OnionProxyManager {
/** /**
* Publishes a hidden service * Publishes a hidden service
* *
* @param hiddenServicePort * @param hiddenServicePort The port that the hidden service will accept connections on
* The port that the hidden service will accept connections on * @param localPort The local port that the hidden service will relay connections
* @param localPort * to
* The local port that the hidden service will relay connections
* to
* @return The hidden service's onion address in the form X.onion. * @return The hidden service's onion address in the form X.onion.
* @throws java.io.IOException * @throws java.io.IOException - File errors
* - File errors
*/ */
public synchronized String publishHiddenService(int hiddenServicePort, int localPort) throws IOException { public synchronized String publishHiddenService(int hiddenServicePort, int localPort) throws IOException {
if (controlConnection == null) { if (controlConnection == null) {
@ -283,8 +275,7 @@ public abstract class OnionProxyManager {
* going to work until you either call startWithRepeat or * going to work until you either call startWithRepeat or
* installAndStartTorOp * installAndStartTorOp
* *
* @throws java.io.IOException * @throws java.io.IOException - File errors
* - File errors
*/ */
public synchronized void stop() throws IOException { public synchronized void stop() throws IOException {
try { try {
@ -308,8 +299,7 @@ public abstract class OnionProxyManager {
* to network connections. * to network connections.
* *
* @return True if running * @return True if running
* @throws java.io.IOException * @throws java.io.IOException - IO exceptions
* - IO exceptions
*/ */
public synchronized boolean isRunning() throws IOException { public synchronized boolean isRunning() throws IOException {
return isBootstrapped() && isNetworkEnabled(); return isBootstrapped() && isNetworkEnabled();
@ -318,11 +308,9 @@ public abstract class OnionProxyManager {
/** /**
* Tells the Tor OP if it should accept network connections * Tells the Tor OP if it should accept network connections
* *
* @param enable * @param enable If true then the Tor OP will accept SOCKS connections,
* If true then the Tor OP will accept SOCKS connections, * otherwise not.
* otherwise not. * @throws java.io.IOException - IO exceptions
* @throws java.io.IOException
* - IO exceptions
*/ */
public synchronized void enableNetwork(boolean enable) throws IOException { public synchronized void enableNetwork(boolean enable) throws IOException {
if (controlConnection == null) { if (controlConnection == null) {
@ -336,9 +324,8 @@ public abstract class OnionProxyManager {
* Specifies if Tor OP is accepting network connections * Specifies if Tor OP is accepting network connections
* *
* @return True if network is enabled (that doesn't mean that the device is * @return True if network is enabled (that doesn't mean that the device is
* online, only that the Tor OP is trying to connect to the network) * online, only that the Tor OP is trying to connect to the network)
* @throws java.io.IOException * @throws java.io.IOException - IO exceptions
* - IO exceptions
*/ */
public synchronized boolean isNetworkEnabled() throws IOException { public synchronized boolean isNetworkEnabled() throws IOException {
if (controlConnection == null) { if (controlConnection == null) {
@ -391,10 +378,8 @@ public abstract class OnionProxyManager {
* to actually connect it to the network. * to actually connect it to the network.
* *
* @return True if all files installed and Tor OP successfully started * @return True if all files installed and Tor OP successfully started
* @throws java.io.IOException * @throws java.io.IOException - IO Exceptions
* - IO Exceptions * @throws java.lang.InterruptedException - If we are, well, interrupted
* @throws java.lang.InterruptedException
* - If we are, well, interrupted
*/ */
public synchronized boolean installAndStartTorOp() throws IOException, InterruptedException { public synchronized boolean installAndStartTorOp() throws IOException, InterruptedException {
// The Tor OP will die if it looses the connection to its socket so if // The Tor OP will die if it looses the connection to its socket so if
@ -598,8 +583,7 @@ public abstract class OnionProxyManager {
/** /**
* Alas old versions of Android do not support setExecutable. * Alas old versions of Android do not support setExecutable.
* *
* @param f * @param f File to make executable
* File to make executable
* @return True if it worked, otherwise false. * @return True if it worked, otherwise false.
*/ */
protected abstract boolean setExecutable(File f); protected abstract boolean setExecutable(File f);

View file

@ -34,6 +34,7 @@ import java.util.Scanner;
public class OsData { public class OsData {
public enum OsType {Windows, Linux32, Linux64, Mac, Android} public enum OsType {Windows, Linux32, Linux64, Mac, Android}
private static OsType detectedType = null; private static OsType detectedType = null;
public static OsType getOsType() { public static OsType getOsType() {

View file

@ -22,8 +22,9 @@ import java.util.concurrent.TimeUnit;
public interface WriteObserver { public interface WriteObserver {
/** /**
* Waits timeout of unit to see if file is modified * Waits timeout of unit to see if file is modified
*
* @param timeout How long to wait before returning * @param timeout How long to wait before returning
* @param unit Unit to wait in * @param unit Unit to wait in
* @return True if file was modified, false if it was not * @return True if file was modified, false if it was not
*/ */
boolean poll(long timeout, TimeUnit unit); boolean poll(long timeout, TimeUnit unit);

View file

@ -18,212 +18,212 @@ import java.util.concurrent.atomic.AtomicBoolean;
public abstract class Connection implements Closeable { public abstract class Connection implements Closeable {
private static final Logger log = LoggerFactory.getLogger(Connection.class); private static final Logger log = LoggerFactory.getLogger(Connection.class);
private final Socket socket; private final Socket socket;
private final ObjectOutputStream out; private final ObjectOutputStream out;
private final ObjectInputStream in; private final ObjectInputStream in;
private final LinkedList<ConnectionListener> connectionListeners; private final LinkedList<ConnectionListener> connectionListeners;
private final String peer; private final String peer;
private boolean running; private boolean running;
private final AtomicBoolean available; private final AtomicBoolean available;
private final AtomicBoolean listening; private final AtomicBoolean listening;
private final ExecutorService executorService; private final ExecutorService executorService;
private final InputStreamListener inputStreamListener; private final InputStreamListener inputStreamListener;
private final AtomicBoolean heartBeating; private final AtomicBoolean heartBeating;
public Connection(String peer, Socket socket) throws IOException { public Connection(String peer, Socket socket) throws IOException {
this(peer, socket, Node.prepareOOSForSocket(socket), new ObjectInputStream(socket.getInputStream())); this(peer, socket, Node.prepareOOSForSocket(socket), new ObjectInputStream(socket.getInputStream()));
}
Connection(String peer, Socket socket, ObjectOutputStream out, ObjectInputStream in) {
log.debug("Initiating new connection");
this.available = new AtomicBoolean(false);
this.peer = peer;
this.socket = socket;
this.in = in;
this.out = out;
running = true;
listening = new AtomicBoolean(false);
heartBeating = new AtomicBoolean(false);
this.connectionListeners = new LinkedList<>();
this.inputStreamListener = new InputStreamListener();
executorService = Executors.newCachedThreadPool();
}
public abstract boolean isIncoming();
public void addMessageListener(ConnectionListener listener) {
synchronized (connectionListeners) {
connectionListeners.add(listener);
} }
}
protected void setConnectionListeners(Collection<ConnectionListener> listeners) { Connection(String peer, Socket socket, ObjectOutputStream out, ObjectInputStream in) {
synchronized (listeners) { log.debug("Initiating new connection");
this.connectionListeners.clear(); this.available = new AtomicBoolean(false);
this.connectionListeners.addAll(listeners); this.peer = peer;
this.socket = socket;
this.in = in;
this.out = out;
running = true;
listening = new AtomicBoolean(false);
heartBeating = new AtomicBoolean(false);
this.connectionListeners = new LinkedList<>();
this.inputStreamListener = new InputStreamListener();
executorService = Executors.newCachedThreadPool();
} }
}
public void removeMessageListener(ConnectionListener listener) { public abstract boolean isIncoming();
synchronized (connectionListeners) {
connectionListeners.remove(listener);
}
}
void sendMsg(Message msg) throws IOException { public void addMessageListener(ConnectionListener listener) {
out.writeObject(msg); synchronized (connectionListeners) {
out.flush(); connectionListeners.add(listener);
}
public void sendMessage(ContainerMessage msg) throws IOException {
if (!available.get())
throw new IOException("Connection is not yet available!");
sendMsg(msg);
}
protected void onMessage(Message msg) throws IOException {
log.debug("RXD: " + msg.toString());
if (msg instanceof ContainerMessage) {
synchronized (connectionListeners) {
for (ConnectionListener l : connectionListeners)
l.onMessage(this, (ContainerMessage) msg);
}
} else {
if (msg instanceof ControlMessage) {
switch ((ControlMessage) msg) {
case DISCONNECT:
close(false, PredefinedDisconnectReason.createReason(PredefinedDisconnectReason.CONNECTION_CLOSED, true));
break;
case AVAILABLE:
startHeartbeat();
onReady();
break;
default:
break;
} }
}
} }
}
protected void onReady() { protected void setConnectionListeners(Collection<ConnectionListener> listeners) {
if (!available.getAndSet(true)) { synchronized (listeners) {
synchronized (connectionListeners) { this.connectionListeners.clear();
for (ConnectionListener l : connectionListeners) { this.connectionListeners.addAll(listeners);
l.onReady(this);
} }
}
} }
}
protected abstract void onDisconnect(); public void removeMessageListener(ConnectionListener listener) {
synchronized (connectionListeners) {
private void onDisconn(DisconnectReason reason) { connectionListeners.remove(listener);
onDisconnect(); }
synchronized (connectionListeners) {
for (ConnectionListener l : connectionListeners) {
l.onDisconnect(this, reason);
}
} }
}
private void onTimeout() { void sendMsg(Message msg) throws IOException {
try { out.writeObject(msg);
close(false, PredefinedDisconnectReason.TIMEOUT); out.flush();
} catch (IOException e1) {
} }
}
protected void onError(Exception e) { public void sendMessage(ContainerMessage msg) throws IOException {
synchronized (connectionListeners) { if (!available.get())
for (ConnectionListener l : connectionListeners) { throw new IOException("Connection is not yet available!");
l.onError(this, new ConnectionException(e)); sendMsg(msg);
}
} }
}
public void close() throws IOException { protected void onMessage(Message msg) throws IOException {
close(true, PredefinedDisconnectReason.createReason(PredefinedDisconnectReason.CONNECTION_CLOSED, false)); log.debug("RXD: " + msg.toString());
} if (msg instanceof ContainerMessage) {
synchronized (connectionListeners) {
private void close(boolean graceful, DisconnectReason reason) throws IOException { for (ConnectionListener l : connectionListeners)
running = false; l.onMessage(this, (ContainerMessage) msg);
onDisconn(reason);
if (graceful) {
try {
sendMsg(ControlMessage.DISCONNECT);
} catch (Exception e) {
onError(e);
}
}
out.close();
in.close();
socket.close();
}
public String getPeer() {
return peer;
}
void startHeartbeat() {
if (!heartBeating.getAndSet(true)) {
log.debug("Starting Heartbeat");
executorService.submit(new Runnable() {
public void run() {
try {
Thread.sleep(30000);
while (running) {
try {
log.debug("TX Heartbeat");
sendMsg(ControlMessage.HEARTBEAT);
Thread.sleep(30000);
} catch (IOException e) {
e.printStackTrace();
}
} }
} catch (InterruptedException e) { } else {
} if (msg instanceof ControlMessage) {
} switch ((ControlMessage) msg) {
}); case DISCONNECT:
} close(false, PredefinedDisconnectReason.createReason(PredefinedDisconnectReason.CONNECTION_CLOSED, true));
} break;
case AVAILABLE:
public void listen() throws ConnectionException { startHeartbeat();
if (listening.getAndSet(true)) onReady();
throw new ConnectionException("Already Listening!"); break;
executorService.submit(inputStreamListener); default:
} break;
}
private class InputStreamListener implements Runnable { }
@Override }
public void run() { }
while (running) {
try { protected void onReady() {
Message msg = (Message) in.readObject(); if (!available.getAndSet(true)) {
onMessage(msg); synchronized (connectionListeners) {
} catch (ClassNotFoundException | IOException e) { for (ConnectionListener l : connectionListeners) {
if (e instanceof SocketTimeoutException) { l.onReady(this);
onTimeout(); }
} else { }
if (running) { }
onError(new ConnectionException(e)); }
// TODO: Fault Tolerance?
if (e instanceof EOFException) { protected abstract void onDisconnect();
try {
close(false, PredefinedDisconnectReason.RESET); private void onDisconn(DisconnectReason reason) {
} catch (IOException e1) { onDisconnect();
e1.printStackTrace(); synchronized (connectionListeners) {
for (ConnectionListener l : connectionListeners) {
l.onDisconnect(this, reason);
}
}
}
private void onTimeout() {
try {
close(false, PredefinedDisconnectReason.TIMEOUT);
} catch (IOException e1) {
}
}
protected void onError(Exception e) {
synchronized (connectionListeners) {
for (ConnectionListener l : connectionListeners) {
l.onError(this, new ConnectionException(e));
}
}
}
public void close() throws IOException {
close(true, PredefinedDisconnectReason.createReason(PredefinedDisconnectReason.CONNECTION_CLOSED, false));
}
private void close(boolean graceful, DisconnectReason reason) throws IOException {
running = false;
onDisconn(reason);
if (graceful) {
try {
sendMsg(ControlMessage.DISCONNECT);
} catch (Exception e) {
onError(e);
}
}
out.close();
in.close();
socket.close();
}
public String getPeer() {
return peer;
}
void startHeartbeat() {
if (!heartBeating.getAndSet(true)) {
log.debug("Starting Heartbeat");
executorService.submit(new Runnable() {
public void run() {
try {
Thread.sleep(30000);
while (running) {
try {
log.debug("TX Heartbeat");
sendMsg(ControlMessage.HEARTBEAT);
Thread.sleep(30000);
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (InterruptedException e) {
}
}
});
}
}
public void listen() throws ConnectionException {
if (listening.getAndSet(true))
throw new ConnectionException("Already Listening!");
executorService.submit(inputStreamListener);
}
private class InputStreamListener implements Runnable {
@Override
public void run() {
while (running) {
try {
Message msg = (Message) in.readObject();
onMessage(msg);
} catch (ClassNotFoundException | IOException e) {
if (e instanceof SocketTimeoutException) {
onTimeout();
} else {
if (running) {
onError(new ConnectionException(e));
// TODO: Fault Tolerance?
if (e instanceof EOFException) {
try {
close(false, PredefinedDisconnectReason.RESET);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
} }
}
} }
}
} }
}
} }
}
} }

View file

@ -5,12 +5,12 @@ import io.nucleo.net.proto.exceptions.ConnectionException;
public interface ConnectionListener { public interface ConnectionListener {
public abstract void onMessage(Connection con, ContainerMessage msg); public abstract void onMessage(Connection con, ContainerMessage msg);
public void onDisconnect(Connection con, DisconnectReason reason); public void onDisconnect(Connection con, DisconnectReason reason);
public void onError(Connection con, ConnectionException e); public void onError(Connection con, ConnectionException e);
public void onReady(Connection con); public void onReady(Connection con);
} }

View file

@ -2,10 +2,10 @@ package io.nucleo.net;
public interface DisconnectReason { public interface DisconnectReason {
public abstract String toString(); public abstract String toString();
public boolean isGraceful(); public boolean isGraceful();
public boolean isRemote(); public boolean isRemote();
} }

View file

@ -29,363 +29,363 @@ import java.util.regex.Pattern;
public class Node { public class Node {
/** /**
* Use this whenever to flush the socket header over the socket! * Use this whenever to flush the socket header over the socket!
* *
* @param socket the socket to construct an objectOutputStream from * @param socket the socket to construct an objectOutputStream from
* @return the outputstream from the socket * @return the outputstream from the socket
* @throws IOException in case something goes wrong, duh! * @throws IOException in case something goes wrong, duh!
*/ */
static ObjectOutputStream prepareOOSForSocket(Socket socket) throws IOException { static ObjectOutputStream prepareOOSForSocket(Socket socket) throws IOException {
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.flush(); out.flush();
return out; return out;
}
private static final Logger log = LoggerFactory.getLogger(Node.class);
private final ServiceDescriptor descriptor;
private final HashMap<String, Connection> connections;
@SuppressWarnings("rawtypes")
private final TorNode tor;
private final AtomicBoolean serverRunning;
public Node(TCPServiceDescriptor descriptor) {
this(null, descriptor);
}
public Node(HiddenServiceDescriptor descriptor, TorNode<?, ?> tor) {
this(tor, descriptor);
}
private Node(TorNode<?, ?> tor, ServiceDescriptor descriptor) {
this.connections = new HashMap<>();
this.descriptor = descriptor;
this.tor = tor;
this.serverRunning = new AtomicBoolean(false);
}
public String getLocalName() {
return descriptor.getFullAddress();
}
public Connection connect(String peer, Collection<ConnectionListener> listeners)
throws NumberFormatException, IOException {
if (!serverRunning.get()) {
throw new IOException("This node has not been started yet!");
}
if (peer.equals(descriptor.getFullAddress()))
throw new IOException("If you find yourself talking to yourself too often, you should really seek help!");
synchronized (connections) {
if (connections.containsKey(peer))
throw new IOException("Already connected to " + peer);
} }
final Socket sock = connectToService(peer); private static final Logger log = LoggerFactory.getLogger(Node.class);
return new OutgoingConnection(peer, sock, listeners);
}
private Socket connectToService(String hostname, int port) throws IOException, UnknownHostException, SocketException { private final ServiceDescriptor descriptor;
final Socket sock;
if (tor != null)
sock = tor.connectToHiddenService(hostname, port);
else
sock = new Socket(hostname, port);
sock.setSoTimeout(60000);
return sock;
}
private Socket connectToService(String peer) throws IOException, UnknownHostException, SocketException { private final HashMap<String, Connection> connections;
final String[] split = peer.split(Pattern.quote(":"));
return connectToService(split[0], Integer.parseInt(split[1]));
} @SuppressWarnings("rawtypes")
private final TorNode tor;
public synchronized Server startListening(ServerConnectListener listener) throws IOException { private final AtomicBoolean serverRunning;
if (serverRunning.getAndSet(true))
throw new IOException("This node is already listening!");
final Server server = new Server(descriptor.getServerSocket(), listener);
server.start();
return server;
}
public Connection getConnection(String peerAddress) { public Node(TCPServiceDescriptor descriptor) {
synchronized (connections) { this(null, descriptor);
return connections.get(peerAddress);
}
}
public Set<Connection> getConnections() {
synchronized (connections) {
return new HashSet<Connection>(connections.values());
}
}
public class Server extends Thread {
private boolean running;
private final ServerSocket serverSocket;
private final ExecutorService executorService;
private final ServerConnectListener serverConnectListener;
private Server(ServerSocket serverSocket, ServerConnectListener listener) {
super("Server");
this.serverSocket = descriptor.getServerSocket();
this.serverConnectListener = listener;
running = true;
executorService = Executors.newCachedThreadPool();
} }
public void shutdown() throws IOException { public Node(HiddenServiceDescriptor descriptor, TorNode<?, ?> tor) {
running = false; this(tor, descriptor);
synchronized (connections) { }
final Set<Connection> conns = new HashSet<Connection>(connections.values());
for (Connection con : conns) { private Node(TorNode<?, ?> tor, ServiceDescriptor descriptor) {
con.close(); this.connections = new HashMap<>();
this.descriptor = descriptor;
this.tor = tor;
this.serverRunning = new AtomicBoolean(false);
}
public String getLocalName() {
return descriptor.getFullAddress();
}
public Connection connect(String peer, Collection<ConnectionListener> listeners)
throws NumberFormatException, IOException {
if (!serverRunning.get()) {
throw new IOException("This node has not been started yet!");
} }
} if (peer.equals(descriptor.getFullAddress()))
serverSocket.close(); throw new IOException("If you find yourself talking to yourself too often, you should really seek help!");
try { synchronized (connections) {
executorService.awaitTermination(2, TimeUnit.SECONDS); if (connections.containsKey(peer))
} catch (InterruptedException e) { throw new IOException("Already connected to " + peer);
e.printStackTrace();
}
Node.this.serverRunning.set(false);
log.debug("Server successfully shutdown");
}
@Override
public void run() {
try {
while (running) {
final Socket socket = serverSocket.accept();
log.info("Accepting Client on port " + socket.getLocalPort());
executorService.submit(new Acceptor(socket));
} }
} catch (IOException e) {
if (running) final Socket sock = connectToService(peer);
e.printStackTrace(); return new OutgoingConnection(peer, sock, listeners);
}
} }
private boolean verifyIdentity(HELOMessage helo, ObjectInputStream in) throws IOException { private Socket connectToService(String hostname, int port) throws IOException, UnknownHostException, SocketException {
log.debug("Verifying HELO msg"); final Socket sock;
final Socket sock = connectToService(helo.getHostname(), helo.getPort()); if (tor != null)
sock = tor.connectToHiddenService(hostname, port);
log.debug("Connected to advertised client " + helo.getPeer()); else
ObjectOutputStream out = prepareOOSForSocket(sock); sock = new Socket(hostname, port);
final IDMessage challenge = new IDMessage(descriptor); sock.setSoTimeout(60000);
out.writeObject(challenge); return sock;
log.debug("Sent IDMessage to");
out.flush();
// wait for other side to close
try {
while (sock.getInputStream().read() != -1)
;
} catch (IOException e) {
// no matter
}
out.close();
sock.close();
log.debug("Closed socket after sending IDMessage");
try {
log.debug("Waiting for response of challenge");
IDMessage response = (IDMessage) in.readObject();
log.debug("Got response for challenge");
final boolean verified = challenge.verify(response);
log.debug("Response verified correctly!");
return verified;
} catch (ClassNotFoundException e) {
new ProtocolViolationException(e).printStackTrace();
}
return false;
} }
private class Acceptor implements Runnable { private Socket connectToService(String peer) throws IOException, UnknownHostException, SocketException {
final String[] split = peer.split(Pattern.quote(":"));
return connectToService(split[0], Integer.parseInt(split[1]));
private final Socket socket; }
private Acceptor(Socket socket) { public synchronized Server startListening(ServerConnectListener listener) throws IOException {
this.socket = socket; if (serverRunning.getAndSet(true))
} throw new IOException("This node is already listening!");
final Server server = new Server(descriptor.getServerSocket(), listener);
server.start();
return server;
}
@Override public Connection getConnection(String peerAddress) {
public void run() { synchronized (connections) {
{ return connections.get(peerAddress);
try { }
socket.setSoTimeout(60 * 1000); }
} catch (SocketException e2) {
e2.printStackTrace(); public Set<Connection> getConnections() {
synchronized (connections) {
return new HashSet<Connection>(connections.values());
}
}
public class Server extends Thread {
private boolean running;
private final ServerSocket serverSocket;
private final ExecutorService executorService;
private final ServerConnectListener serverConnectListener;
private Server(ServerSocket serverSocket, ServerConnectListener listener) {
super("Server");
this.serverSocket = descriptor.getServerSocket();
this.serverConnectListener = listener;
running = true;
executorService = Executors.newCachedThreadPool();
}
public void shutdown() throws IOException {
running = false;
synchronized (connections) {
final Set<Connection> conns = new HashSet<Connection>(connections.values());
for (Connection con : conns) {
con.close();
}
}
serverSocket.close();
try { try {
socket.close(); executorService.awaitTermination(2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
Node.this.serverRunning.set(false);
log.debug("Server successfully shutdown");
}
@Override
public void run() {
try {
while (running) {
final Socket socket = serverSocket.accept();
log.info("Accepting Client on port " + socket.getLocalPort());
executorService.submit(new Acceptor(socket));
}
} catch (IOException e) { } catch (IOException e) {
if (running)
e.printStackTrace();
} }
return; }
}
ObjectInputStream objectInputStream = null; private boolean verifyIdentity(HELOMessage helo, ObjectInputStream in) throws IOException {
ObjectOutputStream out = null; log.debug("Verifying HELO msg");
final Socket sock = connectToService(helo.getHostname(), helo.getPort());
// get incoming data log.debug("Connected to advertised client " + helo.getPeer());
try { ObjectOutputStream out = prepareOOSForSocket(sock);
out = prepareOOSForSocket(socket); final IDMessage challenge = new IDMessage(descriptor);
objectInputStream = new ObjectInputStream(socket.getInputStream()); out.writeObject(challenge);
} catch (EOFException e) { log.debug("Sent IDMessage to");
log.info("Got bogus incoming connection"); out.flush();
} catch (IOException e) { // wait for other side to close
e.printStackTrace();
try { try {
socket.close(); while (sock.getInputStream().read() != -1)
} catch (IOException e1) { ;
} catch (IOException e) {
// no matter
} }
return; out.close();
} sock.close();
log.debug("Closed socket after sending IDMessage");
try {
log.debug("Waiting for response of challenge");
IDMessage response = (IDMessage) in.readObject();
log.debug("Got response for challenge");
final boolean verified = challenge.verify(response);
log.debug("Response verified correctly!");
return verified;
} catch (ClassNotFoundException e) {
new ProtocolViolationException(e).printStackTrace();
}
return false;
}
String peer = null; private class Acceptor implements Runnable {
try {
log.debug("Waiting for HELO or Identification");
final Message helo = (Message) objectInputStream.readObject();
if (helo instanceof HELOMessage) {
peer = ((HELOMessage) helo).getPeer();
log.debug("Got HELO from " + peer);
boolean alreadyConnected;
synchronized (connections) {
alreadyConnected = connections.containsKey(peer);
}
if (alreadyConnected || !verifyIdentity((HELOMessage) helo, objectInputStream)) {
log.debug(alreadyConnected ? ("already connected to " + peer) : "verification failed");
out.writeObject(alreadyConnected ? ControlMessage.ALREADY_CONNECTED : ControlMessage.HANDSHAKE_FAILED);
out.writeObject(ControlMessage.DISCONNECT);
out.flush();
out.close();
objectInputStream.close();
socket.close();
return;
}
log.debug("Verification of " + peer + " successful");
} else if (helo instanceof IDMessage) {
peer = ((IDMessage) helo).getPeer();
log.debug("got IDMessage from " + peer);
final Connection client = connections.get(peer);
if (client != null) {
log.debug("Got preexisting connection for " + peer);
client.sendMsg(((IDMessage) helo).reply());
log.debug("Sent response for challenge");
} else {
log.debug("Got IDMessage for unknown connection to " + peer);
}
out.flush();
out.close();
objectInputStream.close();
socket.close();
log.debug("Closed socket for identification");
return;
private final Socket socket;
private Acceptor(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
{
try {
socket.setSoTimeout(60 * 1000);
} catch (SocketException e2) {
e2.printStackTrace();
try {
socket.close();
} catch (IOException e) {
}
return;
}
ObjectInputStream objectInputStream = null;
ObjectOutputStream out = null;
// get incoming data
try {
out = prepareOOSForSocket(socket);
objectInputStream = new ObjectInputStream(socket.getInputStream());
} catch (EOFException e) {
log.info("Got bogus incoming connection");
} catch (IOException e) {
e.printStackTrace();
try {
socket.close();
} catch (IOException e1) {
}
return;
}
String peer = null;
try {
log.debug("Waiting for HELO or Identification");
final Message helo = (Message) objectInputStream.readObject();
if (helo instanceof HELOMessage) {
peer = ((HELOMessage) helo).getPeer();
log.debug("Got HELO from " + peer);
boolean alreadyConnected;
synchronized (connections) {
alreadyConnected = connections.containsKey(peer);
}
if (alreadyConnected || !verifyIdentity((HELOMessage) helo, objectInputStream)) {
log.debug(alreadyConnected ? ("already connected to " + peer) : "verification failed");
out.writeObject(alreadyConnected ? ControlMessage.ALREADY_CONNECTED : ControlMessage.HANDSHAKE_FAILED);
out.writeObject(ControlMessage.DISCONNECT);
out.flush();
out.close();
objectInputStream.close();
socket.close();
return;
}
log.debug("Verification of " + peer + " successful");
} else if (helo instanceof IDMessage) {
peer = ((IDMessage) helo).getPeer();
log.debug("got IDMessage from " + peer);
final Connection client = connections.get(peer);
if (client != null) {
log.debug("Got preexisting connection for " + peer);
client.sendMsg(((IDMessage) helo).reply());
log.debug("Sent response for challenge");
} else {
log.debug("Got IDMessage for unknown connection to " + peer);
}
out.flush();
out.close();
objectInputStream.close();
socket.close();
log.debug("Closed socket for identification");
return;
} else
throw new ClassNotFoundException("First Message was neither HELO, nor ID");
} catch (ClassNotFoundException e) {
new ProtocolViolationException(e);
} catch (IOException e) {
try {
objectInputStream.close();
out.close();
socket.close();
} catch (IOException e1) {
}
return;
}
// Here we go
log.debug("Incoming Connection ready!");
try {
// TODO: listeners are only added afterwards, so messages can be lost!
IncomingConnection incomingConnection = new IncomingConnection(peer, socket, out, objectInputStream);
serverConnectListener.onConnect(incomingConnection);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
private class IncomingConnection extends Connection {
private IncomingConnection(String peer, Socket socket, ObjectOutputStream out, ObjectInputStream in)
throws IOException {
super(peer, socket, out, in);
synchronized (connections) {
connections.put(peer, this);
}
sendMsg(ControlMessage.AVAILABLE);
}
@Override
public void listen() throws ConnectionException {
super.listen();
onReady();
}
@Override
protected void onMessage(Message msg) throws IOException {
if ((msg instanceof ControlMessage) && (ControlMessage.HEARTBEAT == msg)) {
log.debug("RX+REPLY HEARTBEAT");
try {
sendMsg(ControlMessage.HEARTBEAT);
} catch (IOException e) {
onError(e);
}
} else } else
throw new ClassNotFoundException("First Message was neither HELO, nor ID"); super.onMessage(msg);
} catch (ClassNotFoundException e) { }
new ProtocolViolationException(e);
} catch (IOException e) { @Override
try { public void onDisconnect() {
objectInputStream.close(); synchronized (connections) {
out.close(); connections.remove(getPeer());
socket.close();
} catch (IOException e1) {
} }
return;
}
// Here we go
log.debug("Incoming Connection ready!");
try {
// TODO: listeners are only added afterwards, so messages can be lost!
IncomingConnection incomingConnection = new IncomingConnection(peer, socket, out, objectInputStream);
serverConnectListener.onConnect(incomingConnection);
} catch (IOException e) {
e.printStackTrace();
}
} }
}
}
}
private class IncomingConnection extends Connection { @Override
private IncomingConnection(String peer, Socket socket, ObjectOutputStream out, ObjectInputStream in) public boolean isIncoming() {
throws IOException { return true;
super(peer, socket, out, in);
synchronized (connections) {
connections.put(peer, this);
}
sendMsg(ControlMessage.AVAILABLE);
}
@Override
public void listen() throws ConnectionException {
super.listen();
onReady();
}
@Override
protected void onMessage(Message msg) throws IOException {
if ((msg instanceof ControlMessage) && (ControlMessage.HEARTBEAT == msg)) {
log.debug("RX+REPLY HEARTBEAT");
try {
sendMsg(ControlMessage.HEARTBEAT);
} catch (IOException e) {
onError(e);
} }
} else
super.onMessage(msg);
} }
@Override private class OutgoingConnection extends Connection {
public void onDisconnect() {
synchronized (connections) { private OutgoingConnection(String peer, Socket socket, Collection<ConnectionListener> listeners)
connections.remove(getPeer()); throws IOException {
} super(peer, socket);
synchronized (connections) {
connections.put(peer, this);
}
setConnectionListeners(listeners);
try {
listen();
} catch (ConnectionException e) {
// Never happens
}
log.debug("Sending HELO");
sendMsg(new HELOMessage(descriptor));
log.debug("Sent HELO");
}
@Override
public void onDisconnect() {
synchronized (connections) {
connections.remove(getPeer());
}
}
@Override
public boolean isIncoming() {
return false;
}
} }
@Override
public boolean isIncoming() {
return true;
}
}
private class OutgoingConnection extends Connection {
private OutgoingConnection(String peer, Socket socket, Collection<ConnectionListener> listeners)
throws IOException {
super(peer, socket);
synchronized (connections) {
connections.put(peer, this);
}
setConnectionListeners(listeners);
try {
listen();
} catch (ConnectionException e) {
// Never happens
}
log.debug("Sending HELO");
sendMsg(new HELOMessage(descriptor));
log.debug("Sent HELO");
}
@Override
public void onDisconnect() {
synchronized (connections) {
connections.remove(getPeer());
}
}
@Override
public boolean isIncoming() {
return false;
}
}
} }

View file

@ -1,52 +1,52 @@
package io.nucleo.net; package io.nucleo.net;
public enum PredefinedDisconnectReason implements DisconnectReason { public enum PredefinedDisconnectReason implements DisconnectReason {
TIMEOUT("due to timed out", false, true), TIMEOUT("due to timed out", false, true),
CONNECTION_CLOSED("as ordered", true), CONNECTION_CLOSED("as ordered", true),
RESET("due to remote reset (EOF)", false, true), RESET("due to remote reset (EOF)", false, true),
UNKNOWN("for unknown reasons", false); UNKNOWN("for unknown reasons", false);
private Boolean remote; private Boolean remote;
private final boolean graceful; private final boolean graceful;
private final String description; private final String description;
private PredefinedDisconnectReason(String description, boolean graceful) { private PredefinedDisconnectReason(String description, boolean graceful) {
this.description = description; this.description = description;
this.graceful = graceful; this.graceful = graceful;
} }
private PredefinedDisconnectReason(String description, boolean graceful, boolean remote) { private PredefinedDisconnectReason(String description, boolean graceful, boolean remote) {
this.description = description; this.description = description;
this.graceful = graceful; this.graceful = graceful;
this.remote = remote; this.remote = remote;
} }
public static PredefinedDisconnectReason createReason(PredefinedDisconnectReason reason, boolean remote) { public static PredefinedDisconnectReason createReason(PredefinedDisconnectReason reason, boolean remote) {
reason.remote = remote; reason.remote = remote;
return reason; return reason;
} }
@Override @Override
public boolean isGraceful() { public boolean isGraceful() {
return graceful; return graceful;
} }
@Override @Override
public boolean isRemote() { public boolean isRemote() {
if (remote == null) if (remote == null)
return false; return false;
return remote; return remote;
} }
public String toString() { public String toString() {
StringBuilder bld = new StringBuilder("Connection closed "); StringBuilder bld = new StringBuilder("Connection closed ");
if (remote != null) if (remote != null)
bld.append(remote ? "remotely " : "locally "); bld.append(remote ? "remotely " : "locally ");
bld.append(description).append(" ("); bld.append(description).append(" (");
bld.append(graceful ? "graceful" : "irregular").append(" disconnect)"); bld.append(graceful ? "graceful" : "irregular").append(" disconnect)");
return bld.toString(); return bld.toString();
} }
} }

View file

@ -2,11 +2,11 @@ package io.nucleo.net;
public interface ServerConnectListener { public interface ServerConnectListener {
/** /**
* Called whenever an incoming connection was set up properly. * Called whenever an incoming connection was set up properly.
* Connection.listen() needs to be called ASAP for the connection to become available * Connection.listen() needs to be called ASAP for the connection to become available
* *
* @param con the newly established connection * @param con the newly established connection
*/ */
public void onConnect(Connection con); public void onConnect(Connection con);
} }

View file

@ -5,14 +5,14 @@ import java.io.Serializable;
public class ContainerMessage implements Message { public class ContainerMessage implements Message {
private static final long serialVersionUID = 9219884444024922023L; private static final long serialVersionUID = 9219884444024922023L;
private final Serializable payload; private final Serializable payload;
public ContainerMessage(Serializable payload) { public ContainerMessage(Serializable payload) {
this.payload = payload; this.payload = payload;
} }
public Serializable getPayload() { public Serializable getPayload() {
return payload; return payload;
} }
} }

View file

@ -1,9 +1,9 @@
package io.nucleo.net.proto; package io.nucleo.net.proto;
public enum ControlMessage implements Message { public enum ControlMessage implements Message {
HEARTBEAT, HEARTBEAT,
AVAILABLE, AVAILABLE,
HANDSHAKE_FAILED, HANDSHAKE_FAILED,
ALREADY_CONNECTED, ALREADY_CONNECTED,
DISCONNECT; DISCONNECT;
} }

View file

@ -6,30 +6,30 @@ import java.util.regex.Pattern;
public class HELOMessage implements Message { public class HELOMessage implements Message {
private static final long serialVersionUID = -4582946298578924930L; private static final long serialVersionUID = -4582946298578924930L;
private final String peer; private final String peer;
public HELOMessage(ServiceDescriptor descriptor) { public HELOMessage(ServiceDescriptor descriptor) {
this(descriptor.getFullAddress()); this(descriptor.getFullAddress());
} }
private HELOMessage(String peer) { private HELOMessage(String peer) {
this.peer = peer; this.peer = peer;
} }
public String getPeer() { public String getPeer() {
return peer; return peer;
} }
public String getHostname() { public String getHostname() {
return peer.split(Pattern.quote(":"))[0]; return peer.split(Pattern.quote(":"))[0];
} }
public int getPort() { public int getPort() {
return Integer.parseInt(peer.split(Pattern.quote(":"))[1]); return Integer.parseInt(peer.split(Pattern.quote(":"))[1]);
} }
public String toString() { public String toString() {
return "HELO " + peer; return "HELO " + peer;
} }
} }

View file

@ -7,42 +7,42 @@ import java.security.SecureRandom;
public class IDMessage implements Message { public class IDMessage implements Message {
private static final long serialVersionUID = -2214485311644580948L; private static final long serialVersionUID = -2214485311644580948L;
private static SecureRandom rnd; private static SecureRandom rnd;
static { static {
try { try {
rnd = SecureRandom.getInstance("SHA1PRNG"); rnd = SecureRandom.getInstance("SHA1PRNG");
} catch (NoSuchAlgorithmException e) { } catch (NoSuchAlgorithmException e) {
e.printStackTrace(); e.printStackTrace();
}
} }
}
private final String id; private final String id;
private final long nonce; private final long nonce;
public IDMessage(ServiceDescriptor descriptor) { public IDMessage(ServiceDescriptor descriptor) {
this(descriptor.getFullAddress(), rnd.nextLong()); this(descriptor.getFullAddress(), rnd.nextLong());
} }
private IDMessage(String id, long nonce) { private IDMessage(String id, long nonce) {
this.id = id; this.id = id;
this.nonce = nonce; this.nonce = nonce;
} }
public String getPeer() { public String getPeer() {
return id; return id;
} }
public IDMessage reply() { public IDMessage reply() {
return new IDMessage(id, nonce); return new IDMessage(id, nonce);
} }
public boolean verify(IDMessage msg) { public boolean verify(IDMessage msg) {
return id.equals(msg.id) && (nonce == msg.nonce); return id.equals(msg.id) && (nonce == msg.nonce);
} }
public String toString() { public String toString() {
return "ID " + id; return "ID " + id;
} }
} }

View file

@ -1,16 +1,16 @@
package io.nucleo.net.proto.exceptions; package io.nucleo.net.proto.exceptions;
public class ConnectionException extends Exception { public class ConnectionException extends Exception {
public ConnectionException(String msg) { public ConnectionException(String msg) {
super(msg); super(msg);
} }
public ConnectionException(Throwable cause) { public ConnectionException(Throwable cause) {
super(cause); super(cause);
} }
public ConnectionException(String msg, Throwable cause) { public ConnectionException(String msg, Throwable cause) {
super(msg, cause); super(msg, cause);
} }
} }

View file

@ -2,18 +2,18 @@ package io.nucleo.net.proto.exceptions;
public class ProtocolViolationException extends Exception { public class ProtocolViolationException extends Exception {
public ProtocolViolationException() { public ProtocolViolationException() {
} }
public ProtocolViolationException(Throwable cause) { public ProtocolViolationException(Throwable cause) {
super(cause); super(cause);
} }
public ProtocolViolationException(String msg) { public ProtocolViolationException(String msg) {
super(msg); super(msg);
} }
public ProtocolViolationException(String msg, Throwable cause) { public ProtocolViolationException(String msg, Throwable cause) {
super(msg, cause); super(msg, cause);
} }
} }

View file

@ -23,7 +23,7 @@ public class SeedNodeRequestDataManager extends RequestDataManager {
if (dataStorage.getMap().isEmpty()) { if (dataStorage.getMap().isEmpty()) {
if (requestDataFromAuthenticatedSeedNodeTimer == null) if (requestDataFromAuthenticatedSeedNodeTimer == null)
requestDataFromAuthenticatedSeedNodeTimer = UserThread.runAfterRandomDelay(() requestDataFromAuthenticatedSeedNodeTimer = UserThread.runAfterRandomDelay(()
-> requestDataFromAuthenticatedSeedNode(peerAddress, connection), 2, 5, TimeUnit.SECONDS); -> requestDataFromAuthenticatedSeedNode(peerAddress, connection), 2, 5, TimeUnit.SECONDS);
} }
super.onPeerAuthenticated(peerAddress, connection); super.onPeerAuthenticated(peerAddress, connection);
} }

View file

@ -44,6 +44,7 @@ public class P2PServiceTest {
private P2PService p2PService1, p2PService2, p2PService3; private P2PService p2PService1, p2PService2, p2PService3;
private SeedNode seedNode1, seedNode2, seedNode3; private SeedNode seedNode1, seedNode2, seedNode3;
private File dir1, dir2, dir3; private File dir1, dir2, dir3;
@Before @Before
public void setup() throws InterruptedException, CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException, CryptoException { public void setup() throws InterruptedException, CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException, CryptoException {
Security.addProvider(new BouncyCastleProvider()); Security.addProvider(new BouncyCastleProvider());

View file

@ -40,7 +40,8 @@
<!-- broken with Java 8 (MSHADE-174), using ProGuard instead. --> <!-- broken with Java 8 (MSHADE-174), using ProGuard instead. -->
<minimizeJar>false</minimizeJar> <minimizeJar>false</minimizeJar>
<transformers> <transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>io.bitsquare.p2p.seed.SeedNodeMain</mainClass> <mainClass>io.bitsquare.p2p.seed.SeedNodeMain</mainClass>
</transformer> </transformer>
</transformers> </transformers>