Repository: GoldenGnu/jeveassets
Branch: main
Commit: 4515534818cb
Files: 791
Total size: 22.2 MB
Directory structure:
gitextract_syw4v6nw/
├── .github/
│ └── workflows/
│ ├── codeql-analysis.yml
│ ├── esi.yml
│ └── tests.yml
├── .gitignore
├── CONTRIBUTING.md
├── changelog.txt
├── checkstyle.xml
├── credits.txt
├── data/
│ ├── agents.xml
│ ├── flags.xml
│ ├── items.xml
│ ├── jumps.xml
│ ├── locations.xml
│ └── npccorporation.xml
├── license.txt
├── pom.xml
├── readme.txt
├── src/
│ ├── main/
│ │ ├── assembly/
│ │ │ └── assembly.xml
│ │ ├── java/
│ │ │ └── net/
│ │ │ └── nikr/
│ │ │ └── eve/
│ │ │ └── jeveasset/
│ │ │ ├── CliExport.java
│ │ │ ├── CliOptions.java
│ │ │ ├── CliUpdate.java
│ │ │ ├── DetectEdtViolationRepaintManager.java
│ │ │ ├── LibraryManager.java
│ │ │ ├── Main.java
│ │ │ ├── NahimicDetector.java
│ │ │ ├── NikrUncaughtExceptionHandler.java
│ │ │ ├── Program.java
│ │ │ ├── SingleInstance.java
│ │ │ ├── SplashUpdater.java
│ │ │ ├── ToolLoader.java
│ │ │ ├── data/
│ │ │ │ ├── api/
│ │ │ │ │ ├── accounts/
│ │ │ │ │ │ ├── AbstractOwner.java
│ │ │ │ │ │ ├── ApiType.java
│ │ │ │ │ │ ├── EsiOwner.java
│ │ │ │ │ │ ├── OwnerType.java
│ │ │ │ │ │ └── SimpleOwner.java
│ │ │ │ │ ├── my/
│ │ │ │ │ │ ├── MyAccountBalance.java
│ │ │ │ │ │ ├── MyAsset.java
│ │ │ │ │ │ ├── MyBlueprint.java
│ │ │ │ │ │ ├── MyContract.java
│ │ │ │ │ │ ├── MyContractItem.java
│ │ │ │ │ │ ├── MyExtraction.java
│ │ │ │ │ │ ├── MyIndustryJob.java
│ │ │ │ │ │ ├── MyJournal.java
│ │ │ │ │ │ ├── MyLoyaltyPoints.java
│ │ │ │ │ │ ├── MyMarketOrder.java
│ │ │ │ │ │ ├── MyMining.java
│ │ │ │ │ │ ├── MyNpcStanding.java
│ │ │ │ │ │ ├── MyShip.java
│ │ │ │ │ │ ├── MySkill.java
│ │ │ │ │ │ └── MyTransaction.java
│ │ │ │ │ └── raw/
│ │ │ │ │ ├── RawAccountBalance.java
│ │ │ │ │ ├── RawAsset.java
│ │ │ │ │ ├── RawBlueprint.java
│ │ │ │ │ ├── RawClone.java
│ │ │ │ │ ├── RawContract.java
│ │ │ │ │ ├── RawContractItem.java
│ │ │ │ │ ├── RawExtraction.java
│ │ │ │ │ ├── RawIndustryJob.java
│ │ │ │ │ ├── RawJournal.java
│ │ │ │ │ ├── RawJournalRefType.java
│ │ │ │ │ ├── RawLoyaltyPoints.java
│ │ │ │ │ ├── RawMarketOrder.java
│ │ │ │ │ ├── RawMining.java
│ │ │ │ │ ├── RawNpcStanding.java
│ │ │ │ │ ├── RawPublicMarketOrder.java
│ │ │ │ │ ├── RawSkill.java
│ │ │ │ │ └── RawTransaction.java
│ │ │ │ ├── profile/
│ │ │ │ │ ├── Profile.java
│ │ │ │ │ ├── ProfileData.java
│ │ │ │ │ ├── ProfileManager.java
│ │ │ │ │ ├── StockpileIDs.java
│ │ │ │ │ └── TableData.java
│ │ │ │ ├── sde/
│ │ │ │ │ ├── Agent.java
│ │ │ │ │ ├── IndustryMaterial.java
│ │ │ │ │ ├── Item.java
│ │ │ │ │ ├── ItemFlag.java
│ │ │ │ │ ├── Jump.java
│ │ │ │ │ ├── MyLocation.java
│ │ │ │ │ ├── NpcCorporation.java
│ │ │ │ │ ├── ReprocessedMaterial.java
│ │ │ │ │ ├── RouteFinder.java
│ │ │ │ │ └── StaticData.java
│ │ │ │ └── settings/
│ │ │ │ ├── AddedData.java
│ │ │ │ ├── Citadel.java
│ │ │ │ ├── CitadelSettings.java
│ │ │ │ ├── ColorEntry.java
│ │ │ │ ├── ColorSettings.java
│ │ │ │ ├── ColorTheme.java
│ │ │ │ ├── ColorThemeColorblind.java
│ │ │ │ ├── ColorThemeDark.java
│ │ │ │ ├── ColorThemeDefault.java
│ │ │ │ ├── ColorThemeStrong.java
│ │ │ │ ├── Colors.java
│ │ │ │ ├── CopySettings.java
│ │ │ │ ├── DarkNimbus.java
│ │ │ │ ├── ExportSettings.java
│ │ │ │ ├── ManufacturingSettings.java
│ │ │ │ ├── MarketOrdersSettings.java
│ │ │ │ ├── MarketPriceData.java
│ │ │ │ ├── PriceData.java
│ │ │ │ ├── PriceDataSettings.java
│ │ │ │ ├── PriceHistoryDatabase.java
│ │ │ │ ├── ProxyData.java
│ │ │ │ ├── ReprocessSettings.java
│ │ │ │ ├── RouteAvoidSettings.java
│ │ │ │ ├── RouteResult.java
│ │ │ │ ├── RoutingSettings.java
│ │ │ │ ├── Settings.java
│ │ │ │ ├── SettingsUpdateListener.java
│ │ │ │ ├── StockpileGroupSettings.java
│ │ │ │ ├── TempDirs.java
│ │ │ │ ├── TrackerData.java
│ │ │ │ ├── TrackerSettings.java
│ │ │ │ ├── UserItem.java
│ │ │ │ ├── tag/
│ │ │ │ │ ├── Tag.java
│ │ │ │ │ ├── TagColor.java
│ │ │ │ │ ├── TagID.java
│ │ │ │ │ ├── TagUpdate.java
│ │ │ │ │ └── Tags.java
│ │ │ │ └── types/
│ │ │ │ ├── BlueprintType.java
│ │ │ │ ├── CorporationType.java
│ │ │ │ ├── EditableLocationType.java
│ │ │ │ ├── EditablePriceType.java
│ │ │ │ ├── EsiType.java
│ │ │ │ ├── ItemType.java
│ │ │ │ ├── LastTransactionType.java
│ │ │ │ ├── LocationType.java
│ │ │ │ ├── LocationsType.java
│ │ │ │ ├── MarketDetailType.java
│ │ │ │ ├── OwnersType.java
│ │ │ │ ├── PriceType.java
│ │ │ │ └── TagsType.java
│ │ │ ├── gui/
│ │ │ │ ├── dialogs/
│ │ │ │ │ ├── AboutDialog.java
│ │ │ │ │ ├── account/
│ │ │ │ │ │ ├── AccountImportDialog.java
│ │ │ │ │ │ ├── AccountManagerDialog.java
│ │ │ │ │ │ ├── AccountSeparatorTableCell.java
│ │ │ │ │ │ ├── AccountTableFormat.java
│ │ │ │ │ │ ├── JAccountTable.java
│ │ │ │ │ │ └── SeparatorListComparator.java
│ │ │ │ │ ├── profile/
│ │ │ │ │ │ ├── JValidatedInputDialog.java
│ │ │ │ │ │ └── ProfileDialog.java
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ ├── AssetsToolSettingsPanel.java
│ │ │ │ │ │ ├── ColorSeparatorTableCell.java
│ │ │ │ │ │ ├── ColorSettingsPanel.java
│ │ │ │ │ │ ├── ColorsTableFormat.java
│ │ │ │ │ │ ├── ContractToolSettingsPanel.java
│ │ │ │ │ │ ├── ExperimentalSettingsPanel.java
│ │ │ │ │ │ ├── GeneralSettingsPanel.java
│ │ │ │ │ │ ├── IndustryJobsToolSettingsPanel.java
│ │ │ │ │ │ ├── JColorTable.java
│ │ │ │ │ │ ├── JSettingsPanel.java
│ │ │ │ │ │ ├── JUserListPanel.java
│ │ │ │ │ │ ├── JournalToolSettingsPanel.java
│ │ │ │ │ │ ├── JumpsSettingsPanel.java
│ │ │ │ │ │ ├── LookAndFeelPreview.java
│ │ │ │ │ │ ├── ManufacturingSettingsPanel.java
│ │ │ │ │ │ ├── MarketOrdersToolSettingsPanel.java
│ │ │ │ │ │ ├── MiningToolSettingsPanel.java
│ │ │ │ │ │ ├── OverviewToolSettingsPanel.java
│ │ │ │ │ │ ├── PriceDataSettingsPanel.java
│ │ │ │ │ │ ├── PriceHistoryToolSettingsPanel.java
│ │ │ │ │ │ ├── ProxySettingsPanel.java
│ │ │ │ │ │ ├── ReprocessingSettingsPanel.java
│ │ │ │ │ │ ├── SettingsDialog.java
│ │ │ │ │ │ ├── ShowToolSettingsPanel.java
│ │ │ │ │ │ ├── SoundsSettingsPanel.java
│ │ │ │ │ │ ├── StockpileToolSettingsPanel.java
│ │ │ │ │ │ ├── TagsSettingsPanel.java
│ │ │ │ │ │ ├── TrackerToolSettingsPanel.java
│ │ │ │ │ │ ├── TransactionsToolSettingsPanel.java
│ │ │ │ │ │ ├── UserLocationSettingsPanel.java
│ │ │ │ │ │ ├── UserNameSettingsPanel.java
│ │ │ │ │ │ ├── UserPriceSettingsPanel.java
│ │ │ │ │ │ └── WindowSettingsPanel.java
│ │ │ │ │ └── update/
│ │ │ │ │ ├── StructureUpdateDialog.java
│ │ │ │ │ ├── TaskDialog.java
│ │ │ │ │ ├── UpdateDialog.java
│ │ │ │ │ └── UpdateTask.java
│ │ │ │ ├── frame/
│ │ │ │ │ ├── MainMenu.java
│ │ │ │ │ ├── MainWindow.java
│ │ │ │ │ └── StatusPanel.java
│ │ │ │ ├── images/
│ │ │ │ │ └── Images.java
│ │ │ │ ├── shared/
│ │ │ │ │ ├── ColorIcon.java
│ │ │ │ │ ├── ColorUtil.java
│ │ │ │ │ ├── CopyHandler.java
│ │ │ │ │ ├── DocumentFactory.java
│ │ │ │ │ ├── Formatter.java
│ │ │ │ │ ├── InstantToolTip.java
│ │ │ │ │ ├── JFreeChartUtil.java
│ │ │ │ │ ├── JOptionInput.java
│ │ │ │ │ ├── JSimpleColorPicker.java
│ │ │ │ │ ├── MarketDetailsColumn.java
│ │ │ │ │ ├── MenuScroller.java
│ │ │ │ │ ├── NativeUtil.java
│ │ │ │ │ ├── StringComparators.java
│ │ │ │ │ ├── TextImport.java
│ │ │ │ │ ├── TextManager.java
│ │ │ │ │ ├── TreeSelectDialog.java
│ │ │ │ │ ├── Updatable.java
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── CheckBoxNode.java
│ │ │ │ │ │ ├── CheckBoxNodeEditor.java
│ │ │ │ │ │ ├── CheckBoxNodeRenderer.java
│ │ │ │ │ │ ├── CompoundUndoManager.java
│ │ │ │ │ │ ├── JAutoCompleteDialog.java
│ │ │ │ │ │ ├── JButtonComparable.java
│ │ │ │ │ │ ├── JButtonNull.java
│ │ │ │ │ │ ├── JCustomFileChooser.java
│ │ │ │ │ │ ├── JDateChooser.java
│ │ │ │ │ │ ├── JDefaultField.java
│ │ │ │ │ │ ├── JDialogCentered.java
│ │ │ │ │ │ ├── JDoubleField.java
│ │ │ │ │ │ ├── JDragTabbedPane.java
│ │ │ │ │ │ ├── JDropDownButton.java
│ │ │ │ │ │ ├── JFixedToolBar.java
│ │ │ │ │ │ ├── JGroupLayoutPanel.java
│ │ │ │ │ │ ├── JImportDialog.java
│ │ │ │ │ │ ├── JIntegerField.java
│ │ │ │ │ │ ├── JLabelMultiline.java
│ │ │ │ │ │ ├── JLabelMultilineHtml.java
│ │ │ │ │ │ ├── JLockWindow.java
│ │ │ │ │ │ ├── JMainTab.java
│ │ │ │ │ │ ├── JMainTabPrimary.java
│ │ │ │ │ │ ├── JMainTabSecondary.java
│ │ │ │ │ │ ├── JManagerDialog.java
│ │ │ │ │ │ ├── JMultiSelectionDialog.java
│ │ │ │ │ │ ├── JMultiSelectionList.java
│ │ │ │ │ │ ├── JOptionsDialog.java
│ │ │ │ │ │ ├── JSelectionDialog.java
│ │ │ │ │ │ ├── JTextAreaPlaceholder.java
│ │ │ │ │ │ ├── JTextDialog.java
│ │ │ │ │ │ ├── JTreemap.java
│ │ │ │ │ │ ├── JWorking.java
│ │ │ │ │ │ └── ListComboBoxModel.java
│ │ │ │ │ ├── filter/
│ │ │ │ │ │ ├── ColumnCache.java
│ │ │ │ │ │ ├── ExportDialog.java
│ │ │ │ │ │ ├── ExportTableData.java
│ │ │ │ │ │ ├── Filter.java
│ │ │ │ │ │ ├── FilterControl.java
│ │ │ │ │ │ ├── FilterExport.java
│ │ │ │ │ │ ├── FilterGui.java
│ │ │ │ │ │ ├── FilterLogicalMatcher.java
│ │ │ │ │ │ ├── FilterMatcher.java
│ │ │ │ │ │ ├── FilterMenu.java
│ │ │ │ │ │ ├── FilterPanel.java
│ │ │ │ │ │ ├── FilterPanelSeparator.java
│ │ │ │ │ │ ├── FilterSave.java
│ │ │ │ │ │ ├── JFilterManagerDialog.java
│ │ │ │ │ │ ├── SimpleFilterControl.java
│ │ │ │ │ │ └── SimpleTableFormat.java
│ │ │ │ │ ├── menu/
│ │ │ │ │ │ ├── JFormulaDialog.java
│ │ │ │ │ │ ├── JMenuAssetFilter.java
│ │ │ │ │ │ ├── JMenuColumns.java
│ │ │ │ │ │ ├── JMenuCopy.java
│ │ │ │ │ │ ├── JMenuCopyPlus.java
│ │ │ │ │ │ ├── JMenuFormula.java
│ │ │ │ │ │ ├── JMenuInfo.java
│ │ │ │ │ │ ├── JMenuJumps.java
│ │ │ │ │ │ ├── JMenuLoadout.java
│ │ │ │ │ │ ├── JMenuLocation.java
│ │ │ │ │ │ ├── JMenuLookup.java
│ │ │ │ │ │ ├── JMenuName.java
│ │ │ │ │ │ ├── JMenuPrice.java
│ │ │ │ │ │ ├── JMenuPriceHistory.java
│ │ │ │ │ │ ├── JMenuReprocessed.java
│ │ │ │ │ │ ├── JMenuRouting.java
│ │ │ │ │ │ ├── JMenuStockpile.java
│ │ │ │ │ │ ├── JMenuSum.java
│ │ │ │ │ │ ├── JMenuTags.java
│ │ │ │ │ │ ├── JMenuTransactionFilter.java
│ │ │ │ │ │ ├── JMenuUI.java
│ │ │ │ │ │ ├── JTagsDialog.java
│ │ │ │ │ │ ├── MenuData.java
│ │ │ │ │ │ └── MenuManager.java
│ │ │ │ │ └── table/
│ │ │ │ │ ├── ColumnManager.java
│ │ │ │ │ ├── EnumTableColumn.java
│ │ │ │ │ ├── EnumTableFormatAdaptor.java
│ │ │ │ │ ├── EventListManager.java
│ │ │ │ │ ├── EventModels.java
│ │ │ │ │ ├── JAutoColumnTable.java
│ │ │ │ │ ├── JEditColumnsDialog.java
│ │ │ │ │ ├── JSeparatorTable.java
│ │ │ │ │ ├── JViewManagerDialog.java
│ │ │ │ │ ├── PaddingTableCellRenderer.java
│ │ │ │ │ ├── SeparatorTableCell.java
│ │ │ │ │ ├── SimpleColumnManager.java
│ │ │ │ │ ├── TableCellRenderers.java
│ │ │ │ │ ├── TableFormatFactory.java
│ │ │ │ │ ├── View.java
│ │ │ │ │ └── containers/
│ │ │ │ │ ├── AssetContainer.java
│ │ │ │ │ ├── DateOnly.java
│ │ │ │ │ ├── Duration.java
│ │ │ │ │ ├── ExpirerDate.java
│ │ │ │ │ ├── HierarchyColumn.java
│ │ │ │ │ ├── ISK.java
│ │ │ │ │ ├── LongInt.java
│ │ │ │ │ ├── ModulePriceValue.java
│ │ │ │ │ ├── NumberValue.java
│ │ │ │ │ ├── Percent.java
│ │ │ │ │ ├── Runs.java
│ │ │ │ │ ├── Security.java
│ │ │ │ │ ├── Standing.java
│ │ │ │ │ ├── TextIcon.java
│ │ │ │ │ └── YesNo.java
│ │ │ │ ├── sounds/
│ │ │ │ │ ├── DefaultSound.java
│ │ │ │ │ ├── FileSound.java
│ │ │ │ │ ├── Sound.java
│ │ │ │ │ ├── SoundPlayer.java
│ │ │ │ │ └── SoundThread.java
│ │ │ │ └── tabs/
│ │ │ │ ├── agents/
│ │ │ │ │ ├── AgentsTab.java
│ │ │ │ │ └── AgentsTableFormat.java
│ │ │ │ ├── assets/
│ │ │ │ │ ├── AssetTableFormat.java
│ │ │ │ │ ├── AssetsTab.java
│ │ │ │ │ └── JAssetTable.java
│ │ │ │ ├── contracts/
│ │ │ │ │ ├── ContractsSeparatorTableCell.java
│ │ │ │ │ ├── ContractsTab.java
│ │ │ │ │ ├── ContractsTableFormat.java
│ │ │ │ │ └── JContractsTable.java
│ │ │ │ ├── items/
│ │ │ │ │ ├── ItemTableFormat.java
│ │ │ │ │ └── ItemsTab.java
│ │ │ │ ├── jobs/
│ │ │ │ │ ├── IndustryJobTableFormat.java
│ │ │ │ │ ├── IndustryJobsTab.java
│ │ │ │ │ └── JIndustryJobsTable.java
│ │ │ │ ├── journal/
│ │ │ │ │ ├── JJournalTable.java
│ │ │ │ │ ├── JournalChartDialog.java
│ │ │ │ │ ├── JournalTab.java
│ │ │ │ │ └── JournalTableFormat.java
│ │ │ │ ├── loadout/
│ │ │ │ │ ├── Loadout.java
│ │ │ │ │ ├── LoadoutData.java
│ │ │ │ │ ├── LoadoutExtendedTableFormat.java
│ │ │ │ │ ├── LoadoutSeparatorComparator.java
│ │ │ │ │ ├── LoadoutSeparatorTableCell.java
│ │ │ │ │ ├── LoadoutTableFormat.java
│ │ │ │ │ ├── LoadoutsExportDialog.java
│ │ │ │ │ └── LoadoutsTab.java
│ │ │ │ ├── loyalty/
│ │ │ │ │ ├── LoyaltyPointsTab.java
│ │ │ │ │ ├── LoyaltyPointsTableFormat.java
│ │ │ │ │ └── TotalLoyaltyPoints.java
│ │ │ │ ├── materials/
│ │ │ │ │ ├── Material.java
│ │ │ │ │ ├── MaterialExtendedTableFormat.java
│ │ │ │ │ ├── MaterialSeparatorComparator.java
│ │ │ │ │ ├── MaterialTableFormat.java
│ │ │ │ │ ├── MaterialsData.java
│ │ │ │ │ ├── MaterialsSeparatorTableCell.java
│ │ │ │ │ └── MaterialsTab.java
│ │ │ │ ├── mining/
│ │ │ │ │ ├── ExtractionsTab.java
│ │ │ │ │ ├── ExtractionsTableFormat.java
│ │ │ │ │ ├── JExtractionsTable.java
│ │ │ │ │ ├── MiningGraphTab.java
│ │ │ │ │ ├── MiningTab.java
│ │ │ │ │ └── MiningTableFormat.java
│ │ │ │ ├── orders/
│ │ │ │ │ ├── JMarketOrdersTable.java
│ │ │ │ │ ├── MarketLog.java
│ │ │ │ │ ├── MarketOrdersTab.java
│ │ │ │ │ ├── MarketTableFormat.java
│ │ │ │ │ ├── Outbid.java
│ │ │ │ │ └── OutbidProcesser.java
│ │ │ │ ├── overview/
│ │ │ │ │ ├── JOverviewMenu.java
│ │ │ │ │ ├── JOverviewTable.java
│ │ │ │ │ ├── Overview.java
│ │ │ │ │ ├── OverviewData.java
│ │ │ │ │ ├── OverviewGroup.java
│ │ │ │ │ ├── OverviewLocation.java
│ │ │ │ │ ├── OverviewTab.java
│ │ │ │ │ └── OverviewTableFormat.java
│ │ │ │ ├── prices/
│ │ │ │ │ ├── JItemsManagerDialog.java
│ │ │ │ │ ├── PriceChangesTab.java
│ │ │ │ │ ├── PriceChangesTableFormat.java
│ │ │ │ │ └── PriceHistoryTab.java
│ │ │ │ ├── reprocessed/
│ │ │ │ │ ├── JReprocessedTable.java
│ │ │ │ │ ├── ReprocessedData.java
│ │ │ │ │ ├── ReprocessedExtendedTableFormat.java
│ │ │ │ │ ├── ReprocessedGrandItem.java
│ │ │ │ │ ├── ReprocessedGrandTotal.java
│ │ │ │ │ ├── ReprocessedInterface.java
│ │ │ │ │ ├── ReprocessedItem.java
│ │ │ │ │ ├── ReprocessedSeparatorComparator.java
│ │ │ │ │ ├── ReprocessedSeparatorTableCell.java
│ │ │ │ │ ├── ReprocessedTab.java
│ │ │ │ │ ├── ReprocessedTableFormat.java
│ │ │ │ │ └── ReprocessedTotal.java
│ │ │ │ ├── routing/
│ │ │ │ │ ├── EditableListModel.java
│ │ │ │ │ ├── JAvoid.java
│ │ │ │ │ ├── JAvoidManagerDialog.java
│ │ │ │ │ ├── JRouteEditDialog.java
│ │ │ │ │ ├── JRouteManagerDialog.java
│ │ │ │ │ ├── MoveJList.java
│ │ │ │ │ ├── RoutingTab.java
│ │ │ │ │ └── SolarSystem.java
│ │ │ │ ├── skills/
│ │ │ │ │ ├── JSkillPlansManageDialog.java
│ │ │ │ │ ├── SkillsOverviewTab.java
│ │ │ │ │ ├── SkillsOverviewTableFormat.java
│ │ │ │ │ ├── SkillsTab.java
│ │ │ │ │ └── SkillsTableFormat.java
│ │ │ │ ├── slots/
│ │ │ │ │ ├── JSlotsTable.java
│ │ │ │ │ ├── Slots.java
│ │ │ │ │ ├── SlotsData.java
│ │ │ │ │ ├── SlotsTab.java
│ │ │ │ │ └── SlotsTableFormat.java
│ │ │ │ ├── standing/
│ │ │ │ │ ├── NpcStandingTab.java
│ │ │ │ │ └── NpcStandingTableFormat.java
│ │ │ │ ├── stockpile/
│ │ │ │ │ ├── JStockpileItemMenu.java
│ │ │ │ │ ├── JStockpileTable.java
│ │ │ │ │ ├── Stockpile.java
│ │ │ │ │ ├── StockpileBpDialog.java
│ │ │ │ │ ├── StockpileData.java
│ │ │ │ │ ├── StockpileDialog.java
│ │ │ │ │ ├── StockpileExtendedTableFormat.java
│ │ │ │ │ ├── StockpileItemDialog.java
│ │ │ │ │ ├── StockpileSeparatorTableCell.java
│ │ │ │ │ ├── StockpileShoppingListDialog.java
│ │ │ │ │ ├── StockpileTab.java
│ │ │ │ │ └── StockpileTableFormat.java
│ │ │ │ ├── tracker/
│ │ │ │ │ ├── JTrackerEditDialog.java
│ │ │ │ │ ├── QuickDate.java
│ │ │ │ │ ├── TrackerAssetFilterDialog.java
│ │ │ │ │ ├── TrackerDate.java
│ │ │ │ │ ├── TrackerNote.java
│ │ │ │ │ ├── TrackerSkillPointFilter.java
│ │ │ │ │ ├── TrackerSkillPointsFilterDialog.java
│ │ │ │ │ ├── TrackerSkillPointsFilterTableFormat.java
│ │ │ │ │ ├── TrackerTab.java
│ │ │ │ │ └── TrackerWalletFilterDialog.java
│ │ │ │ ├── transaction/
│ │ │ │ │ ├── JTransactionTable.java
│ │ │ │ │ ├── TransactionTab.java
│ │ │ │ │ └── TransactionTableFormat.java
│ │ │ │ ├── tree/
│ │ │ │ │ ├── JTreeTable.java
│ │ │ │ │ ├── TreeAsset.java
│ │ │ │ │ ├── TreeData.java
│ │ │ │ │ ├── TreeTab.java
│ │ │ │ │ └── TreeTableFormat.java
│ │ │ │ └── values/
│ │ │ │ ├── AssetValue.java
│ │ │ │ ├── DataSetCreator.java
│ │ │ │ ├── IskData.java
│ │ │ │ ├── JValueTable.java
│ │ │ │ ├── Value.java
│ │ │ │ ├── ValueRetroTab.java
│ │ │ │ ├── ValueTableFormat.java
│ │ │ │ └── ValueTableTab.java
│ │ │ ├── i18n/
│ │ │ │ ├── BundleServiceFactory.java
│ │ │ │ ├── DataColors.java
│ │ │ │ ├── DataModelAsset.java
│ │ │ │ ├── DataModelIndustryJob.java
│ │ │ │ ├── DataModelPriceDataSettings.java
│ │ │ │ ├── DialoguesAbout.java
│ │ │ │ ├── DialoguesAccount.java
│ │ │ │ ├── DialoguesExport.java
│ │ │ │ ├── DialoguesProfiles.java
│ │ │ │ ├── DialoguesSettings.java
│ │ │ │ ├── DialoguesStructure.java
│ │ │ │ ├── DialoguesUpdate.java
│ │ │ │ ├── General.java
│ │ │ │ ├── GuiFrame.java
│ │ │ │ ├── GuiShared.java
│ │ │ │ ├── TabsAgents.java
│ │ │ │ ├── TabsAssets.java
│ │ │ │ ├── TabsContracts.java
│ │ │ │ ├── TabsItems.java
│ │ │ │ ├── TabsJobs.java
│ │ │ │ ├── TabsJournal.java
│ │ │ │ ├── TabsLoadout.java
│ │ │ │ ├── TabsLoyaltyPoints.java
│ │ │ │ ├── TabsMaterials.java
│ │ │ │ ├── TabsMining.java
│ │ │ │ ├── TabsNpcStanding.java
│ │ │ │ ├── TabsOrders.java
│ │ │ │ ├── TabsOverview.java
│ │ │ │ ├── TabsPriceChanges.java
│ │ │ │ ├── TabsPriceHistory.java
│ │ │ │ ├── TabsReprocessed.java
│ │ │ │ ├── TabsRouting.java
│ │ │ │ ├── TabsSkills.java
│ │ │ │ ├── TabsSlots.java
│ │ │ │ ├── TabsStockpile.java
│ │ │ │ ├── TabsTracker.java
│ │ │ │ ├── TabsTransaction.java
│ │ │ │ ├── TabsTree.java
│ │ │ │ └── TabsValues.java
│ │ │ └── io/
│ │ │ ├── esi/
│ │ │ │ ├── AbstractEsiGetter.java
│ │ │ │ ├── AuthCodeListener.java
│ │ │ │ ├── EsiAccountBalanceGetter.java
│ │ │ │ ├── EsiAssetsGetter.java
│ │ │ │ ├── EsiAuth.java
│ │ │ │ ├── EsiBlueprintsGetter.java
│ │ │ │ ├── EsiCallbackURL.java
│ │ │ │ ├── EsiClonesGetter.java
│ │ │ │ ├── EsiContractItemsGetter.java
│ │ │ │ ├── EsiContractsGetter.java
│ │ │ │ ├── EsiConverter.java
│ │ │ │ ├── EsiDivisionsGetter.java
│ │ │ │ ├── EsiFactionWarfareGetter.java
│ │ │ │ ├── EsiIndustryJobsGetter.java
│ │ │ │ ├── EsiItemsGetter.java
│ │ │ │ ├── EsiJournalGetter.java
│ │ │ │ ├── EsiLocationsGetter.java
│ │ │ │ ├── EsiLoyaltyPointsGetter.java
│ │ │ │ ├── EsiManufacturingPrices.java
│ │ │ │ ├── EsiMarketOrdersGetter.java
│ │ │ │ ├── EsiMiningGetter.java
│ │ │ │ ├── EsiNameGetter.java
│ │ │ │ ├── EsiNpcStandingGetter.java
│ │ │ │ ├── EsiOwnerGetter.java
│ │ │ │ ├── EsiPlanetaryInteractionGetter.java
│ │ │ │ ├── EsiPublicMarketOrdersGetter.java
│ │ │ │ ├── EsiScopes.java
│ │ │ │ ├── EsiShipGetter.java
│ │ │ │ ├── EsiSkillGetter.java
│ │ │ │ ├── EsiStructuresGetter.java
│ │ │ │ ├── EsiTransactionsGetter.java
│ │ │ │ └── MicroServe.java
│ │ │ ├── local/
│ │ │ │ ├── AbstractBackup.java
│ │ │ │ ├── AbstractXmlReader.java
│ │ │ │ ├── AbstractXmlWriter.java
│ │ │ │ ├── AgentsReader.java
│ │ │ │ ├── AssetAddedReader.java
│ │ │ │ ├── AttributeGetters.java
│ │ │ │ ├── CitadelReader.java
│ │ │ │ ├── CitadelWriter.java
│ │ │ │ ├── CsvWriter.java
│ │ │ │ ├── EveFittingReader.java
│ │ │ │ ├── EveFittingWriter.java
│ │ │ │ ├── FileLock.java
│ │ │ │ ├── FlagsReader.java
│ │ │ │ ├── HtmlWriter.java
│ │ │ │ ├── ItemsReader.java
│ │ │ │ ├── ItemsWriter.java
│ │ │ │ ├── JumpsReader.java
│ │ │ │ ├── LocationsReader.java
│ │ │ │ ├── MarketLogReader.java
│ │ │ │ ├── NpcCorporationsReader.java
│ │ │ │ ├── ProfileFinder.java
│ │ │ │ ├── ProfileReader.java
│ │ │ │ ├── SettingsReader.java
│ │ │ │ ├── SettingsWriter.java
│ │ │ │ ├── SoundFinder.java
│ │ │ │ ├── SqlWriter.java
│ │ │ │ ├── StockpileReader.java
│ │ │ │ ├── StockpileWriter.java
│ │ │ │ ├── TrackerReader.java
│ │ │ │ ├── TrackerWriter.java
│ │ │ │ ├── XmlException.java
│ │ │ │ ├── profile/
│ │ │ │ │ ├── ProfileAccountBalances.java
│ │ │ │ │ ├── ProfileActiveShip.java
│ │ │ │ │ ├── ProfileAssetDivisions.java
│ │ │ │ │ ├── ProfileAssets.java
│ │ │ │ │ ├── ProfileBlueprints.java
│ │ │ │ │ ├── ProfileClones.java
│ │ │ │ │ ├── ProfileConnection.java
│ │ │ │ │ ├── ProfileConnectionData.java
│ │ │ │ │ ├── ProfileContracts.java
│ │ │ │ │ ├── ProfileDatabase.java
│ │ │ │ │ ├── ProfileIndustryJobs.java
│ │ │ │ │ ├── ProfileJournals.java
│ │ │ │ │ ├── ProfileLoyaltyPoints.java
│ │ │ │ │ ├── ProfileMarketOrders.java
│ │ │ │ │ ├── ProfileMining.java
│ │ │ │ │ ├── ProfileNpcStanding.java
│ │ │ │ │ ├── ProfileOwners.java
│ │ │ │ │ ├── ProfileSkills.java
│ │ │ │ │ ├── ProfileTable.java
│ │ │ │ │ ├── ProfileTransactions.java
│ │ │ │ │ └── ProfileWalletDivisions.java
│ │ │ │ ├── text/
│ │ │ │ │ ├── AbstractTextImport.java
│ │ │ │ │ ├── ImportEft.java
│ │ │ │ │ ├── ImportEveMultibuy.java
│ │ │ │ │ ├── ImportIskPerHour.java
│ │ │ │ │ ├── ImportShoppingList.java
│ │ │ │ │ └── TextImportType.java
│ │ │ │ └── update/
│ │ │ │ ├── LocalUpdate.java
│ │ │ │ ├── Update.java
│ │ │ │ └── updates/
│ │ │ │ └── Update1To2.java
│ │ │ ├── online/
│ │ │ │ ├── CitadelGetter.java
│ │ │ │ ├── DataGetter.java
│ │ │ │ ├── EveImageGetter.java
│ │ │ │ ├── EveRefGetter.java
│ │ │ │ ├── PriceDataGetter.java
│ │ │ │ ├── UpdateTaskInputStream.java
│ │ │ │ ├── Updater.java
│ │ │ │ └── ZkillboardPricesHistoryGetter.java
│ │ │ └── shared/
│ │ │ ├── AbstractGetter.java
│ │ │ ├── AccountAdder.java
│ │ │ ├── AccountAdderAdapter.java
│ │ │ ├── ApiIdConverter.java
│ │ │ ├── DataConverter.java
│ │ │ ├── DesktopUtil.java
│ │ │ ├── FileUtil.java
│ │ │ ├── FileUtilSimple.java
│ │ │ ├── RawConverter.java
│ │ │ ├── SafeConverter.java
│ │ │ └── ThreadWoker.java
│ │ └── resources/
│ │ ├── logback.xml
│ │ └── net/
│ │ └── nikr/
│ │ └── eve/
│ │ └── jeveasset/
│ │ └── i18n/
│ │ ├── DataColors.properties
│ │ ├── DataModelAsset.properties
│ │ ├── DataModelIndustryJob.properties
│ │ ├── DataModelPriceDataSettings.properties
│ │ ├── DialoguesAbout.properties
│ │ ├── DialoguesAccount.properties
│ │ ├── DialoguesExport.properties
│ │ ├── DialoguesProfiles.properties
│ │ ├── DialoguesSettings.properties
│ │ ├── DialoguesStructure.properties
│ │ ├── DialoguesUpdate.properties
│ │ ├── General.properties
│ │ ├── GuiFrame.properties
│ │ ├── GuiShared.properties
│ │ ├── TabsAgents.properties
│ │ ├── TabsAssets.properties
│ │ ├── TabsContracts.properties
│ │ ├── TabsItems.properties
│ │ ├── TabsJobs.properties
│ │ ├── TabsJournal.properties
│ │ ├── TabsLoadout.properties
│ │ ├── TabsLoyaltyPoints.properties
│ │ ├── TabsMaterials.properties
│ │ ├── TabsMining.properties
│ │ ├── TabsNpcStanding.properties
│ │ ├── TabsOrders.properties
│ │ ├── TabsOverview.properties
│ │ ├── TabsPriceChanges.properties
│ │ ├── TabsPriceHistory.properties
│ │ ├── TabsReprocessed.properties
│ │ ├── TabsRouting.properties
│ │ ├── TabsSkills.properties
│ │ ├── TabsSlots.properties
│ │ ├── TabsStockpile.properties
│ │ ├── TabsTracker.properties
│ │ ├── TabsTransaction.properties
│ │ ├── TabsTree.properties
│ │ └── TabsValues.properties
│ ├── site/
│ │ └── site.xml
│ └── test/
│ ├── java/
│ │ └── net/
│ │ └── nikr/
│ │ └── eve/
│ │ └── jeveasset/
│ │ ├── ProgramTest.java
│ │ ├── TestUtil.java
│ │ ├── data/
│ │ │ ├── profile/
│ │ │ │ └── StockpileIDsTest.java
│ │ │ ├── raw/
│ │ │ │ ├── LocationFlagTest.java
│ │ │ │ ├── RawAssetTest.java
│ │ │ │ ├── RawBlueprintTest.java
│ │ │ │ ├── RawCloneTest.java
│ │ │ │ ├── RawContractItemTest.java
│ │ │ │ ├── RawContractTest.java
│ │ │ │ ├── RawIndustryJobTest.java
│ │ │ │ ├── RawJournalTest.java
│ │ │ │ ├── RawLoyaltyPointsTest.java
│ │ │ │ ├── RawMarketOrderTest.java
│ │ │ │ ├── RawNpcStandingTest.java
│ │ │ │ ├── RawPublicMarketOrderTest.java
│ │ │ │ ├── RawSkillTest.java
│ │ │ │ ├── RawTransactionTest.java
│ │ │ │ └── RawUtil.java
│ │ │ ├── sde/
│ │ │ │ ├── ItemTest.java
│ │ │ │ └── StaticDataTest.java
│ │ │ └── settings/
│ │ │ ├── ColorThemeTest.java
│ │ │ ├── MarketPriceDataTest.java
│ │ │ ├── ModuleTest.java
│ │ │ ├── ReprocessSettingsTest.java
│ │ │ ├── SettingsTest.java
│ │ │ └── TrackerDataTest.java
│ │ ├── gui/
│ │ │ ├── images/
│ │ │ │ └── ImagesTest.java
│ │ │ ├── shared/
│ │ │ │ ├── FormatterTest.java
│ │ │ │ ├── components/
│ │ │ │ │ └── CheckBoxNodeTest.java
│ │ │ │ ├── filter/
│ │ │ │ │ ├── FilterExportTest.java
│ │ │ │ │ └── FilterMatcherTest.java
│ │ │ │ └── menu/
│ │ │ │ ├── ExpressionExceptionTest.java
│ │ │ │ ├── JMenuInfoTest.java
│ │ │ │ └── JMenuLookupOnlineTest.java
│ │ │ ├── sounds/
│ │ │ │ └── SoundsTest.java
│ │ │ └── tabs/
│ │ │ ├── TableFormatTest.java
│ │ │ ├── assets/
│ │ │ │ └── AssetAndTreeTableFormatTest.java
│ │ │ ├── orders/
│ │ │ │ └── MarketOrdersTabTest.java
│ │ │ ├── routing/
│ │ │ │ ├── TestEditableModel.java
│ │ │ │ ├── TestMoveJList.java
│ │ │ │ ├── TestRouting.java
│ │ │ │ └── mocks/
│ │ │ │ ├── FakeRoutingTab.java
│ │ │ │ └── RoutingMockProgram.java
│ │ │ ├── stockpile/
│ │ │ │ └── StockpileTest.java
│ │ │ └── values/
│ │ │ └── DataSetCreatorTest.java
│ │ ├── i18n/
│ │ │ └── TestI18N.java
│ │ ├── io/
│ │ │ ├── esi/
│ │ │ │ ├── EsiConverterTest.java
│ │ │ │ ├── EsiDeprecationOnlineTest.java
│ │ │ │ ├── EsiNameGetterOnlineTest.java
│ │ │ │ └── EsiScopesTest.java
│ │ │ ├── local/
│ │ │ │ ├── AssetAddedReaderTest.java
│ │ │ │ ├── BackupTest.java
│ │ │ │ ├── BackwardCompatibilitySettings.java
│ │ │ │ ├── FileLockSettings.java
│ │ │ │ ├── FileLockTest.java
│ │ │ │ ├── ItemFlagsTest.java
│ │ │ │ ├── ProfileReadWriteTest.java
│ │ │ │ ├── SettingsTest.java
│ │ │ │ ├── StockpileDataReadWriteTest.java
│ │ │ │ ├── TrackerDataTest.java
│ │ │ │ └── text/
│ │ │ │ ├── ImportEftTest.java
│ │ │ │ ├── ImportEveMultibuyTest.java
│ │ │ │ ├── ImportIskPerHourTest.java
│ │ │ │ └── ImportShoppingListTest.java
│ │ │ ├── online/
│ │ │ │ ├── EveRefGetterOnlineTest.java
│ │ │ │ ├── EveRefGetterTest.java
│ │ │ │ ├── PriceDataGetterOnlineTest.java
│ │ │ │ ├── ProxyTest.java
│ │ │ │ └── ZkillboardPricesHistoryGetterOnlineTest.java
│ │ │ └── shared/
│ │ │ ├── ApiIdConverterOnlineTest.java
│ │ │ ├── ApiIdConverterTest.java
│ │ │ ├── AssetsGetterTest.java
│ │ │ ├── ConverterTestOptions.java
│ │ │ ├── ConverterTestOptionsGetter.java
│ │ │ ├── ConverterTestUtil.java
│ │ │ ├── DataConverterTest.java
│ │ │ ├── ProfileDatabaseConverterTest.java
│ │ │ └── RawConverterTest.java
│ │ ├── lib/
│ │ │ └── LibTest.java
│ │ └── tests/
│ │ └── mocks/
│ │ ├── FakeProgram.java
│ │ ├── FakeProgress.java
│ │ ├── FakeSettings.java
│ │ └── OverwriteTest.java
│ └── resources/
│ ├── 740/
│ │ ├── stockpile_test_0.xml
│ │ ├── stockpile_test_1.xml
│ │ ├── stockpile_test_10.xml
│ │ ├── stockpile_test_11.xml
│ │ ├── stockpile_test_2.xml
│ │ ├── stockpile_test_3.xml
│ │ ├── stockpile_test_4.xml
│ │ ├── stockpile_test_5.xml
│ │ ├── stockpile_test_6.xml
│ │ ├── stockpile_test_7.xml
│ │ ├── stockpile_test_8.xml
│ │ └── stockpile_test_9.xml
│ ├── 750/
│ │ ├── stockpile_test_0.xml
│ │ ├── stockpile_test_1.xml
│ │ ├── stockpile_test_10.xml
│ │ ├── stockpile_test_11.xml
│ │ ├── stockpile_test_2.xml
│ │ ├── stockpile_test_3.xml
│ │ ├── stockpile_test_4.xml
│ │ ├── stockpile_test_5.xml
│ │ ├── stockpile_test_6.xml
│ │ ├── stockpile_test_7.xml
│ │ ├── stockpile_test_8.xml
│ │ └── stockpile_test_9.xml
│ ├── added.json
│ ├── data-1-0-0/
│ │ └── settings.xml
│ ├── data-1-1-0/
│ │ └── settings.xml
│ ├── data-1-2-0/
│ │ └── settings.xml
│ ├── data-1-2-1/
│ │ └── settings.xml
│ ├── data-1-2-2/
│ │ └── settings.xml
│ ├── data-1-2-3/
│ │ └── settings.xml
│ ├── data-1-3-0/
│ │ └── settings.xml
│ ├── data-1-4-0/
│ │ └── settings.xml
│ ├── data-1-4-1/
│ │ └── settings.xml
│ ├── data-1-5-0/
│ │ └── settings.xml
│ ├── data-1-6-0/
│ │ └── settings.xml
│ ├── data-1-6-1/
│ │ └── settings.xml
│ ├── data-1-6-2/
│ │ └── settings.xml
│ ├── data-1-6-3/
│ │ └── settings.xml
│ ├── data-1-6-4/
│ │ └── settings.xml
│ ├── data-1-7-0/
│ │ └── settings.xml
│ ├── data-1-7-1/
│ │ └── settings.xml
│ ├── data-1-7-2/
│ │ └── settings.xml
│ ├── data-1-7-3/
│ │ └── settings.xml
│ ├── data-1-8-0/
│ │ └── settings.xml
│ ├── data-1-8-1/
│ │ └── settings.xml
│ ├── data-1-9-0/
│ │ └── settings.xml
│ ├── data-1-9-1/
│ │ └── settings.xml
│ ├── data-1-9-2/
│ │ └── settings.xml
│ ├── data-2-0-0/
│ │ └── settings.xml
│ ├── data-2-1-0/
│ │ └── settings.xml
│ ├── data-2-1-1/
│ │ └── settings.xml
│ ├── data-2-1-2/
│ │ └── settings.xml
│ ├── data-2-2-0/
│ │ └── settings.xml
│ ├── data-2-3-0/
│ │ └── settings.xml
│ ├── data-2-4-0/
│ │ └── settings.xml
│ ├── data-2-5-0/
│ │ └── settings.xml
│ ├── data-2-6-0/
│ │ └── settings.xml
│ ├── data-2-7-0/
│ │ └── settings.xml
│ ├── data-fail/
│ │ └── settings.xml
│ ├── everefblueprint.json
│ ├── evereftype.json
│ ├── tracker_empty.json
│ ├── tracker_filters.json
│ └── tracker_total.json
└── tools/
├── bugs/
│ ├── conn.php
│ ├── index.php
│ ├── jeveasset.sql
│ └── submit.php
├── citadel/
│ └── index.php
├── izpack/
│ ├── ProcessPanel.Spec.xml
│ ├── install.xml
│ └── izpack-util.jar
├── jarfile.properties
├── jmemory.jar
├── packagemanager.properties
└── update/
├── .htaccess
├── github.update
└── list.php
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
name: "CodeQL"
on:
push:
pull_request:
schedule:
- cron: '39 17 * * 1'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'java' ]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Cache
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ matrix.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ matrix.os }}-maven-
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
- name: Autobuild
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
================================================
FILE: .github/workflows/esi.yml
================================================
name: Esi
on:
push:
schedule:
# Daily @ 8:44
- cron: '44 8 * * *'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Cache
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: build-${{ hashFiles('**/pom.xml') }}
restore-keys: |
build-
- name: JDK
uses: actions/setup-java@v2
with:
distribution: 'temurin'
java-version: 8
- name: Build with Maven
env:
SSO_CLIENT_ID: ${{ secrets.SSO_CLIENT_ID }}
SSO_REFRESH_TOKEN: ${{ secrets.SSO_REFRESH_TOKEN }}
run: mvn -Dtest=EsiDeprecationOnlineTest test
- name: Send discord notification for new release
if: failure()
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@cf9b729d74ae8cd2de75a32a02594d4d4a1d4a77
with:
args: ':exclamation: eve-esi library needs to be updated'
================================================
FILE: .github/workflows/tests.yml
================================================
name: Tests
on: [push, pull_request]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macOS-latest, ubuntu-latest, windows-latest]
java: [ 8, 11, 17 ]
name: ${{ matrix.os }} (Java ${{ matrix.java }})
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Cache
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ matrix.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ matrix.os }}-maven-
- name: JDK
uses: actions/setup-java@v2
with:
distribution: 'temurin'
java-version: ${{ matrix.java }}
- name: Build with Maven
env:
SSO_CLIENT_ID: ${{ secrets.SSO_CLIENT_ID }}
SSO_REFRESH_TOKEN: ${{ secrets.SSO_REFRESH_TOKEN }}
run: mvn -B package --file pom.xml -P skip-online-tests
================================================
FILE: .gitignore
================================================
.idea
.vscode
target
nbactions.xml
jeveassets.log
nbproject
nb-configuration.xml
nbactions*.xml
jeveassets1.log
================================================
FILE: CONTRIBUTING.md
================================================
# Git Checkout #
We usually work in two branches:
* New Features:
https://github.com/GoldenGnu/jeveassets/tree/develop
* Bug Fixes:
https://github.com/GoldenGnu/jeveassets/tree/main
It's **strongly** advised to make a new branch for each PR in your own fork
# Git Clone #
https://github.com/GoldenGnu/jeveassets.git
# Compile #
We compile with the latest version of Oracle Java SE 8 (Yes, still using Java 8).
## Netbeans ##
Open the project and compile (F11)
## Other IDEs ##
I only use NetBeans. Feel free to make a PR with instructions
# Coding Guidelines #
* We use tab and not space. Be sure to disable "expand tabs to space" in your IDE.
* Swing JComponent variable names should have leading "j". Ex.: `jMyTable`
* No other variable names should use [Systems Hungarian](https://en.wikipedia.org/wiki/Hungarian_notation)
# Contribute #
We are looking for (in random order):
* Documentation
* Java Programmers
* Dedicated Testers
* Translators
If you want to join the project contract `goldengnu` on the [jEveAssets Discord server](https://discord.gg/8kYZvbM) (PMs welcome).
================================================
FILE: changelog.txt
================================================
######## #####
######## #######
### ### ###
# ######## # # #### ######### #### #### #### ##### ####
######## # # # ######### # # # # #
# ### # # #### ### ### #### #### #### # ####
# ######## #### # ### ### # # # # #
# ######## ## #### ### ### #### #### #### # ####
#
### #### # # #### # # #### #### # #### ####
# # # # # ## # # # # # # #
# #### #### #### # ## #### # # # # ##
# # # # # # ## # # # # # # # #
#### # # # # # # #### #### #### #### ####
________________________________________________________________________________
_8.1.2__________________________________________________________________________
Bug Fixes:
-Stockpile locations was empty (issue #572)
________________________________________________________________________________
_8.1.1__________________________________________________________________________
Bug Fixes:
-Bad update logic for the industry jobs time left column
-Duplicate implants in the assets tool
________________________________________________________________________________
_8.1.0__________________________________________________________________________
New Features:
-Added tree map to the assets and overview tools (by Ansirane Solette)
-Add journal presets and chart (by Ansirane Solette)
-Added new loyalty points tool (issue #48)
-Added new npc standing tool (characters and corporations)
-Added new skill plans tool with import functionality (by WildGear)
-Added new agents tool
-Added shopping list button to the group bar in the table
-Allow adding multiple filters from the same column at once
-Save current sorting
-Added jump clones to assets (issue #39)
-Added clones group in the location tree
-Added avoid filters to the jump columns
-Added eve market browser to the lookup menu
-Added jita space to the lookup menu
-Added eveconomy to the lookup menu
-Added Quantum Anomaly loyalty points store to the lookup menu
-Added time left column to the industry jobs tool
-Added option to open eve gatecamp check when setting in-game route
-Lazy initialization of tools (optional, on by default)
Changed:
-Use " to escape SQL identifiers (instead of `)
-Save html and sql text files as UTF-8
-Removed lazy blacksmith from the lookup menu
Bug Fixes:
-Refresh token can be null (after character transfers) (issue #570)
-Workaround for esi contract items rate limit
-AssetsToolSettingsPanel always trigger full update
-Repaint filter panel on color scheme changes
-Mining export never worked
-Unable to load column filter in the reprocessed and price changes tools
-Fixed duplicates in skills
-Routing start system didn't work with stations
-EditableListModel had bad logic
-Adding subpiles didn't update the stockpile items
-Stockpile zero of zero shows red (issue #553)
-Slots statusbar manufacturing max had the wrong tooltip
-SQL export should use NULL for null values (issue #558)
Code:
-Updated eve-esi library to version 7.0.0 (2025-09-30)
-Updated pricing library to version 3.1.2 (updated janice locations)
________________________________________________________________________________
_8.0.3__________________________________________________________________________
New Features:
-Added eve market browser to the lookup menu
-Added jita space to the lookup menu
Bug Fixes:
-Price update would sometimes fail due to a rounding error
-Add support for global plex market region to fuzzwork price source
-Added global plex market region support to outbid
-Duplicates in account balances (BugID: 1323)
________________________________________________________________________________
_8.0.2__________________________________________________________________________
Bug Fixes:
-Static files should not be file locked (Issue #528)
-Handle when os locks are not supported (Issue #528)
-Ignore duplicates in the skills table (BugId: 1315)
-Outbid could have the wrong color for types in multiple regions
________________________________________________________________________________
_8.0.1__________________________________________________________________________
New Features:
-Added OS file locks (may help prevent errors when syncing data to the cloud)
Bug Fixes:
-Fixed CtD because of duplicated assets and mining logs
-Fixed CtD due to empty tables (users will need to restore a backup)
-Archived industry jobs now count as done (again)
Code:
-Add 30 seconds delay to esi cache expiry to avoid stale responses
-Ensure crash on OutOfMemoryError when updating
-Moved clones and clone implants to their own table
________________________________________________________________________________
_8.0.0__________________________________________________________________________
New Features:
-Import routes from system names/ids in routing tool (Issue #475)
-Moved stockpile and reprocessing import format selecting to the import dialog
-Save profile data in SQLite
-Include plugged implants in assets and tracker (Issue #124)
-Automatic naming for loadout EFT export (Issue #471)
-Added dotlan lookup link to system on region map
-Added contract count to the statusbar (Issue #513)
Bug Fixes:
-Dotlan constellation lookup didn't replace space
-Blueprint runs rounding did not match fuzzwork and IPH
-Fixed how flags are handled in the tracker edit dialog
-Tracker assets containers not in the correct corp hangar division (Issue #519)
Code:
-Added email to user agent (thanks to the ccp esi team for making this matter!)
________________________________________________________________________________
_7.9.4__________________________________________________________________________
Bug Fixes:
-CtD in the stockpile tool (NPE)
-CtD when sorting columns (NPE/ISE)
________________________________________________________________________________
_7.9.3__________________________________________________________________________
Bug Fixes:
-Loadout eft export doesn't handle charges (Issue #498) [Tsuro Tsero]
-Made string columns sorting case insensitive (Issue #506)
-Importing tracker data replaced existing data
-Made stockpile match all differentiate between bpc and runs
-Stockpile shopping list counted own items double if also in subpile
Code:
-Optimized JCustomFileChooser (reduced startup time)
-Update eve-esi to 5.0.0 (removed esi bookmarks)
-Updated logback to 1.3.15
-Updated slf4j to 2.0.16
________________________________________________________________________________
_7.9.2__________________________________________________________________________
Bug Fixes:
-Stockpiles collapsing after adding item (Issue #497)
Code:
-Optimization of FilterMatcher (Optional, on by default)
________________________________________________________________________________
_7.9.1__________________________________________________________________________
Bug Fixes:
-Added contract locations to my stockpile locations
-Stockpile my locations contained delivered industry jobs locations
-Corporation contract assets owner is now an option: char/corp/both (Issue #476)
-Changed http to https in multiple places (contributed by Salartarium)
-Reprocessed grand total should never have a color
-Reprocessed value and color box was wrong
-Mining graph/tracker owners list is not sorted (Issue #491)
-Tracker assets location filter others node didn't work (Issue #485)
-Tracker add new locations selected is never saved (Issue#488)
-Remember what screen to open on (Issue #462)
-noformula and nojumps cli arguments not working (Issue #492)
-Fixed everef lookup to point to the correct url
-Stockpile groups behave incorrectly with filters (Issue #484)
-Ensure stockpile cell is visible after being expanded
-Industry jobs assets use the wrong location
-Ensure reprocess settings are valid
-Flagstring attribute was never saved/loaded for assets and blueprints
-Expired contracts are not included in tracker/assets (Issue #473)
-Stockpile industry copy jobs now output both BPCs and Runs (Issue #482)
-Fixed a typo (Issue #479)
-Delivered industry jobs was included in assets and stockpiles (Issue #480)
-Stockpile target column truncation (Issue #467)
-Price history use tick scale of selected items (Issue #466)
-Contract/Industry jobs assets was not updated on status change by users
Changed:
-Reduced throughput for public market orders to 100
-Removed contract status expired and added archived
Code:
-Minor optimization of the stockpile tool
-Updated sqlite to 3.41.2.2
-Updated logback to 1.2.13
-Updated prices library to 3.1.1 (Issue #469)
-Updated eve-esi library to 4.9.0
________________________________________________________________________________
_7.9.0__________________________________________________________________________
New Features:
-Keep original name when cloning stockpiles (contributed by Ed Thelleres)
-Show/Hide container ItemID in the Assets and Tree tools
-Lock tool tabs
-Stockpile can now hide the subpile tree
-Play sound when outbid data can be updated again
-Stockpiles shopping list CSV/Spreadsheet format
-Added TypeID column to the materials tool
-Added Tags column to the journal tool
-Added Tags column to the transactions tool
-Stockpile matching/contains all for assets
-Added commodity category to the materials tool
-Added corporation wallet division 1-7 columns to the isk tool
-Added price changes tool
-Added date values to formula columns
-Save industry jobs history (optional, on by default)
-Get missing item data from EveRef (data not in ESI)
-Added packaged volume column to the assets and tree tools
-Added link to jEveAssets discord server
Bug Fixes:
-Industry Jobs blueprints show as output material
-Stockpile group editing would sometimes lead to visual artifacts
-Stockpile target column sometimes truncate editable numbers
-Overflow in Formula/Jumps/Tags menus
-Lookup menu Eve Tycoon used the wrong link
-Fixed reactions calculations (contributed by Ed Thelleres)
-Subpile count in the stockpile shopping list was always zero
-Tags was bold on first render
-CtD when importing stockpile text into new/rename stockpile
-CtD in the stockpile tool (BugID 1074 & 1076)
Changed:
-Removed EveMarketer from the lookup menu
-Replaced lazy-blacksmith.space with lzb.eveskillboard.com in lookup menu
-Sort stockpile shopping list by name
-Improved account import usability
Code:
-Update multiple missing items at the same time
________________________________________________________________________________
_7.8.1__________________________________________________________________________
Bug Fixes:
-Removed outbid auto-update due to impact on esi
-Added advanced contracting to the slots tool (Reported by MagnarM)
________________________________________________________________________________
_7.8.0__________________________________________________________________________
New Features:
-Rename Stockpile Groups (Issue #379)
-Group multiple stockpiles (Issue #377)
-Delete multiple stockpiles (Issue #377)
-Added income/expenditure/total to the journal statusbar (Issue #17)
-Import systems to the routing tool (Issue #208)
-Sorting contract columns now sort the contract groups too (Issue #374)
-Added ore/ice/gas to the materials tool (Issue #391)
-Made each group optional in the materials tool (Issue #391)
-Added reprocessed/manufacturing columns to the contracts tool (Issue #412)
-Import eve fitting xml to stockpiles (Issue #382)
-Added output volume column to the industry jobs tool (Issue #418)
-Different color for orders outbid by your own orders (Issue #416)
-Added option to ignore multiplier for stockpile items (Issue #411)
-Added owned column to industry jobs/market orders/contracts
Bug Fixes:
-Update table cell on stockpile delete
-Reprocessed count/account name/stockpile multiplier require enter (Issue #410)
-Stockpile menu wasn't updating on stockpile rename
-Added expired status to contracts (Issue #415)
-PB materials added to stockpiles are rounded up (Issue #413)
Changed:
-Removed evemarketer.com API as a market price source
Code:
-Added fail-safe for endless outbid update loop on error
________________________________________________________________________________
_7.7.0__________________________________________________________________________
New Features:
-Added corporation mining ledger (Issue #371)
-Added wallet division column to the market orders tool (Issue #375)
-Added completed by column to the industry jobs tool (Issue #389)
-Allow users to add their own mp3 files for sound alerts (Issue #378)
-Manufacturing price column to assets/tree/items/market orders (Issue #138)
-Made the stockpile dialog for adding manufacturing materials more detailed
-Retry invalid accounts from the account manager
-Added options for more visible chart colors (Issue #387 & #404)
-Added tooltips for filter buttons
Bug Fixes:
-Stockpile total for transaction and contract columns showed wrong value
-Ensure adding to the reprocessed tool is always great than zero
-Industry jobs default filters didn't include cancelled/reverted (Issue #399)
-Stockpile menu could overflow (Issue #381)
-Shopping list and subpiles didn't work with "matching all" (Issue #403)
Changed:
-Made it more obvious that reprocessed count is editable
-Made it more obvious that stockpile multiplier and target cells are editable
-Removed evepraisal from the lookup menu
Code:
-Moved reprocessed price to the item class (Issue #373)
-Changed audio format from wave to mp3 (Issue #378)
________________________________________________________________________________
_7.6.2__________________________________________________________________________
Bug Fixes:
-Corporation accounts did not work
-Price History remained empty after adding items
-Tracker Show icon was not correct on startup
-Mining Graph showed wrong values with multiple mining characters
Code:
-Updated eve-esi to 4.8.1
________________________________________________________________________________
_7.6.1__________________________________________________________________________
Bug Fixes:
-Mining Graph entries was not sorted by date
________________________________________________________________________________
_7.6.0__________________________________________________________________________
New Features:
-Added character mining ledger (graph and log) (Issue #20)
-Added a new tool with character skills (Issue #345)
-Added stockpile groups (issue #321)
-Stockpile import now have BPO/PBC/Runs/Materials options (issue #357)
-Use item count when add to stockpiles (contributed by Boran Lordsworth)
-Added volume packaged column to the items tool
-Allowed subpile total rows to be column sorted (issue #352)
-Added slot type column to the assets/tree/stockpile/items tools (Issue #89)
-Added charge size column to the assets/tree/stockpile/items tools (Issue #89)
-Play sound when industry jobs are completed. Off by default (Issue #293)
-Play sound when outbid data is updated. Off by default (Issue #287)
-Added next x hours/days date filters (Issue #246)
-Chart date labels are now scaled according to the shown range (Issue #356)
Bug Fixes:
-Fixed buttons shapes in separator tables with the FlatLAF
-Editing accounts did not update the scopes
Changed:
-Market orders and transaction volume columns now use packaged volume
________________________________________________________________________________
_7.5.0__________________________________________________________________________
New Features:
-Streamlined stockpile import and added import into stockpile (Issue #228)
-Including sub items are now optional for stockpile flag filters (Issue #358)
-Added SellMin/BuyMax columns to the stockpile tool (Issue #365)
-Added Volume/SellMin/BuyMax columns to the market orders tool (Issue #365 #364)
-Added journal menu for finding related transactions/contracts/industry jobs
-Added context column to the journal
-Added Transaction ID column to the Transactions tool
-Added Order ID column to the Market Orders tool
-Added Job ID column to the Industry Jobs tool
Bug Fixes:
-Fixed a bug in include sub container filter (always included subs)
-Ignore leading/trailing white space on stockpile text import
-Stockpile contracts match all wasn't working (Issue #266)
-Fix for "Contract not public" and "Contract not found" errors (Issue #360)
-Fixed concurrency problem in ApiIdConverter.getItemUpdate()
Changed:
-Hide zeroes that are stand-in for no data on subpiles rows in stockpile tool
Code:
-Switch to using the affiliation and names endpoints
-Removed the contract price API (Thanks to Rihan for hosting it for so long)
________________________________________________________________________________
_7.4.0__________________________________________________________________________
New Features:
-Added evemissioneer.com to the lookup menu (Issue #351)
-Added option only including contracts with all the stockpile items (Issue #266)
-Blueprint copying output as assets (Optional, off by default)
-Set status for Contracts and Market Orders no longer in ESI (Issue #349)
-Added Stockpile filter for industry job duration (Issue #348)
-Added volume column to the Transaction tool (Issue #350)
-Added Completed Date and Paused Date columns to the Industry Jobs tool
-Added import to the reprocessing tool (Issue #335)
-Display total minerals (minerals*count) in the reprocessed tool (Issue #302)
-Added avg/count/max/min of selected numeric cells/column to the table menu
-Added market orders and contracts to the slots tool (Issue #347)
-Added Availability column to the contracts tool (Public or Private)
Changed:
-Improved the ToolTip for the Transaction Margin columns
-Only include industry jobs if not delivered to assets yet
Bug Fixes:
-Handle space and comma thousands separators when editing in tables (Issue #344)
-Added sum table menu tooltip (was null)
-Fixed table header not resizing on sorting (if the table didn't change)
-Fixed StatusPanel icon labels having the copy tooltip + handle dynamic icons
-Fixed Stockpile text import/export
-Do not try to update public market orders with invalid accounts
-Exclude invalid accounts from structure updates
________________________________________________________________________________
_7.3.2__________________________________________________________________________
Bug Fixes:
-Fixed NPE crash in FilterManager (BugID: 1028, 1029)
________________________________________________________________________________
_7.3.1__________________________________________________________________________
Bug Fixes:
-Fixed NPE in MyIndustryJob from MyBlueprint (Issue #342)
________________________________________________________________________________
_7.3.0__________________________________________________________________________
New Features:
-Added filters to the Overview Tool (Issue #336)
-Added Janice as a price source (Issue #328)
-Price History (Issue #76)
-Added category column to stockpile table (contributed by Lazaren)
-Added various values to the industry slots tool statusbar (Issue #337)
-Added various values to the industry slots tool table popup menu (Issue #337)
-Added various values to the contracts tool statusbar (Issue #333)
-Added various values to the contracts tool table popup menu (Issue #132)
-You can now copy statusbar values by clicking on them
-Added tool tips explain you can click to copy to the info menu and statusbar
-Added Context Type and Context ID columns to the Journal tool
-Added ContractID and RecordID columns to the Contracts Tool
-Added Market Value and Market Price columns to the Contracts Tool
-Added ItemID/Runs/ME/TE columns to the Contracts Tool (only public contracts)
-The tracker tool now have prices for blueprints in public contracts
-Added placeholder examples for filter import (Issue #282)
-Improved market details character selection in the Stockpile tool (Issue #307)
-Added mnemonic to the main menu
-Added available label to stockpile separator row (Issue #341)
Bug Fixes:
-Ignore profiles with invalid names
-Include private structures in the contract appraisal settings reset on save
-Refining equipment option did not accept decimal values (Issue #340)
Changed:
-Made the business tool menu a bit nicer
-Added warning message when hitting the maximum of 25000 blueprints
-Better warning for orders in unknown locations on outbid update (Issue #327)
-Show warning when Nahimic Overlay is detected (Issue #313)
Code:
-Update eve-esi to 4.7.0
-Optimized table main menu to only be updated before showing
-Updates from setting changes now only update what is needed (Issue #334)
-Added info level to UpdateTask (Used by "NOT ALLOWED YET")
-Replaced OSXadapter with FlatDesktop from flatlaf (Issue #329)
________________________________________________________________________________
_7.2.1__________________________________________________________________________
Bug Fixes:
-Stockpile did not work with BPCs and runs
________________________________________________________________________________
_7.2.0__________________________________________________________________________
New Features:
-Added configurable colors to the industry jobs activity column
-Adding account automatically update existing account authorization (Issue #306)
-Separated ore and scrapmetal reprocessing calculations/settings (Issue #312)
-Added buttons to open the online manual (Stockpile/Table Filters/Settings)
-Added Eve Tycoon to the lookup menu
Bug Fixes:
-CLI -droptable -createtable -extended are always true (Issue #310)
-CLI tableName is always a empty string, DROP TABLE IF EXISTS `` (Issue #310)
-If sqlTableName is set in the GUI, It's not used for CLI export (Issue #310)
-Fixed issues with CLI updates for multiple profiles
-Fixed delay between starting update and the update window showing (Issue #319)
-Fixed public market orders update progress finishing at 80% progress
-Fixed Industry Jobs having the wrong default filters (was Transactions filters)
-Fixed CLI export logging
-Fixed the current filter never being displayed as empty
-Overview export using current view (should use all)
-Fixed an old bug where Settings dialog would resize after being shown
-Fixed painting outside the EDT in JMainTab/MarketOrdersTab/RoutingTab
Changed:
-Improved the reprocessing settings GUI
-Slightly better CLI help message
-The Stockpile dialog now better convey that selecting an include is required
-Show warning before updating outbid data with orders in unknown locations
-Made most toolbars more compressible and normalized icon buttons width
-Changed help menu to point to the wiki and wiki's feedback and help
Code:
-Optimized stockpile New/Clone/Delete/Import/Hide/Show
-Optimized subpile updates in the stockpile tool
-Upgraded maven plugins to make it work with Java 17 (contributed by Burberius)
-Updated all the wiki links to the new site: https://wiki.jeveassets.org
-Refactored ProfileManager/Profile/ProfileWriter/ProfileReader to be more OOP
-Added test to ensure dev build is always off (false)
-Ensure profile names are never duplicated
-Better error logging for ESI errors
________________________________________________________________________________
_7.1.1__________________________________________________________________________
Bug Fixes:
-Unable to export default filters
-Can not reset columns
-Fixed number formatting for CSV and HTML export
-Exporting from the GUI did not use the filter and column options
-Fixed export and filtering for formula and jump columns
-Added option to exclude formula and jump columns from the CLI
-Force valid separator/column options when exporting from the GUI
________________________________________________________________________________
_7.1.0__________________________________________________________________________
New Features:
-Added CLI for exporting table data (Issue #270)
-Tool tabs can now be rearranged by dragging the tabs (issue #298)
-Tool tabs can now be reopen with [ctrl|command] + [shift] + t (issue #298)
-Make a Add button in the Reprocessed tool (Issue #297 - contributed by Inoruuk)
-Added Output Name column to the industry jobs tool (Issue #294)
-Hide stockpile from stockpile menu (Issue #300)
Changed:
-Change character/corporation selection in the AccountImportDialog to a ComboBox
-Allow manually enabling the eve.nikr.net account import workaround
Code:
-Updated slf4j library to 1.7.36
-Updated logback library to 1.2.10
-Updated jfreechart library to 1.5.3
-Updated LGoodDatePicker library to 11.2.1
-Updated sqlite-jdbc library to 3.36.0.3
-Updated EvalEx library to 2.7
Bug Fixes:
-Updatable didn't check for skill updates
-ItemsWriter saved base price as double, ItemsReader expected long
-Made SingleInstance handle headless mode
-Possible fix for ClassCastException in StockpileItemDialog (BugId: 995)
-Possible fix for publicMarketOrders cache time being incorrect
________________________________________________________________________________
_7.0.0__________________________________________________________________________
New Features:
-Added support for more multibuy formats (contributed by madetara)
-Added 'Added date' columns to Transactions/Journal tool (Issue #269)
-Highlight recent changes in the Market Orders tool (Issue #265)
-Highlight new items in Assets/Journal/Transactions tool (Issue #269)
-Save contract history (optional, on be default) (Issue #258)
-Table menu: Select ship in the Fitting Tool from Assets/Tree Tools (Issue #264)
-Allow renaming assets in the Tree tool
-Added Required and Owned options for the Stockpiles shopping list (Issue #235)
-Added placeholder examples for Stockpile imports (Issue #276)
-Added Type Name column to Assets/Tree tools (Hidden by default, issue #181)
-Added Item Name column to Assets/Tree tools (Hidden by default, issue #181)
-Made Market Details column's button clickable with the space key (Issue #137)
-Added Market Details column to the Stockpile tool (Issue #256)
-Added Average Transaction Price column to the Stockpile tool (Issue #256)
-Add Job Cost column to Industry Jobs (Issue #284, contributed by Kaylee Syntax)
Changed:
-Use AutoCompleteSupport Filter Mode Contains (Issue #274)
-Show critical error messages always on top
Code:
-Updated FlatLaf library to 1.6.4
-Updated eve-esi library to 4.6.1
-Fixed lgtm.com alerts (issue #275)
Bug Fixes:
-Fixed a case where the changed theme colors was not applied
-Fixed changing color settings triggering an eventList update when not needed
-Fixed wrong class types in TableFormats (BugId: 969, 971, 972, 979 and more)
-Fixed tree table sorting columns really slowly
-Fixed settings being saved while columns was being moved
-Fixed NPE in XPDefaultRenderer (JDK-6429812, BugId: 959, Issue #279)
-Fixed system look and feel being listed twice in the color settings
-CDE/Motif did not have windows Copy/Paste/Cut/Select All shortcuts
-Fixed Market Detail column's button rendering on various look and feels
-Fixed NPE in FlatTitlePane (BugId: 980, Issue #281)
-Journal is missing entries (Issue #218, Fixed in ESI by CCP! <3)
-Possible fix for CtD on when setting a new price (Issue #277)
-Fixed CtD before warning for "in zip file" and "library missing" was shown
-Fixed jEveAssets losing focus when loading/creating profiles
-Fixed meta and tech level for esi updated items
-Added missing read lock for FilterList when updating statusbar
________________________________________________________________________________
_6.9.6__________________________________________________________________________
Bug Fixes:
-Possible fix for CtD (BugID: 973, 974, 975, 976, 977, 978)
Changed:
-Ships are now included in their own totals in the Tree Tool (Issue #271)
________________________________________________________________________________
_6.9.5__________________________________________________________________________
Bug Fixes:
-Removed incorrect column tooltip for formula columns
-Formula columns did not work with infinity decimals (1.333) AGAIN! (Issue #268)
-Exporting table data used disabled filters resulting in incomplete output
Code:
-Updated eve-esi library to version 4.6.0 (fixing account update)
________________________________________________________________________________
_6.9.4__________________________________________________________________________
Bug Fixes:
-Fixed tree tool totals (parent items, statusbar, table menu)
-Fixed Formula columns not working with results like 1.333...
-Fixed price update failing (now fail when 25% of all price are zero, was 10%)
-Table menu sum did not work correct for values between 0.0 and 1.0 (Ex: 0.14)
Code:
-Better handling of error throwables during update
-Optimized Tree tool collapse and expand all
-Hopefully fixed very slow sorting with many active filters in the Tree tool
________________________________________________________________________________
_6.9.3__________________________________________________________________________
Bug Fixes:
-Formula column precision was set to 7 (now use unlimited)
-Tree tool was missing icons for Planetary Industry
-Stockpile total row did not work correctly with formula columns (Issue #261)
-Fixed ArithmeticException in EnumTableFormatAdaptor (BugId: 951, 952)
Code:
-Updated eve-esi to version 4.5.0
________________________________________________________________________________
_6.9.2__________________________________________________________________________
Bug Fixes:
-NullPointerException in ExportDialog (BugId: 948, 949)
-Fixed Formula columns export
-Export column selection list not enabled when selected after restart
________________________________________________________________________________
_6.9.1__________________________________________________________________________
Changed:
-Removed zKillboard/HammerTime structure update (Both are dead)
Code:
-Simplified SettingsUpdateListener calls
Bug Fixes:
-NPE in ColumnManager (BugId: 941, 947)
-Filter logic is not updated when switching between numeric/string/date columns
-Fixed IllegalArgumentException in JFormulaDialog (BugId: 944)
-Loading filter with formula/jump column crashes jEveAssets (BugId: 943, 942)
-Restoring current filter failed for filters with formula/jump columns
-Fixed StringIndexOutOfBoundsException in JFormulaDialog (BugID: 946)
________________________________________________________________________________
_6.9.0__________________________________________________________________________
New Features:
-As complete a restore at relaunch as possible (Issue #216) [Dultas]
-Formula Columns (Issue #45)
-Added evecookbook.com to the lookup menu
-Added locationID column to the Assets tool (Issue #257)
Changed:
-Made Midpoint price fallback on a single price if one of the prices is zero
Code:
-Updated eve-esi library to version 4.4.0
Bug Fixes:
-NPE from IndustryJob.getProductTypeID() (BugID: 901, 921)
-Fix non extended sql inserts not working [Dultas]
-SQL export doubles now use 2 decimals (Issue #252) [Dultas]
-Active ships 2nd+ level children didn't have the right locationID
-Partial fix for TaskDialog never being garbage collected
________________________________________________________________________________
_6.8.0__________________________________________________________________________
New Features:
-Added current location and ship columns to Industry Slot and Isk (by Dutlas)
-Added system and constellation columns to all tools with a location column
-Added constellation view to Overview
-Added constellations to zKillboard and Dotlan location lookup
-Added constellations to Stockpile locations
Bug Fixes:
-Fix spelling error in Tracker delete-item warning (by jhmartin)
-NPE in AssetAddedData.getAdd() (BugID: 893)
-Outbid did not handle equal prices
-Market order outbid was never being cleared of old entries (Issue #239)
-Fixed Transactions Profit % column giving the wrong value
-Better handle when price APIs return zero prices
-Industry Slots won't load filters (Issue #242)
-New columns at the end of the TableFormat was added at the wrong index
-Ensured Copy, Paste, Cut, and Select All shortcuts works on a Mac (Issue #243)
-Fixed corporation transactions wallet division incorrectly showing division 1
________________________________________________________________________________
_6.7.1__________________________________________________________________________
Bug Fixes:
-Crash when copying from tables (BugID: 883, 884, 888, 889)
-Possible fix for AIOOBE crash in StockpileDialog (BugID: 887)
-Deleting a stockpile did not work correctly for subpiles
-Subpiles was missing items (Thanks to Lak Moore)
________________________________________________________________________________
_6.7.0__________________________________________________________________________
New Features:
-Add Blueprint materials (with ME) as Stockpile items (Issue #182)
-Changeable color for completed/delivered Industry Jobs (Issue #190)
-Added Dark Nimbus look and feel
-Added toggle all for Tracker skill points filter dialog
-Include hidden stockpiles in Export (Issue #211)
-Added Outbid delta column to the Market Order tool (Issue #204)
-Added Group column to the Market Orders tool (Issue #220)
-Added Market Price/Margin/Profit columns to the Market Orders tool (Issue #222)
-Highlight Market Orders prior to expiring (Issue #219)
-Highlight Market Orders with remaining quantity below x percent (Issue #225)
Changed:
-Better tool tip for the Market detail column
-Added tool tip label for the market orders JComboBoxes
-Stockpile "my locations" no longer include closed market order locations
-Routing start system is now select via an auto completed JComboBox (Issue #209)
-Export DATETIME instead of DATE in SQL Export (Issue #215)
-Added thousand separator to HTML export numbers
Code:
-Updated eve-esi to 4.2.0
-Made Lookup menu links testable
Bug Fixes:
-Fixed the width for Tracker skill points filter dialog
-NumberValue sub classes not respecting the copy decimal separator (Issue #195)
-Better look and feel preview (Now use previewed LAF height)
-Include "jEveAssets" in error and update message dialogs
-All column filters could not be saved/loaded
-Overview Tool did not display any data when opened on startup (work from menu)
-Workaround JTextField with backgrounds on Nimbus look and feel
-Prevent updating outbid when there is no active orders
-MarketLog import did not use the latest outbid data
-Fixed Overview table menu not work with groups
-Update Khon.Space to Lazy-Blacksmith (Issue #217)
________________________________________________________________________________
_6.6.3__________________________________________________________________________
New Features:
-Added option to change decimal separator used when copying (Issue #195)
-Greatly improved the GUI on the Nimbus and GTK+ (Linux) look and feels
-Improved the GUI on all look and feels
Changed:
-Better error message for invalid authorization (JWT is null) (Issue #193)
-Better warning message for "waiting for cache to expire"
-Stockpile include now start blank (forcing discovery of the options)
Code:
-Updated eve-esi to 4.1.0
-Updated all 3rd party libraries to the latest version
Bug Fixes:
-Skill point filter was always adding 5m (now it just enforce 5m minimum)
-NPE in FilterMatcher (BugId: 850)
-Components size was not adjusted to LAF
-Missing constructor for ContractPriceItem on Java 14 (BugId: 854)
-Fixed default market orders table sort order
-Incorrectly mark some assets and stockpile items as blueprints
-Save/load invalid account state
-Only run Faction Warfare once on update
-Fixed khon.space invention lookup not working for blueprints
-Removed eve-marketdata.com and evemarkethelper.net from the lookup menu
-Checks periodical if the marketlogs directory exist (if missing on startup)
________________________________________________________________________________
_6.6.2__________________________________________________________________________
New Features:
-Added stockpile multiplier and subpile target in the shopping list (Issue #189)
Changed:
-Subpiles are now include when hidden (Issue #188)
Bug Fixes:
-Industry Slots did not include corporation jobs
________________________________________________________________________________
_6.6.1__________________________________________________________________________
New Features:
-Skill point filters are now shared between the Isk and Tracker (Issue #187)
Bug Fixes:
-Stockpile did not handle editing correctly (Issue #186)
________________________________________________________________________________
_6.6.0__________________________________________________________________________
New Features:
-Use ZKillboard's Structure API
-Transaction Margin (Issue #153)
-New Tool: Industry Slots (Issue #179)
-Added skill points value to Tracker and Isk Tools (Issue #116)
-Import/Export Routes (Issue #167)
-Cascading Stockpiles AKA Subpiles (Issue #141)
-Toggle reprocessing colors on toolbar Assets/Tree (Issue #151)
-Add Transaction Filter Table Menu (Issue #165)
Code:
-Updated pricing library to 2.1.2
Bug Fixes:
-Bad layout in SettingsDialog when opened the first time on some look and feels
-Ask before overwriting a route when saving and order saved routes alphabetical
-Stockpile EFT import ignore loaded charges (Issue #154)
________________________________________________________________________________
_6.5.1__________________________________________________________________________
Bug Fixes:
-Unable to delete/edit stockpile entries (Issue #176) [Thanks to Nickand87]
________________________________________________________________________________
_6.5.0__________________________________________________________________________
New Features:
-BPC colors can now be changed (Issue #150)
-Added assets colors to the tree table
-Better GUI on the color settings panel (tested on Ubuntu and Windows)
-Improved math for Transaction Profit/Price columns (Issue #152)
-Added option to select what price to use for profit calculations
-Added ToolTips to a lot of columns
-Changeable Look and Feel + Dark Theme (Issue #66)
-Faction warfare system ownership column to Assets/Tree
-Added Reprocessed price column to Market Orders tool
-Stockpile match installer for industry jobs (Issue #164)
Changed:
-Stockpiles are now sorted case-insensitive
Code:
-Updated dom4j library to 2.1.3 (security vulnerability)
-Updated eve-esi to 4.0.0 (major change: all enums can now be null)
Bug Fixes:
-Possible fix for outbid count being wrong (Issue #158)
-Possible fix for account error JWT is null (Issue #171)
-Contracts Appraisal API failing when including private structures (Issue #172)
-Outbid range for sell orders always used region (Issue #170)
-Made StatusPanel.progressStatus thread safe (BugID: 830)
-Fixed Market Orders export having a bad value for Market Details column
-Possible fix for Stockpile CtD (BugId: 833)
-Ensure outbid doesn't have outdated data (Possible fix for #158 and #170)
________________________________________________________________________________
_6.4.1__________________________________________________________________________
Bug Fixes:
-Isk/Values best fitted ship including stacks of ships
-Use universe/names less (since it's being unstable)
-Fixed unexpected end of JSON input: Use JWT (Issue #163)
-Ensure public market orders are unique (Issue #158)
________________________________________________________________________________
_6.4.0__________________________________________________________________________
New Features:
-Customizable colors
-Colorblind friendly color theme
-Tracker: Edit the order of generated routes
-Tracker: Added Logarithmic scaling (linear still default)
-Tracker: Remember selected owners between restarts and updates
-Added ToolTips to Outbid $/Outbid #/Market Details columns
-Added SUM of selection/column to the table menu
-Duplicate filter entries
-Warning levels for updates
-Added update warning for missing corporation roles
-Improved setting dialog GUI on ubuntu
-Serve html response on SSO callback url instead of redirecting to eve.nikr.net
Code:
-Updated to routing 2.0.0 and graph 2.0.0 (both now support generics)
Bug Fixes:
-TaskDialog move a tiny bit when showing/hiding errors
-Stockpile import had never ending loop of asking what stockpile to import
-Made Stockpile text import more resilient to crashing (BugID: 800)
-Made MarketLog import more resilient to crashing (BugID: 823)
-Made Xml reader more resilient to crashing (BugID: 822, 821, 820, 819)
________________________________________________________________________________
_6.3.2__________________________________________________________________________
Bug Fixes:
-Normalized apostrophe, quotes, and hyphen symbols for filters
-Assets names update doesn't include all valid items (Issue #130)
-Fixed crash to desktop when copying to the clipboard (BugID: 818)
________________________________________________________________________________
_6.3.1__________________________________________________________________________
Bug Fixes:
-Fixed edited accounts using the old access token
-Fixed market details column not handling corporation orders
________________________________________________________________________________
_6.3.0__________________________________________________________________________
New Features:
-Market Orders: Use Public Market Orders to find outbid orders
-Market Orders: Added Market Details column
(Button opens market details in-game and copy fixed price to clipboard)
-Market Orders: Automatically read Marketlogs exports
(Find outbid orders and copy fixed price to clipboard)
-Market Orders: Added Edits column
-Select tool to show at startup or restore tools from last session
-Support LowSec and NullSec regions as price sources locations
Code:
-Updated to eve-esi-3.7.0
Bug Fixes:
-Fixed tracker popup menu getting more and more useless separators
-Better error messages for citadel updates
________________________________________________________________________________
_6.2.4__________________________________________________________________________
Bug Fixes:
-Fixed splash screen falsely claiming to be a dev build
________________________________________________________________________________
_6.2.3__________________________________________________________________________
Bug Fixes:
-Assets update fails with ships in the frigate escape bay (Thanks to Ashterothi)
________________________________________________________________________________
_6.2.2__________________________________________________________________________
Bug Fixes:
-Fixed crash to desktop when exporting SQL (Thanks to Neugeniko)
________________________________________________________________________________
_6.2.1__________________________________________________________________________
Bug Fixes:
-Fixed crash to desktop in Contracts/Stockpile (thanks to Dak Torin)
________________________________________________________________________________
_6.2.0__________________________________________________________________________
New Features:
-Tree now preserve expanded state on update
-Added Market Orders column: Issued (first known issued date)
-Added Market Orders column: TypeID
-Added Market Orders column: Broker's Fee
-Added Transaction column: Profit/percent/price
-Added Transaction column: Tax
-Added Export/Import Stockpiles as Text
-Added broker's fee and tax to the table menu selection info
-You can now copy selection info from the table menu by clicking the menu item
-Added support for column header tooltips
-Added tooltip to jumps column headers
Changed:
-Transactions Value column now include tax
-Copyright updated to 2020
-Market Orders column: Issued renamed Updated (last known issued date)
Code:
-Fixed memory leak in MyLocation/Citadel
Bug Fixes:
-Possible fix for duplicated value in the tree tool
-Better BPO detection for Industry Jobs
-Runs column does not match with the value "BPO". Only match "-1"
________________________________________________________________________________
_6.1.3__________________________________________________________________________
Changed:
-Removed EveKit (Accounts can be migrated to ESI)
Bug Fixes:
-Fixed update error on Java 11+ (SSLHandshakeException because of forced SSLv3)
________________________________________________________________________________
_6.1.2__________________________________________________________________________
Code:
-Use characters/affiliation instead of characters/{character_id} (faster)
-Use universe/names instead of corporations/{corporation_id} (faster)
________________________________________________________________________________
_6.1.1__________________________________________________________________________
Bug Fixes:
-Structure updates was failing on 404
-Better handling of fatal errors during updates
-Possible fix for market orders never closed
Changed:
-Added wiki links
________________________________________________________________________________
_6.1.0__________________________________________________________________________
New Features:
-Update missing item data from ESI (not all item data is available via ESI, yet)
-Tracker: Use asset prices for sell orders (Optional, off by default)
-Tree tool: Added more groups
-Tree tool: Container types show totals of sup items
-Stockpiles: Show/Hide Stockpiles per Profile
-Keep the splash screen open after dismissing an update dialog
-Better error message for OutOfMemoryErrors
Bug Fixes:
-Fixed duplicates in the Tree Tool
-Better handling of multiple profiles in the tracker
Code:
-Better support for package managers
-Updated evekit library to 6.0.0
-Updated eve-esi library to 3.3.0
-Updated contracts-pricing library to 2.0.0
________________________________________________________________________________
_6.0.4__________________________________________________________________________
Bug Fixes:
-Could not add new accounts (not working with IPv6, now force IPv4)
________________________________________________________________________________
_6.0.3__________________________________________________________________________
Bug Fixes:
-Did not respect the expires header on empty items in the Contract Appraisal API
________________________________________________________________________________
_6.0.2__________________________________________________________________________
Bug Fixes:
-Fixed CtD (NPE) in Tree and Stockpile Tools (BugID: 755, 756, 757, 758, 759)
-Fixed missing contract prices in the Tree tool
-Stockpile did not respect BPC contract price settings
Changed:
-Industry Jobs output column now show total runs when copying
________________________________________________________________________________
_6.0.1__________________________________________________________________________
New Features:
-Send feedback to the Contract Appraisal API
-Prices for BPCs and BP runs in the stockpile
-Added "New" update option for Contract Appraisal
Bug Fixes:
-Can not set BPC price
-Incorrect update time for Contract Appraisal (sometimes missing a day)
________________________________________________________________________________
_6.0.0__________________________________________________________________________
New Features:
-Added Contracts Appraisal API
-Regular Expression Filter
-Added Planetary Facilities
-Added undo/redo to all text components
-Better planetary assets integration throughout the program
Bug Fixes:
-Stockpile always showed location all
-Excluded planets from the routing tool and UI menu (not valid destinations)
-Possible fix for BugId: 750
Changed:
-Tracker now ignore sell orders that is still in assets (to avoid duplicates)
Code:
-Optimization of the Routing and Overview tools
-Fixed issues found by LGTM.com
-Better Uncaught Exception Handling
-Better error handling for JSon reading and writing (BugId: 744)
-Fixed problem with Java 11 and Java 12 (still primarily developed on Java 8)
________________________________________________________________________________
_5.9.0__________________________________________________________________________
New Features:
-Added meta column to the stockpile
-Update from the command line (with -backgroundupdate)
-Use Bookmark endpoints to resolve structures (require new scope)
-Planetary Assets (require new scope)
-Multibuy export in the stockpiles shopping list
-Eve multibuy export in the Copy+ menu
-Blueprint Runs in the Stockpile tool
-Evepraisal in the loopup menu
-Adam4EVE in the lookup menu
-Eve-MarketData in the lookup menu
-eve-hub in the lookup menu
-evemarkethelper in the lookup menu
-khon.space in the lookup menu
Bug Fixes:
-Fixed system names in pricing regions selector. (Contributed by AnrDaemon) o7
-Fix for Bug ID: 739 (thread safety)
Changed:
-Removed eve-markets from the lookup menu (dead)
Code:
-Better retry logic for ESI requests
-Updated EveKit library to 5.0.1
-Updated eve-esi to 3.2.0 (major improvements)
-Updated pricing to 2.1.1
________________________________________________________________________________
_5.8.2__________________________________________________________________________
Bug Fixes:
-ESI structure import stops on 404 errors
-Minor improvement to thread safety on update
________________________________________________________________________________
_5.8.1__________________________________________________________________________
New Features:
-Added fuzzwork as a price data source
Bug Fixes:
-Fixed price updates continuing download after canceled
Changed:
-Removed eve-marketdata as a price source and from the lookup menu
-Prioritize user and esi citadel data over hammerti.me
Code:
-Updated eve-esi to 2.4.0
-Updated pricing library to 2.0.0
Notes:
-Give the fuzzwork price source a try. It's lightning fast.
________________________________________________________________________________
_5.8.0__________________________________________________________________________
New Features:
-Improved Stockpile filters
-Advanced Filters (OR groups)
-Added zKillboard item database to the lookup menu
-Added EVE Ref item database to the lookup menu
Bug Fixes:
-Crash: NPE in JMenuUI (BugID: 708)
-Corporation market orders on characters in the isk/values/tracker tools
Code:
-Moved asset added data to SQLite
________________________________________________________________________________
_5.7.4__________________________________________________________________________
Bug Fixes:
-Better handling of EveKit updates
________________________________________________________________________________
_5.7.3__________________________________________________________________________
Bug Fixes:
-All packed assets now have the correct volume (require latest data update)
-Better handling of corrupted settings and profile files
-Better handling of invalid ESI accounts (auth failures)
-Settings not saved when adding items to the stockpiles
Code:
-Updated eve-esi to 2.3.5 (URL encoding fixed)
________________________________________________________________________________
_5.7.2__________________________________________________________________________
Bug Fixes:
-ESI import showed invalid account before authorizing on the EVE SSO web site
-ESI workaround for universe names not resolving faction ids
-Overview displayed wrong system/region for systems
-Wrong count of total rows in some tools
-Date filter equals/before/after did not match correctly
-Column name was not always fully visible when sorted
-Tracker asset filter selecting and filtering was not working correctly
-Fixed two crash bugs (BugID: 693 and 687)
Changed:
-Always show output value in table (table menu and statusbar unchanged)
-Ask to include all tracker asset filter locations (once)
-Delete unused library files
Optimizations:
-Column resizing (All tools with tables - also faster filtering)
-Materials Tool
-Separator Table (Stockpile/Contracts/Materials/Reprocessing/Loadout)
Code:
-Updated eve-esi to 2.3.4 (Use PKCE, instead of client secret)
________________________________________________________________________________
_5.7.1__________________________________________________________________________
Bug Fixes:
-Fixed crash when opening the Tree tool (BugId: 681, 682, 683, 684)
-Container column was not updated when changing asset names
-Would not always use the newest data
-Fixed error with name updates (faction ids)
________________________________________________________________________________
_5.7.0__________________________________________________________________________
New Features:
-Major optimization of settings IO
-Allow unchecking all unknown locations in the tracker assets filter
-Tracker assets filter search
-Import tracker data from file
-Added issued by column to market orders
-Updated jmemory (Warn on 32bit Java and better error messages)
-Now run with jmemory after update (if jmemory was used to start jEveAssets)
-More memory optimiaztions
-Better handling of structure assets
Bug Fixes:
-Tracker purge removed too much
-Asset safety is not an unknown location
________________________________________________________________________________
_5.6.0__________________________________________________________________________
New Features:
-Added Fuzzwork Blueprint Calculator to the Lookup menu
-Added Fuzzwork Market to the Lookup menu
-Added Eve Info item database to the Lookup menu
-Delete known invalid tracker asset locations
-Major Memory Optimizations
-CPU Optimization of Tracker, Routing, Ship Fittings, Stockpile
Bug Fixes:
-Industry Jobs Assets was missing ME/TE/RUNS and had wrong BPO/BPC
-Workaround for deleted PI structures
Changed:
-Removed Eve-Central from the lookup menu
-Removed Conquerable Stations
-Ignore Wormhole and Abyssal locations in the routing tool
________________________________________________________________________________
_5.5.1__________________________________________________________________________
New Features:
-Backup files are now zipped
Bug Fixes:
-Failed to exit when a minimized update was running
-ESI Contract Items failed with 404
-Stockpile manufacturing did not include reactions
-Workaround for ESI universe/names not supporting factions
-Better handling of profiles (including a bug fix and optimization)
________________________________________________________________________________
_5.5.0__________________________________________________________________________
Bug Fixes:
-New logic to ensure uniqueness of Journal and Transactions
-Possible fix for tracker problems
-Don't try to update active ship via EveKit for corporations
Changed:
-Removed support for the now dead XmlAPI
-Increased the amount of times ESI retries from 1 to 3
-Update error message from "Not allowed yet" to "Waiting for cache to expire"
-Added warning when EveKit accounts have invalid ESI auth
-Workaround for 9e18 locations
Code:
-Updated eve-esi to 2.1.8
-Updated EveKit to 2.4.0.2
________________________________________________________________________________
_5.4.3__________________________________________________________________________
Code:
-Updated EveKit library to 2.4.0 (ESI data model)
-Updated EveAPI library to 7.0.4
-Updated eve-esi library to 2.1.5
________________________________________________________________________________
_5.4.2__________________________________________________________________________
Bug Fixes:
-Fixed bug introduced in 5.4.1 (BugId: 641/642/644)
________________________________________________________________________________
_5.4.1__________________________________________________________________________
New Features:
-Get closed Market Orders from ESI (new endpoints)
Bug Fixes:
-Fixed a few bugs (BugId: 635 and 631)
Changed:
-Split Market Orders quantity into two columns (easier export)
________________________________________________________________________________
_5.4.0__________________________________________________________________________
New Features:
-Added Manufacturing/Reactions output to the Assets tool (Optional)
-Added shopping list and eve multibuy import to the stockpile
Bug Fixes:
-Stockpile Shopping List did not distinguish between BPC and BPO
-Industry Jobs in the assets list now have the correct flag
Code:
-Updated glazedlists to 1.11.0
-Updated eve-esi to 2.0.2 (fix missing contracts - x-pages)
________________________________________________________________________________
_5.3.0__________________________________________________________________________
New Features:
-Added count to Transactions statusbar and popup menu.
-Added difference between start and end date to the Tracker tool statusbar
-Last X Hours filter
-Unknown locations in the tracker are now resolved by citadel/structure updates
-Lookup for fuzzwork item database
-Structure update and EveKit tracker import can now be done in the background
Bug Fixes:
-Old Market Orders from the XmlAPI was never marked as done
-ESI error limit did not handle negative wait values
-Filter cache was not updated after adding/removing Tags
-Stockpile Export/Import could duplicate Tags
Code:
-Warn about assets with bugged locations
-Better handling of settings update failure
-Updated JFreeChart to version 1.5.0 (Fix a few problems)
-Updated EveKit library to 4.0.2
-Updated eve-esi to 2.0.0
________________________________________________________________________________
_5.2.0__________________________________________________________________________
New Features:
-Added Export in EFT format in Ship Fittings Tool
-ESI UI: Lookup owners in-game
-Routing: Added stations
-Routing: Save/Load calculated routes
-Routing: Add locations from other tools
-Check for program/data updates once an hour and show result on the statusbar
Bug Fixes:
-Splash screen disappear before frame is shown
-Market Orders missing from Stockpile
-Settings closed when pressing Apply
-Ignore empty fittings when exporting all fittings to Eve XML fittings format
-Fixed locations menus (again)
-Fixed BugID: 620
-Possible fix for BugID: 622 621
-Possible fix for BugID 326
Changed:
-A few Routing GUI improvements
-Added Cargo to Eve XML Fittings export
Code:
-Updated eve-esi-dev to 1.4.9 (use Double for ISK values)
________________________________________________________________________________
_5.1.1__________________________________________________________________________
Bug Fixes:
-ClassCastException in StockpileItemDialog (BugID: 615)
-Fixed Eve XML fittings export format to be compatible with pyfa
-Tree Tool locations values was wrong
-Fixed minor issue with the window settings
-Possible fix for Issue #24 (BugID: 616)
-Journal error code 500 (ESI Bug FIx)
-ESI singleton bug (missing: container/ship names, fittings - ESI Bug FIx)
Code:
-Memory Optimization
-Use the dev version of ESI (eve-esi-dev - fix the singleton bug)
________________________________________________________________________________
_5.1.0__________________________________________________________________________
New Features:
-Assets: Include active ship in space (ESI)
-Table Menu: Open in-game market/contract windows and set waypoint
-Routing Tool: Set in-game waypoints
-Support reactions in Industry Jobs and Stockpile (counted as manufacturing)
-Added more options to the structure update
Bug Fixes:
-Jumps menu clear was not working
-Jump columns was sometimes empty
-Editing unknown locations in the overview tool did not work
-Fixed a lot of issues with menus that use locations
-Industry Jobs Reactions was marked incorrectly
-Industry Jobs now count canceled and reverted as delivered
-Better BPO detection for Industry Jobs
-Disabled filter was included when exporting
-Fixed Journal update errors (ESI bug fix)
Changed
-Better Account Manager user interface
-Better column selection in the export dialog
Code:
-Better uncaught exception handling
-Update eve-esi to 1.4.6
________________________________________________________________________________
_5.0.5__________________________________________________________________________
Bug Fixes:
-Contracts was missing names/locations after update
-420 in corporation contract items (rate limit)
-Industry Job reactions was not being marked correctly
Changed:
-Updated the help menu to be more helpful
Code:
-Updated eve-esi to 1.4.4
-Optimized filtering (with cache)
________________________________________________________________________________
_5.0.4__________________________________________________________________________
Bug Fixes:
-Industry jobs was missing reactions activity (Failed update)
-Tracker related crash bugs
-Structure update failed on Java 9
-Citadels was being incorrectly marked
-Profiles was not being saved on shown change
-Workaround for crash bug with BugID: 492 (Java Bug)
-Fixed problem with Industry Jobs locations
Changed:
-Better GUI for the structure update
Code:
-Update jFreeChart to 1.0.19
________________________________________________________________________________
_5.0.3__________________________________________________________________________
New Features:
-Location Settings
-Export/Import ESI Keys
Bug Fixes:
-Fixed the bugs introduced in 5.0.2
Code:
-Optimized update of dynamic values (Asset Names/Prices/Locations)
________________________________________________________________________________
_5.0.2__________________________________________________________________________
New Features:
-Now shows an animation while doing lengthy tasks
Bug Fixes:
-Fixed CtD when changing profile
-Fixed a few bugs related to price updates (BugID: 559, 558)
-Possible fix for XML loading bugs (BugID: 548, 564, 563)
-Fixed contracts NPE (BugID: 561, 557, 561, 560)
-Fixed ESI corporation contract items update failure (BugID: 555, 565)
-Fixed ESI structure update failure
-Could not reset user locations
Changed:
-Now mark ESI market orders no longer in the return as Unknown
-ESI Structure updates have been move to Its own update window
Code:
-Increased the maximum log size
-Updated EveAPI library to 7.0.2
-Updated Pricing library 1.8.0
-Update jmemory to 3.0.0
________________________________________________________________________________
_5.0.1__________________________________________________________________________
New Features:
-Added EveMarketer to lookup menu
Bug Fixes:
-Ignore trained skill
-Missing names (again and again)
-Manually close ESI orders when they're removed from the return (Workaround)
-Contract Items and Assets incorrectly marked as BPO (Workaround)
-Orders have wrong owner (when both character and corporation order is present)
-Better handling of headless Java
-Workaround for Desktop.browse
-Fixed another issue with adding ESI accounts
-Duplicate assets
-Possible fix for errors when updating ESI Contract Items
-Possible fix for 502 in ESI Structure endpoint
________________________________________________________________________________
_5.0.0__________________________________________________________________________
New Features:
-Support for ESI Corporation accounts
Bug Fixes:
-Fixed missing names (BugID: 542, 544, 546)
-Fixed the compatibility issue with Java 9 (BugID: 545, 547)
-Possible fixed for NPE in JContractsTable (BugID: 551)
-A few minor bug fixes
Code:
-Better error handling (again)
________________________________________________________________________________
_4.5.2__________________________________________________________________________
Bug Fixes:
-Fixed missing names
-Updated BPO/BPC detection code
-Better error handling for update threads
-Better handling of cancel while updating
-Better ESI error limit support
-Made RawConverter thread safe
-Better ESI migration warning
________________________________________________________________________________
_4.5.1__________________________________________________________________________
Bug Fixes:
-Fixed Market orders duplicates
-Fixed transactions fail to convert float to integer
-Fixed NPE in ProfileWriter (BugID: 539)
-Fixed NPE in AbstractEsiGetter
-Fixed NPE in MyIndustryJob (BugID: 541)
-Possible fix to NPE in UpdateTask (BugID: 540)
-Possible fix for universe/names errors (BugID: 542)
Code:
-Updated eve-esi library to 1.4.1
________________________________________________________________________________
_4.5.0__________________________________________________________________________
New Features:
-Support for ESI characters (shorter cache times, with a few exceptions)
-Update ESI/EveKit/EveAPI in threads (faster updates)
-Added support for evemarketer.com as a price source
Code:
-Completely new data backend with support for EveAPI/EveKit/ESI
________________________________________________________________________________
_4.1.5__________________________________________________________________________
Bug Fixes:
-ESI was not working
Changed:
-Eve-Central is disabled (Will use Eve-MarketData instead)
________________________________________________________________________________
_4.1.4__________________________________________________________________________
Bug Fixes:
-Failed price updates set all prices to zero (pricing library)
-Better handling of corrupted setting/profile files
Code:
-Updated pricing library
-Updated ESI library
-Faster price updates (pricing library)
________________________________________________________________________________
_4.1.3__________________________________________________________________________
New Features:
-Added support for basic proxy authentication
Changed:
-New forum thread
Bug Fixes:
-Fixed proxy support (everything now use the proxy settings)
-Fixed Eve-MarketData support
-ESI accounts never expire
-Fixed two crash bugs and a few of minor ones
________________________________________________________________________________
_4.1.2__________________________________________________________________________
Bug Fixes:
-Workaround for java crash: https://bugs.openjdk.java.net/browse/JDK-8179014
-Ignore itemIDs in the structure endpoint
Code:
-Better logging for API updates
________________________________________________________________________________
_4.1.1__________________________________________________________________________
Bug Fixes:
-Stockpile manufacturing jobs used blueprint TypeID instead of product typeID
-Update Dialog showed wrong update times (included accounts without permission)
________________________________________________________________________________
_4.1.0__________________________________________________________________________
New Features:
-ESI structure endpoint (Resolve structure names, optional)
-Tracker: You can now add notes (Limitation: 1 note per day)
-Stockpile: Tags (just like in the Assets tool)
-Stockpile: Shopping list allow you to hide items above X% full
Changed:
-Rearranged the tool menu
-Creates backup of data when a new version is run for the first time
-Made the citadel update more resilient to errors
-Use https for updates and bug reports
-Stockpile: Optimized
-Assets: Type count column now counts BPO and BPC separately
Bug Fixes:
-Account import: Better handling of cancel and previous
-Stockpile: Shopping list did not include contract items
-Tree: Containers and ships was missing if their children was filtered out
-Tree: Category tool had unknown locations for items without a location
-Stockpile: All blueprints match both BPC and BPO
________________________________________________________________________________
_4.0.1__________________________________________________________________________
Code:
-Stockpile Optimization
Bug Fixes:
-Journals and Transactions are missing
-Better handling of account editing
-Fixed reprocessing calculation
________________________________________________________________________________
_4.0.0__________________________________________________________________________
New Features:
-EveKit support
-Import tracker data from EveKit
-Rename unknown locations
-Added unknown locations and citadels to the stockpile tool
-Lookup all locations for items with multiple locations (Stockpile/Contracts)
-Added option to use stronger colors
-Show time until the the first and last account can be updated
Changed:
-Made it easier to reactivate expired accounts
-You can now copy the error message from the update dialog
-The Citadel API is now cached at my server
Bug Fixes:
-Profiles was not saved on creation
-Removed wrecks from the Assets Tool
-Fixed ISK per Hour import
Code:
-Moved to glazed list 1.10
________________________________________________________________________________
_3.1.4__________________________________________________________________________
Bug Fixes:
-All Market Order/Journal/Transaction history deleted on update
________________________________________________________________________________
_3.1.3__________________________________________________________________________
Changed:
-Assets API to only use flat list now
Bug Fixes:
-Fixed warning from citadel API
-Fixed citadel API progress display
Code:
-Updated EveAPI to 7.0.1
________________________________________________________________________________
_3.1.2__________________________________________________________________________
New Features:
-Enabled GZip support for the pricing library (faster price update)
Bug Fixes:
-Better error handling for the the stop.hammerti.me.uk citadel API
Known issues:
-Blueprint in contracts are always marked as BPC (API Bug)
________________________________________________________________________________
_3.1.1__________________________________________________________________________
Bug Fixes:
-Better integration of the stop.hammerti.me.uk citadel API
Known issues:
-Blueprint in contracts are always marked as BPC (API Bug)
________________________________________________________________________________
_3.1.0__________________________________________________________________________
New Features:
-Added support for getting assets in citadels
-Added blueprint runs to Assets and Tree tools
-Added reset to QuickDate in the tracker tool
-Added option to hide zero in the tracker tool
Changed
-Stockpile: Hide the column text for excluded count columns
-Removed eve-online wiki from lookup menu
-Updated credits.txt and about dialog
Bug Fixes:
-Bought contracts always included in stockpile
Known issues:
-Blueprint in contracts are always marked as BPC (API Bug)
________________________________________________________________________________
_3.0.4__________________________________________________________________________
Bug Fixes:
-JAutoCompleteDialog never set strict
-JDropDownButton component must be showing on screen (BugID 420 & 281)
-Do not try to get expired market orders from the API
Changed:
-Excluded "Escrows To Cover" from the tracker total
Code:
-Updated EVEAPI to the latest version
-Better error messages for uncaught exceptions
-Moved from jCalendar to LGoodDatePicker
Known issues:
-Assets in citadels are not included in the API (Workaround in the works)
-Blueprint in contracts are always marked as BPC (API Bug)
________________________________________________________________________________
_3.0.3__________________________________________________________________________
Bug Fixes:
-Fixed problem with updating contracts in citadels
-Fixed problem with reading AccessMask in ProfileReader
-The price cache time was not loaded on startup
Code:
-Better handling of old versions of Java
Known issues:
-Assets in citadels are not included in the API (API Bug)
-Blueprint in contracts are always marked as BPC (API Bug)
________________________________________________________________________________
_3.0.2__________________________________________________________________________
Bug Fixes:
-Possible fixes for following bugs with BugID: 281, 412, 406, 403
-Fixed crash when removing multiple avoid system from the routing tool
-Old market orders are never marked as completed (BugID 410)
-Better handling of missing data and library files
-Warning when trying to run jEveAssets from inside the zip file
Changed:
-Blueprints in contracts now use PBC value (zero). See bellow...
Known issues:
-Assets in citadels are not included in the API (API Bug)
-Blueprint in contracts are always marked as BPC (API Bug)
________________________________________________________________________________
_3.0.1__________________________________________________________________________
Bug Fixes:
-Possible fix for bugID: 397 (ArrayIndexOutOfBoundsException)
-Bug Fix: Journal and Transaction were missing valid duplicates
________________________________________________________________________________
_3.0.0__________________________________________________________________________
New Features:
-Transactions: Added average price to status bar and popup menu
-Market Orders: Added history
-Market Orders: Added last opposite transaction price/profit/percent columns
-Tracker: Total now only include selected values (Include/Exclude)
-Stockpile: Export/Import to xml
-Import/Export Filters
-More user friendly import of text
-Price Update Options (All/New/None)
-Jump columns (via table menu)
-Release updates via installer
-Stockpile: Exclude Location
-Stockpile: Added contracts
-Industry Jobs: Added count to status bar and popup menu
-Tracker/Isk/Values: Added contracts
-Tracker: Added Location/Corporation Hangar and Wallet Division filters
Changed:
-Use the latest version of EVEAPI
-Moved to Java 8: require Java 8 to run (will still compile on Java 7 JDK)
Bug Fixes:
-Contracts: kept old data after updating from the API
-Fixed a lot of GUI problems on Linux (Unity/GNOME/KDE)
-File locks was not working correctly
-Transactions failed to update
________________________________________________________________________________
_2.10.5_________________________________________________________________________
Changed:
-Added User Agent to HTTP requests (Global)
-Safer backup and restore of settings files
-Don't update missing prices on startup (price 1.4.0)
-Changed jUpdate download location (To make sure we have write access)
Bug Fixes:
-AIOOB EnumTableFormatAdaptor (Critical)
-FilterSave deadlock read lock (Critical)
-IllegalArgumentException in SeparatorList (Critical)
-Stockpile table colors did not working with the default value
-Buy/Sell Transaction columns are not grayed out when exclude
-Reprocessed grand total remove button not disabled
-Removed dead lookup links
-Settings -> Window: The order of JTextField are illogical
-Stockpile Dialog are not updated before shown (Empty location fields)
________________________________________________________________________________
_2.10.4_________________________________________________________________________
Bug Fixes:
-Possible fix for IllegalArgument in getLocalFile() (BugID: 284 and 179)
-ConcurrentModificationException in HashMap constructor (BugID: 202 and 282)
-NullPointerException in ProfileWriter (BugID: 285)
________________________________________________________________________________
_2.10.3_________________________________________________________________________
Changed:
-Changed Google Code links to GitHub
-Minor optimization to stockpile tool
-Updated Glazed Lists library to 1.9.1
-Removed eve.addicts.nl
Bug Fixes:
-Added Glazed list read locks (could fix some bugs or not)
-Save eve fittings (wrong type name)
-Race condition when updating (tracker point creation)
-Settings was not saved after deleting stockpile
-ArrayIndexOutOfBounds in EnumTableFormatAdaptor
________________________________________________________________________________
_2.10.2_________________________________________________________________________
Bug Fixes:
-Saving Journal/Transactions history didn't work
-Profile was not always saved when changed in Account Manager
________________________________________________________________________________
_2.10.1_________________________________________________________________________
Bug Fixes:
-Possible fix for Update/ISK/Tracker/Values bug
________________________________________________________________________________
_2.10.0_________________________________________________________________________
New Features:
-Blueprints API (Asset/Tree/Industry: ME/TE & BPC/BPO)
-Added profiles filter to the Tracker tool
-Added option to delete data point for all owners
-Added Contract Collateral to the Isk/Values/Tracker tools
Changed:
-Changed the font and formating of the Tracker tool chart
-Now remove owner from the Tracker when the last data point is deleted
Bug Fixes:
-Fixed date format in the Tracker Tool
________________________________________________________________________________
_2.9.1__________________________________________________________________________
Bug Fixes:
-Bad layout in the tracker tool
-Reprocessing calculations for items
________________________________________________________________________________
_2.9.0__________________________________________________________________________
New Features:
-Stockpile: Adjustable percentage grouping
-Tracker: Multiple characters select
-Date filter: Last X Days
Bug Fixes:
-Updated reprocessing to the latest formula and fixed reprocessing skills
-Accounts was not saved when deleted/added
________________________________________________________________________________
_2.8.7__________________________________________________________________________
Changed:
-Assets converted from industry jobs are now always marked as BPC
Bug Fixes:
-Industry Jobs Output Count/Value was not working (Thanks to Busje Komt Zo)
-Tracker manufacturing was always zero (Same bug as above)
-Crashed when filters contained removed columns (Thanks to Uber Pie)
________________________________________________________________________________
_2.8.6__________________________________________________________________________
Changed:
-Static data updated to Crius 1.0.0
-Removed PE/ME from industry jobs and assets (no longer part of the API)
-Removed BPO/PBC from industry jobs (no longer part of the API)
Bug Fixes:
-Industry Jobs was not updating (due to API changes)
________________________________________________________________________________
_2.8.5__________________________________________________________________________
Changed:
-Static data updated to Kronos 1.0.0
Bug Fixes:
-Auto update could fail before asked to update
________________________________________________________________________________
_2.8.4__________________________________________________________________________
New Features:
-New bug report dialog
-Added new column: 'Installer' to the Industry Job Tool
Changed:
-Better API Update error messages
Bug Fixes:
-Settings was not saved when editing or deleting Tracker data point
-Settings was not saved when changing Stockpile Target or Multiplier
-Contracts owners was not updated correct
________________________________________________________________________________
_2.8.3__________________________________________________________________________
Changed:
-Better auto update code (update jupdate.jar and validate downloaded files)
Source:
-Deploy: Upload release automatic
Notes:
The new auto update code will only be used
when updating from 2.8.3 to any later version.
Updating to 2.8.3 will still use the old code.
________________________________________________________________________________
_2.8.2__________________________________________________________________________
Bug Fixes:
-Routing Mutation 2-opt and Crossover does not work
________________________________________________________________________________
_2.8.1__________________________________________________________________________
Bug Fixes:
-Possible fix for BugID: 3, 4, 5, 6
________________________________________________________________________________
_2.8.0__________________________________________________________________________
New Features:
-Tree Tool Sorting
-Routing: Avoid System (By name or security)
-Industry Jobs: Manufacturing Output Value
-Assets: ME/PE columns
-Added time to date columns
-Added simple bug reporting tool
-Added auto update tool (program and static data)
Changed:
-Date format is now ISO 8601: yyyy-MM-dd (Warning: May break your filters)
-Updated static data to Rubicon 1.3.0.95173
-Now save settings when they are changed (disable with "-lazysave")
Bug Fixes:
-StackOverflowError (PaddingTableCellRenderer)
________________________________________________________________________________
_2.7.3__________________________________________________________________________
Changed:
-Updated static data to Rubicon 1.0.4.93577
-Api Keys: Assets access is now optional
-Updated eve toolkit copyright
Bug Fixes:
-Current filter name not displayed
-BPO shown as BPC
________________________________________________________________________________
_2.7.2__________________________________________________________________________
New Features:
-New Contract Column: Status
Bug Fixes:
-Assets included completed contracts
-Empty accounts was hidden in account manager
________________________________________________________________________________
_2.7.1__________________________________________________________________________
Changed:
-Save history for Transactions and Journal (Optional - on by default)
-Support for EVE API HTTP errors (Invalid accounts)
-Updated static data to Rubicon 1.0.93082
Bug Fixes:
-Java 6 could prevent jEveAssets from exiting
-Copying from Materials/Loadouts/Overview tables now include all columns
-Copying from tables added an extra newline at the end
-Stockpile EFT Import could not import drones
-Transaction and Journal now supports API walking (Thanks Yinmatook)
________________________________________________________________________________
_2.7.0__________________________________________________________________________
New Features:
-New Tool: Wallet Journal
-New Tool: Tree (Assets by location or category)
-Tool Views (Save/load column presets - works with export as well)
-Added manufacturing to Isk and Tracker tools
-Added Export to Materials, Ship Loadouts, and Overview tools
-Export: Html formatting and in game browser links (both optional)
-Export: Use table sort order
-New Assets/Tree/Overview column: isk/m3 (Contributed by Saulvin - Thanks!)
-Stockpile: Advanced filters (Multiple locations/owners/containers/flags)
-Added tags to the Asset and Tree tools
-Use base price for PBOs (Optional tech 1/tech 2)
-Stockpile: Added transactions (Items bought/sold after last asset update)
-Stockpile: Now accepts decimals (always rounded to ceiling)
Changed:
-Export greatly improved
-Table Copy: Now use the shown value
Bug Fixes:
-Stockpile shopping list could count the same item multiple times
-Stockpile: Editing items would leave duplicate items
________________________________________________________________________________
_2.6.3__________________________________________________________________________
Bug Fixes:
-Packaged ships showed unpacked volume and vice versa (Thanks llllSeraphimllll)
________________________________________________________________________________
_2.6.2__________________________________________________________________________
Changed:
-Updated static data to Odyssey 1.1.91288
________________________________________________________________________________
_2.6.1__________________________________________________________________________
Bug Fixes:
-Active industry jobs incorrectly marked BPO as BPC in the asset tool
-More minor bug fixes
Changed:
-Updated static data to Odyssey 1.0.9.89602
________________________________________________________________________________
_2.6.0__________________________________________________________________________
New Features:
-New Tool: Wallet Transactions (by Ima Sohmbadi)
-Routing: Major overhaul
-Assets: Rename Container
-Account Import: Error handling
-Stockpile: Import shopping list from "Eve ISK Per Hour"
-Tracker: Edit data points
-Items: Reprocessed Column
-Optimized many parts of jEveAssets
-Many more minor changes and bug fixes
Changed:
-Better handling of multiple instances of jEveAssets
-Library: Updated Glazed Lists to 1.9.0
-Library: Updated EVEAPI to the latest version
-Source: Major cleanup of the source code
-Source: Made it easy to checkout and compile (maven.nikr.net)
________________________________________________________________________________
_2.5.4__________________________________________________________________________
Changed:
-Updated static data to Odyssey 1.0.89097
________________________________________________________________________________
_2.5.3__________________________________________________________________________
Bug Fixes:
-API Bug: The contract API returns alien contracts (Temp ban fix)
-Export Bug: Changing the decimal separator was ignored until next export
Changed:
-Updated static data to Retribution 1.1.84566
________________________________________________________________________________
_2.5.2__________________________________________________________________________
New Features:
-Added "None" container label
Bug Fixes:
-Industry Jobs failed to update
________________________________________________________________________________
_2.5.1__________________________________________________________________________
Bug Fixes:
-Export: Deselecting columns caused a crash
________________________________________________________________________________
_2.5.0__________________________________________________________________________
New Features:
-New Tool: Tracker
-New Tool: Reprocessed
-New Tool: Contracts
-New Tool: Isk
-New Asset column: Added date
-More resilient table selection and expand/collapse state
-Stockpile: Add To now merge items instead of overwriting
-Major optimization of Stockpile Add/Edit/Delete
-A lot of other optimization!
-Some minor bug fixes
Note:
You need to update your API Keys to include contracts
________________________________________________________________________________
_2.4.4__________________________________________________________________________
Bug Fixes:
-Fixed table corruption on OpenJDK (Thanks to Jan)
-Items Tool got a new icon
Changed:
-Updated static data to Retribution 1.0.7.463858
________________________________________________________________________________
_2.4.3__________________________________________________________________________
Bug Fixes:
-Crash when sorting stockpile. (Thanks to Mysterion eXe)
________________________________________________________________________________
_2.4.2__________________________________________________________________________
Bug Fixes:
-Eve-Central: Can not update price data (Thanks Carten)
________________________________________________________________________________
_2.4.1__________________________________________________________________________
Bug Fixes:
-Stockpile ignored everything except typeID
________________________________________________________________________________
_2.4.0__________________________________________________________________________
New Features:
-Export: Use tool column selection and order
-Export: Html & SQL export
-Tables: Save column width (Auto resize off)
-Stockpile: Distinction betwen BPC and BPO
-Reprocessed Colors: Zero = Gray
-New Columns: Reprocessed & Price Difference (Value & Percent)
-New Columns: Market Orders price
-Overview: Load asset filter
-Stockpile: Shopping list for multiple stockpiles
-Stockpile: Add to stockpile - can be used to merge (multiple selection)
-Better UI for custom Price/Name (multiple selection - prices only)
-Price Data: Reprocessed Price selectable seperate
Changed:
-Updated static data to Inferno 1.2.76477
Bug Fixes:
-Stockpile included non-active orders
-GMT mixup
-IPv6 connection failure (force IPv4)
-Some minor bug fixes and optimization
________________________________________________________________________________
_2.3.0__________________________________________________________________________
New Features:
-Added "Selection Information" to all tables menus
-Added info to the Overview statusbar
-Added Station/System selection to the price sources that support it
-Added eve.addicts.nl as price source
-Added percentile/5% to all price sources
Changed:
-The stockpile statusbar now show values for shown item (not for all items)
Bug Fixes:
-Fixed bug: CSV export: New filter is not available
-Fixed bug: Incompatible with Java 6u33 & 7u5 (Thank you Flaming Candle!)
-Fixed bug: Hide/show columns could crash the program
-A lot of minor bug fixes
________________________________________________________________________________
_2.2.0__________________________________________________________________________
New Features:
-New Tool: Items (items database)
-Table menu now works with multiple selection
-Added EveMarketeer (As price source and to the lookup menu)
-Added Eve Addicts to the lookup menu (eve.addicts.nl)
-Market Orders: Added info to the statusbar
-Industry Jobs: Added invention success to the statusbar
-Stockpile: Added percent full column
-Hide/show columns now has Its own dialog
-Market Orders: Joined the Buy and Sell table
-Market Orders/Industry Jobs: Added some predefined filters
-Filter Manager: Can now delete multiple items at once
-Eve-MarketData: Added support for region selection
-Added better program icons (for windows 7 taskbar etc.)
-Added Flag path (as suggested by Scrapyard Bob)
-Added window Always On Top option
-Stockpile: Added table sorting
-Assets: Added reprocessed value to the statusbar
-Assets: Added Buy Orders (Optional) (Sell orders are now optional as well)
Changed:
-Removed support for prices.c0rporation.com
-CSV Export: Now remember selected columns (again)
-Tables: Columns auto resizing is now optional (again)
-Highlight selected row(s) now work on all filter tools
-Only filter on enter now works again and for all filter tools
-Static data updated to Inferno 1.0.70633
Bug Fixes:
-Fixed a rare bug in the save filter dialog (text was locked)
-Fixed a translation bug in Price Data Settings
________________________________________________________________________________
_2.1.2__________________________________________________________________________
Changed:
-Static date updated to Escalation 1.0.0
________________________________________________________________________________
_2.1.1__________________________________________________________________________
Bug Fixes:
-CSV Export: Saved/Current Filter is broken
-Load Filter: Scroll when needed (Also work with mouse wheel)
________________________________________________________________________________
_2.1.0__________________________________________________________________________
New Features:
-Stockpile: Shopping List (With percent full)
-Stockpile: Added labels for Location/Owner/Minimum Percent Full
-Stockpile: EFT import
-Separator Table: double click to expand/collapse
-Materials: Moved summary to the top
-Materials: Added total for stations
-Materials: Added price column
-Materials: You can now collapse/expand locations
-Assets: Added Tech column (Meta is can now be compared as a number)
Bug Fixes:
-Stockpile: Cancel refresh stockpile list
-CSV Export: Line Delimiter was not added correct...
-CSV Export: Float & Integer always had dot as decimal separator
Changed:
-Static date updated to Crucible 1.6.0
________________________________________________________________________________
_2.0.0__________________________________________________________________________
New Features:
-Date filtering (Before/After/Equals etc.)
-Added CSV export to Industry Jobs, Market Orders, Stockpile
-Added customizable columns to Industry Jobs, Market Orders, Stockpile
-Added filtering to Industry Jobs, Market Orders, Stockpile
-Industry Jobs: Added new column "Region"
-Assets: Added new column "Total Volume"
-Market Orders: Added new columns "Issued", "Owner", "Region"
Known Issues:
-Missiles are named wrong
________________________________________________________________________________
_1.9.2__________________________________________________________________________
New Features:
-Stockpile: Use table menu to edit items
-Stockpile: Remember collapsed/expanded state when updating
-Stockpile: Now sort by group before name
-Stockpile: Assets focus (Optional)
-Stockpile: Color coding (Optional)
-Stockpile: Performance optimization
Bug Fixes:
-Stockpile: Items can be added twice
Changed:
-Static data Updated to Crucible 1.0.0
________________________________________________________________________________
_1.9.1__________________________________________________________________________
Bug Fixes:
-Offices shown as !27
-Stockpile: Corporation items is not added properly
-Stockpile: Offices items is not added properly
________________________________________________________________________________
_1.9.0__________________________________________________________________________
New Features:
-New Tool: Stockpile
________________________________________________________________________________
_1.8.1__________________________________________________________________________
Bug Fixes:
-Now compatible Java 7 (and Java 6)
-Materials, Ship Loadouts, and Account Management now use less CPU
-Meta column is now filtered correct (again)
-Settings.bac is now restored automatically (again)
________________________________________________________________________________
_1.8.0__________________________________________________________________________
New Features:
-Overview: Added buttons for views (Instead of the ComboBox)
-Overview: Added Security column
-Assets: Much better filtering of numbers
-Assets: Added Singleton Column
-Industry Jobs: Active/Ready/Pending
-Materials: Added PI materials (optional)
-Third mouse button close tab
-Load Filter: CTRL+Click now adds filter instead of overwriting existing filter
-Remember CSV Export settings
Changed:
-Static data Updated to Incarna 1.1.0
Bug Fixes:
-Fixed settings dialog height on XFCE 4
________________________________________________________________________________
_1.7.3__________________________________________________________________________
New Features:
-Now use the new Customizable API keys (CAKe)
-Automatically mark blueprints as BPO/BPC (except for market orders)
Changed:
-Static data updated to Incarna 1.0.0
________________________________________________________________________________
_1.7.2__________________________________________________________________________
Bug Fixes:
-Fixed bug that made it impossible to edit price of an item more then once
Changed:
-Faction prices from prices.c0rporation.com are now optional
-Update dialog now use "Today" instead of the weekday name (when eligible)
-Now Hide the profile name in the window title, when there is only one profile
________________________________________________________________________________
_1.7.1__________________________________________________________________________
Bug Fixes:
-Fix bug that made all faction prices zero
-Possible fixed for the StackOverflowError (Issue 146)
-Minor optimization
________________________________________________________________________________
_1.7.0__________________________________________________________________________
New Features:
-Hide Filters
-AssetFilter On/Off
-Overview to Routing coupling
-Faster Overview Groups
-Faction Prices (prices.c0rporation.com)
-Set price for BPC
-Isk-to-cover
-Progress monitor when updating price data on startup
-Merge Filters
Changed:
-Updated the set price/name GUI
-Save settings after updating
-A lot of i18n
________________________________________________________________________________
_1.6.4__________________________________________________________________________
Bug Fixes:
-Fixed missing buttons in the import dialog (Mac Only)
-Fixed crash bug in the Industry Jobs tool (When sorting by Activity or Status)
-Fixed meta column sorting
-Fixed bug that made upgrading from very early version impossible
Changed:
-Removed Eve-Metrics and Added Eve-Marketdata
-Updated static data to Incursion 1.1.0.37959
-Now use EVEAPI 3.0.0 (https!)
-Made the yellow cell background darker
________________________________________________________________________________
_1.6.3__________________________________________________________________________
Bug Fixes:
-Better handling of price data updates.
Changed:
-Updated the static data to Incursion 1.0.1.37657
________________________________________________________________________________
_1.6.2__________________________________________________________________________
Bug Fixes:
-MaterialsTab: All corporation materials was ignored
________________________________________________________________________________
_1.6.1__________________________________________________________________________
New Features:
-Lookup locations and items on popular eve websites (from the table menu)
-Material and Ship Loadout tools have been overhauled
-Now compatible with the new 64bit inventory changes
Changed:
-Better handling of the price data update
-A lot of behind the scene changes
Bug Fixes:
-jeveassets.log is in the wrong location (Mac only)
-Packaged ships now have the correct volume
-Materials tool contained duplicates in the summary
________________________________________________________________________________
_1.5.0__________________________________________________________________________
-Tools are now tabs in the main window
-New Tool: Overview
-Now use slf4J and log4j to log events and errors
-New layout for the Account Manager
-New layout for the Updating Dialog
-Numerous bug fixes and minor changes
________________________________________________________________________________
_1.4.1__________________________________________________________________________
Bug fixes:
-Routing: Brute Force don't return shortest route (Issue 85)
-Conquerable stations are never saved (Issue 98)
________________________________________________________________________________
_1.4.0__________________________________________________________________________
New Features:
-Profiles
-New API update system (You select what to update)
-Enhanced support for mac os x environments
-Program update notifications
-New settings dialog layout
-User settable reprocess efficiency
-New special "sell or reprocess" color scheme
-Rolling log (prevent the log from ever getting to large)
-New pricing option "Midpoint" (sell min + buy max) / 2
-New Column: Reprocessed Value (reprocessed price * count)
-Meta Column: Now works as a the other number columns
-Asset names can now be changed
-Industry Jobs and Market Orders dialogs are now resizable
-New API import dialog
-Now use EVEAPI 2.0.0 (library)
Bug fixes:
-Many minor bug fixes...
________________________________________________________________________________
_1.3.0__________________________________________________________________________
New Features:
-New Tool: Routing - Find the shortest route between multiple asset locations
________________________________________________________________________________
_1.2.3__________________________________________________________________________
New Features:
-Now ignore update timer if the Api Proxy is set
Bug fixes:
-Possible fix for crash bug in JCustomFileChooser (Java Bug)
-Better memory management
-Fix minor display bug
-Better log output
________________________________________________________________________________
_1.2.2__________________________________________________________________________
Bug fixes:
-Fixed bug that would crash jEveAssets when updating assets (industry jobs)
-Fixed bug that ignored the update timer for industry jobs
Known Issues:
-The holiday gift show up as !XXXX
________________________________________________________________________________
_1.2.1__________________________________________________________________________
New Features:
-Now backup settings files (on save)
Bug fixes:
-Fix bug that would sometimes hide industry jobs and market orders
-Fixed bug that would crash jEveAssets when updating assets (holiday gift bug)
Known Issues:
-The holiday gift show up as !XXXX
________________________________________________________________________________
_1.2.0__________________________________________________________________________
New Features:
-Added market orders tool
-Added industry jobs tool
-Now retain window position/size on restart
-Added a label to the toolbar that show the current filter
-Now show the eve server time on the statusbar
-The security column now have the filter modes: "Great than" and "Less than"
-Price data from both eve-metrics and eve-central (Candles pricing library)
-Added more options to the API Manager
-The table now save the selection on update
-Added the ability highlight the selected row
-The price field in price settings, now have focus when adding a new price
Bug fixes:
-JTextField swing bug (workaround)
-New assets have no price (from Market Orders/Industry Jobs)
-Conquerable Stations locations get error string
________________________________________________________________________________
_1.1.0__________________________________________________________________________
New Features:
-Added hide/show columns to the main menu
-Better error messages when Updating assets
-New layout for about dialog
-The default eve-central price can now be changed
-Added new filter modes: Greater/Less then column (compare two columns)
-API keys can now be changed after they have been added
-Filtering is now only triggered when no keys have been pressed for 500ms
-Now automatically mark blueprints that have been used as copy/original
-All settings are now in the same dialog
-Improved the way progress is showed when updating assets and price data
-New dialog key bindings: Escape cancel and enter saves
-Industry jobs: Now adds blueprints in use to the asset list
-Market orders: now adds remaining items from sell orders to the assets list
-Portable setting: save all files in program directory (see FAQ)
-New Column: Reprocessed value
-New Column: System security status
-Added volume to statusbar and table popup menu
Bug fixes:
-Fixed bug with invalid proxy settings
-Fixed bug with pos and industry jobs
-Fixed bug in save filter dialog
________________________________________________________________________________
_1.0.0__________________________________________________________________________
First stable release...
________________________________________________________________________________
________________________________________________________________________________
================================================
FILE: checkstyle.xml
================================================
================================================
FILE: credits.txt
================================================
######## #####
######## #######
### ### ###
# ######## # # #### ######### #### #### #### ##### ####
######## # # # ######### # # # # #
# ### # # #### ### ### #### #### #### # ####
# ######## #### # ### ### # # # # #
# ######## ## #### ### ### #### #### #### # ####
#
### #### #### #### ### ### ##### ####
# # # # # # # # #
# #### #### # # # # ####
# # # # # # # # #
#### # # #### ### ### # ####
________________________________________________________________________________
_CONTRIBUTORS___________________________________________________________________
Developers:
Niklas Kyster Rasmussen (Golden Gnu)
Dultas
Tsuro Tsero
Tester:
Huzid
Contributors:
Flaming Candle
Jochen Bedersdorfer
TryfanMan
Jan
Ima Sohmbadi
Saulvin
AnrDaemon
Madetara (Ray Kavier)
Kaylee Syntax
Inoruuk
Burberius
Lazaren
Boran Lordsworth
Ed Thelleres
Salartarium
WildGear
snipereagle1
Ansirane Solette
Retired Testers:
Varo Jan
Scrapyard Bob
Johann Hemphill
Tomasz (kitsibas) Wiktorski
________________________________________________________________________________
_SPECIAL_THANKS_________________________________________________________________
jEveAssets is heavily based on the user interface in EVE Asset Manager
Copyright:
William J. Rogers
Link:
http://wiki.heavyduck.com/EveAssetManager
License:
GNU Lesser General Public License (http://www.gnu.org/licenses/lgpl.html)
________________________________________________________________________________
_EVE-ONLINE_____________________________________________________________________
jEveAssets use EVE-Online API and SDE
Link:
Main site: https://www.eveonline.com
SDE: https://developers.eveonline.com/docs/services/sde/
API: https://developers.eveonline.com/api-explorer
SDE License:
©CCP hf. All rights reserved. Used with permission.
________________________________________________________________________________
_FUZZWORK_______________________________________________________________________
jEveAssets use the Fuzzwork API to get price data
Link:
https://market.fuzzwork.co.uk/api
________________________________________________________________________________
_JANICE_________________________________________________________________________
jEveAssets use the Janice API to get price data
Link:
https://janice.e-351.com/api/rest/docs/index.html
________________________________________________________________________________
_ZKILLBOARD_____________________________________________________________________
jEveAssets use zKillboard API to get price history
Link:
https://github.com/zKillboard/zKillboard/wiki/API-(Prices)
________________________________________________________________________________
_EVE_REF________________________________________________________________________
jEveAssets use Reference Data API to get missing item data
Link:
https://docs.everef.net/datasets/reference-data.html
________________________________________________________________________________
_HOBOLEAKS______________________________________________________________________
jEveAssets use Hoboleaks Data Export via EVE Ref to get missing item data
Link:
https://sde.hoboleaks.space
________________________________________________________________________________
_SILK_ICONS_____________________________________________________________________
jEveAssets use Silk Icons from famfamfam.com
Copyright:
Mark James
Link:
http://www.famfamfam.com/lab/icons/silk
License:
Creative Commons Attribution 3.0 License
http://creativecommons.org/licenses/by/3.0
________________________________________________________________________________
_GLAZED_LISTS___________________________________________________________________
jEveAssets use Glazed Lists to sort and filter tables
Link:
http://publicobject.com/glazedlists
License:
GNU Lesser General Public License (http://www.gnu.org/licenses/lgpl.html)
Mozilla Public License (http://www.mozilla.org/MPL/MPL-1.1.html)
________________________________________________________________________________
_SUPER_CSV______________________________________________________________________
jEveAssets use Super CSV to export CSV
Link:
http://super-csv.github.io/super-csv
License:
Apache License (http://www.apache.org/licenses/LICENSE-2.0)
________________________________________________________________________________
_EVE-ESI________________________________________________________________________
jEveAssets use eve-esi to get data from ESI
Link:
https://github.com/burberius/eve-esi
License:
Apache License (http://www.apache.org/licenses/LICENSE-2.0)
________________________________________________________________________________
_PRICING________________________________________________________________________
jEveAssets use the Pricing library to get price data
Link:
https://github.com/GoldenGnu/price
License:
GNU General Public License (http://www.gnu.org/copyleft/gpl.html)
________________________________________________________________________________
_ROUTING________________________________________________________________________
jEveAssets use the Routing library in the routing tool
Link:
https://github.com/GoldenGnu/routing
License:
GNU General Public License (http://www.gnu.org/copyleft/gpl.html)
________________________________________________________________________________
_GRAPH__________________________________________________________________________
EveAssets use the Graph library in the routing tool
Link:
https://github.com/GoldenGnu/graph
License:
GNU General Public License (http://www.gnu.org/copyleft/gpl.html)
________________________________________________________________________________
_TRANSLATIONS___________________________________________________________________
jEveAssets use the Translations library for i18n
Link:
https://github.com/GoldenGnu/translations
License:
GNU General Public License (http://www.gnu.org/copyleft/gpl.html)
________________________________________________________________________________
_SLF4J__________________________________________________________________________
jEveAssets use SLF4J as logging facade
Link:
http://www.slf4j.org
License:
MIT License (http://en.wikipedia.org/wiki/MIT_License)
________________________________________________________________________________
_LOGBACK________________________________________________________________________
jEveAssets use logback to log events and errors
Link:
https://logback.qos.ch
License:
GNU Lesser General Public License (http://www.gnu.org/licenses/lgpl.html)
________________________________________________________________________________
_SQLITE_________________________________________________________________________
jEveAssets use SQLite for database storage
Link:
https://github.com/xerial/sqlite-jdbc
License:
Apache License (http://www.apache.org/licenses/LICENSE-2.0)
________________________________________________________________________________
_JUNIT__________________________________________________________________________
jEveAssets use JUnit for unit testing
Link:
http://junit.org
License:
Eclipse Public License (https://junit.org/junit4/license.html)
________________________________________________________________________________
_LGOODDATEPICKER________________________________________________________________
jEveAssets use JCalendar to get user input as a Date
Link:
https://github.com/LGoodDatePicker/LGoodDatePicker
License:
MIT License (http://en.wikipedia.org/wiki/MIT_License)
________________________________________________________________________________
_JFREECHART_____________________________________________________________________
jEveAssets use JFreeChart to make charts
Link:
http://www.jfree.org/jfreechart
License:
GNU Lesser General Public License (http://www.gnu.org/licenses/lgpl.html)
________________________________________________________________________________
_FLATLAF _______________________________________________________________________
jEveAssets use FlatLaf for themes and enhanced support for mac os x environments
Link:
https://www.formdev.com/flatlaf
License:
Apache License (http://www.apache.org/licenses/LICENSE-2.0)
________________________________________________________________________________
_EVALEX_________________________________________________________________________
jEveAssets use EvalEx for formula columns
Link:
https://github.com/uklimaschewski/EvalEx
License:
MIT License (http://en.wikipedia.org/wiki/MIT_License)
________________________________________________________________________________
_PICOCLI________________________________________________________________________
jEveAssets use Picocli for the CLI
Link:
https://picocli.info
License:
Apache License (http://www.apache.org/licenses/LICENSE-2.0)
________________________________________________________________________________
_COPYRIGHT______________________________________________________________________
Copyright 2009-2026 Contributors (see above)
jEveAssets 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 2
of the License, or (at your option) any later version.
jEveAssets 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 jEveAssets; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
EVE ONLINE COPYRIGHT NOTICE:
EVE Online and the EVE logo are the registered trademarks of CCP hf. All rights
are reserved worldwide. All other trademarks are the property of their
respective owners. EVE Online, the EVE logo, EVE and all associated logos and
designs are the intellectual property of CCP hf. All artwork, screenshots,
characters, vehicles, storylines, world facts or other recognizable features
of the intellectual property relating to these trademarks are likewise the
intellectual property of CCP hf. CCP hf. has granted permission to jEveAssets
to use EVE Online and all associated logos and designs for promotional and
information purposes in this program but does not endorse, and is not in any
way affiliated with, jEveAsset. CCP is in no way responsible for the content
on or functioning of this website, nor can it be liable for any damage arising
from the use of this website.
________________________________________________________________________________
________________________________________________________________________________
================================================
FILE: data/agents.xml
================================================
================================================
FILE: data/flags.xml
================================================
================================================
FILE: data/items.xml
================================================
[File too large to display: 10.9 MB]
================================================
FILE: data/jumps.xml
================================================
================================================
FILE: data/locations.xml
================================================
================================================
FILE: data/npccorporation.xml
================================================
================================================
FILE: license.txt
================================================
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
Copyright (C)
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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
================================================
FILE: pom.xml
================================================
4.0.0
net.nikr
jeveassets
jar
8.1.3-SNAPSHOT
jeveassets
jEveAssets is an out-of-game asset manager for Eve-Online, written in Java
https://eve.nikr.net/jeveasset
GitHub
https://github.com/GoldenGnu/jeveassets/issues
niklas
Niklas Kyster Rasmussen
niklaskr@gmail.com
https://nikr.net/
+1
candle
jeveassets@candle.me.uk
+1
tryfan
TryfanMan
beders
Jochen Bedersdorfer
gavitron
Ima Sohmbadi
tsurotsero
Tsuro Tsero
GNU General Public License 2.0
http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
scm:svn:http://svn.candle.me.uk/nikr/jeveassets/trunk/
http://svn.candle.me.uk/nikr/jeveassets/trunk/
org.apache.maven.plugins
maven-jar-plugin
2.4
jeveassets
${main.class}
net.nikr.eve.jeveasset
true
lib
splash.jpg
org.apache.maven.plugins
maven-compiler-plugin
2.4
1000
1000
true
true
${project.build.sourceVersion}
${project.build.sourceVersion}
${project.build.sourceEncoding}
-Xlint
org.apache.maven.plugins
maven-resources-plugin
2.5
${project.build.sourceEncoding}
maven-antrun-plugin
1.7
process-resources
process-resources
run
copy-to-install
package
run
copy-profiles
process-resources
run
ant-contrib
ant-contrib
20020829
commons-net
commons-net
1.4.1
ant
ant-commons-net
1.6.5
org.apache.maven.plugins
maven-dependency-plugin
2.4
copy-dependencies
process-test-resources
copy-dependencies
junit,hamcrest
${project.build.directory}/lib
false
false
true
false
org.apache.maven.plugins
maven-site-plugin
3.3
org.codehaus.mojo
exec-maven-plugin
1.4.0
exec
java
-classpath
${main.class}
${arg1}
${arg2}
${edt.debug}
maven-assembly-plugin
2.4
${project.name}-${project.version}
false
src/main/assembly/assembly.xml
make-assembly
package
single
net.ju-n.maven.plugins
checksum-maven-plugin
1.4
files
verify
${project.build.directory}
*.txt
*.jar
*.properties
lib/*.jar
MD5
false
true
org.codehaus.mojo
wagon-maven-plugin
2.0.2
upload-delete
deploy
sshexec
true
eve-nikr-net
${upload.url}
rm -rf ${upload.program.delete}
upload-update
deploy
upload
${project.build.directory}
*.txt,*.jar,*.md5,lib/*,*.dat,*.php,*.properties,.htaccess,*.update
eve-nikr-net
sftp://${upload.url}
${upload.program.file}
upload-zip
deploy
upload
${project.build.directory}
*.zip
eve-nikr-net
sftp://${upload.url}
${upload.zip}
org.apache.maven.plugins
maven-deploy-plugin
2.8.1
true
org.codehaus.izpack
izpack-maven-plugin
5.0.3
izpack
package
izpack
true
installer
${project.build.directory}/install
${project.build.directory}/izpack/install.xml
org.apache.maven.plugins
maven-surefire-plugin
2.22.2
${tests.to.skip}
${janice}
false
org.jacoco
jacoco-maven-plugin
0.8.8
${project.build.directory}/jacoco
jacoco-initialize
prepare-agent
jacoco-report
package
report
org.apache.maven.wagon
wagon-ftp
3.5.2
org.apache.maven.wagon
wagon-ssh
3.5.2
src/main/resources
false
tools/izpack
false
**/install.xml
../install/izpack
tools/izpack
true
**/install.xml
../izpack
tools/update
true
**/github.update
**/update_version.dat
..
org.apache.maven.plugins
maven-javadoc-plugin
2.8.1
true
false
org.apache.maven.plugins
maven-jxr-plugin
2.3
org.apache.maven.plugins
maven-project-info-reports-plugin
2.4
false
false
index
dependencies
dependency-convergence
issue-tracking
license
modules
plugin-management
plugins
project-team
scm
summary
org.apache.maven.plugins
maven-surefire-report-plugin
2.12
org.apache.maven.plugins
maven-checkstyle-plugin
2.9.1
${basedir}/checkstyle.xml
checkstyle
org.codehaus.mojo
taglist-maven-plugin
2.4
Important Todo Work
fixme
ignoreCase
Todo Work
todo
ignoreCase
pending
ignoreCase
Workarounds and other none optimal code
xxx
ignoreCase
org.codehaus.mojo
findbugs-maven-plugin
3.0.5
true
true
target/site
org.apache.maven.plugins
maven-pmd-plugin
3.8
true
${project.build.sourceEncoding}
100
${project.build.sourceVersion}
**/*Bean.java
**/generated/*.java
target/generated-sources/stubs
true
NOTHING
RUN-portable
-portable
RUN-debug
-debug
RUN-edtdebug
RUN-lazysave
-lazysave
RUN-no-args-profiling
RUN-forceupdate
-debug
-forceupdate
RUN-noupdate
-debug
-noupdate
RUNCLI-update
-update
-portable
RUNCLI-export
-export
-portable
RUNCLI-help
-help
skip-online-tests
skip-online-tests
true
**/*OnlineTest.java
skip-all-tests
skip-all-tests
true
true
skip-online-price-tests
skip-online-price-tests
true
**/*PriceDataGetterOnlineTest.java
jdk11
false
11
11
jdk17
false
17
17
org.codehaus.izpack
izpack-maven-plugin
5.0.3
izpack
none
false
central
Maven Central
https://repo.maven.apache.org/maven2/
maven.nikr.net
maven.nikr.net
true
true
https://maven.nikr.net/
jitpack.io
https://jitpack.io
net.troja.eve
eve-esi
7.0.0
uk.me.candle
pricing
3.1.2
uk.me.candle
routing
2.0.0
uk.me.candle
translations
3.1.1
com.glazedlists
glazedlists
1.11.0
net.sf.supercsv
super-csv
2.4.0
junit
junit
4.13.2
test
org.hamcrest
hamcrest
2.2
test
org.slf4j
slf4j-api
2.0.16
org.slf4j
log4j-over-slf4j
2.0.16
org.slf4j
jcl-over-slf4j
2.0.16
org.slf4j
jul-to-slf4j
2.0.16
ch.qos.logback
logback-classic
1.3.15
ch.qos.logback
logback-core
1.3.15
org.jfree
jfreechart
1.5.3
com.github.lgooddatepicker
LGoodDatePicker
11.2.1
org.xerial
sqlite-jdbc
3.50.3.0
info.picocli
picocli
4.6.2
javax.xml.bind
jaxb-api
2.3.1
org.dom4j
dom4j
2.1.3
jaxen
jaxen
1.2.0
net.java.dev.jna
jna-platform
5.6.0
com.formdev
flatlaf
3.4.1
com.formdev
flatlaf-extras
3.4.1
com.udojava
EvalEx
2.7
com.github.umjammer
jlayer
1.0.2
UTF-8
1.8
1.8
net.nikr.eve.jeveasset.Main
-edtdebug
================================================
FILE: readme.txt
================================================
######## #####
######## #######
### ### ###
# ######## # # #### ######### #### #### #### ##### ####
######## # # # ######### # # # # #
# ### # # #### ### ### #### #### #### # ####
# ######## #### # ### ### # # # # #
# ######## ## #### ### ### #### #### #### # ####
#
### #### #### ## ### ## ## ####
# # # # # # # # # # #
#### #### #### # # # # ####
# # # # # # # # # #
# # #### # # ### # # ####
________________________________________________________________________________
_ABOUT__________________________________________________________________________
jEveAssets is an out-of-game asset manager for Eve-Online, written in Java
________________________________________________________________________________
_FAQ____________________________________________________________________________
Please see the online FAQ
Link:
https://wiki.jeveassets.org/faq
________________________________________________________________________________
_CONTACT________________________________________________________________________
www:
https://eve.nikr.net/jeveasset
email:
niklaskr@gmail.com
Eve-Online forum thread:
https://forums.eveonline.com/t/13255
Discord:
https://discord.gg/8kYZvbM
________________________________________________________________________________
________________________________________________________________________________
================================================
FILE: src/main/assembly/assembly.xml
================================================
bin
/
false
zip
${project.build.directory}
true
/jEveAssets/
*.txt
jeveassets.jar
jmemory.jar
*.properties
lib/*
data/*
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/CliExport.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.FilterList;
import ca.odell.glazedlists.matchers.Matcher;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import net.nikr.eve.jeveasset.data.api.my.MyAsset;
import net.nikr.eve.jeveasset.data.profile.ProfileData;
import net.nikr.eve.jeveasset.data.profile.ProfileManager;
import net.nikr.eve.jeveasset.data.sde.Item;
import net.nikr.eve.jeveasset.data.sde.StaticData;
import net.nikr.eve.jeveasset.data.settings.ExportSettings;
import net.nikr.eve.jeveasset.data.settings.Settings;
import net.nikr.eve.jeveasset.gui.shared.StringComparators;
import net.nikr.eve.jeveasset.gui.shared.filter.ExportTableData;
import net.nikr.eve.jeveasset.gui.shared.filter.Filter;
import net.nikr.eve.jeveasset.gui.shared.filter.FilterLogicalMatcher;
import net.nikr.eve.jeveasset.gui.shared.filter.SimpleTableFormat;
import net.nikr.eve.jeveasset.gui.shared.table.EnumTableColumn;
import net.nikr.eve.jeveasset.gui.shared.table.EnumTableFormatAdaptor;
import net.nikr.eve.jeveasset.gui.shared.table.EventListManager;
import net.nikr.eve.jeveasset.gui.shared.table.TableFormatFactory;
import net.nikr.eve.jeveasset.gui.tabs.assets.AssetsTab;
import net.nikr.eve.jeveasset.gui.tabs.contracts.ContractsTab;
import net.nikr.eve.jeveasset.gui.tabs.items.ItemsTab;
import net.nikr.eve.jeveasset.gui.tabs.jobs.IndustryJobsTab;
import net.nikr.eve.jeveasset.gui.tabs.journal.JournalTab;
import net.nikr.eve.jeveasset.gui.tabs.loadout.Loadout;
import net.nikr.eve.jeveasset.gui.tabs.loadout.LoadoutData;
import net.nikr.eve.jeveasset.gui.tabs.loadout.LoadoutsTab;
import net.nikr.eve.jeveasset.gui.tabs.materials.MaterialsData;
import net.nikr.eve.jeveasset.gui.tabs.materials.MaterialsTab;
import net.nikr.eve.jeveasset.gui.tabs.mining.MiningTab;
import net.nikr.eve.jeveasset.gui.tabs.orders.MarketOrdersTab;
import net.nikr.eve.jeveasset.gui.tabs.overview.Overview;
import net.nikr.eve.jeveasset.gui.tabs.overview.OverviewData;
import net.nikr.eve.jeveasset.gui.tabs.overview.OverviewTab;
import net.nikr.eve.jeveasset.gui.tabs.overview.OverviewTab.View;
import net.nikr.eve.jeveasset.gui.tabs.overview.OverviewTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.reprocessed.ReprocessedData;
import net.nikr.eve.jeveasset.gui.tabs.reprocessed.ReprocessedTab;
import net.nikr.eve.jeveasset.gui.tabs.routing.RoutingTab;
import net.nikr.eve.jeveasset.gui.tabs.slots.SlotsData;
import net.nikr.eve.jeveasset.gui.tabs.slots.SlotsTab;
import net.nikr.eve.jeveasset.gui.tabs.stockpile.StockpileData;
import net.nikr.eve.jeveasset.gui.tabs.stockpile.StockpileTab;
import net.nikr.eve.jeveasset.gui.tabs.tracker.TrackerTab;
import net.nikr.eve.jeveasset.gui.tabs.transaction.TransactionTab;
import net.nikr.eve.jeveasset.gui.tabs.tree.TreeData;
import net.nikr.eve.jeveasset.gui.tabs.tree.TreeTab;
import net.nikr.eve.jeveasset.gui.tabs.values.IskData;
import net.nikr.eve.jeveasset.gui.tabs.values.ValueTableTab;
import net.nikr.eve.jeveasset.io.online.PriceDataGetter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CliExport {
private static final Logger LOG = LoggerFactory.getLogger(CliExport.class);
public static enum ExportTool {
ASSETS("Assets", CliOptions.ASSETS, AssetsTab.NAME),
CONTRACTS("Contracts", CliOptions.CONTRACTS, ContractsTab.NAME),
INDUSTRY_JOBS("Industry Jobs", CliOptions.INDUSTRY_JOBS, IndustryJobsTab.NAME),
SLOTS("Slots", CliOptions.SLOTS, SlotsTab.NAME),
ISK("Isk", CliOptions.ISK, ValueTableTab.NAME),
ITEMS("Items", CliOptions.ITEMS, ItemsTab.NAME),
JOURNAL("Journal", CliOptions.JOURNAL, JournalTab.NAME),
LOADOUTS("Ship Fittings", CliOptions.LOADOUTS, LoadoutsTab.NAME),
MATERIALS("Materials", CliOptions.MATERIALS, MaterialsTab.NAME),
MARKET_ORDERS("Market Orders", CliOptions.MARKET_ORDERS, MarketOrdersTab.NAME),
MINING("Mining", CliOptions.MINING, MiningTab.NAME),
OVERVIEW_PLANETS("Overview Planets", CliOptions.OVERVIEW, OverviewTab.NAME),
OVERVIEW_STATIONS("Overview Stations", CliOptions.OVERVIEW, OverviewTab.NAME),
OVERVIEW_SYSTEMS("Overview Systems", CliOptions.OVERVIEW, OverviewTab.NAME),
OVERVIEW_CONSTELLATIONS("Overview Constellations", CliOptions.OVERVIEW, OverviewTab.NAME),
OVERVIEW_REGIONS("Overview Regions", CliOptions.OVERVIEW, OverviewTab.NAME),
OVERVIEW_GROUPS("Overview Groups", CliOptions.OVERVIEW, OverviewTab.NAME),
REPROCESSED("Reprocessed", CliOptions.REPROCESSED, ReprocessedTab.NAME),
ROUTING("Routing", CliOptions.ROUTING, RoutingTab.NAME),
SKILLS("Skills", CliOptions.SKILLS, ValueTableTab.NAME),
STOCKPILE("Stockpile", CliOptions.STOCKPILE, StockpileTab.NAME),
TRACKER("Tracker", CliOptions.TRACKER, TrackerTab.NAME),
TRANSACTIONS("Transactions", CliOptions.TRANSACTIONS, TransactionTab.NAME),
TREE_LOCATION("Tree Location", CliOptions.TREE_LOCATION, TreeTab.NAME),
TREE_CATEGORY("Tree Category", CliOptions.TREE_CATEGORY, TreeTab.NAME),
;
private final String name;
private final String exportName;
private final String toolName;
private ExportTool(String name, String exportName, String toolName) {
this.name = name;
this.exportName = exportName;
this.toolName = toolName;
}
public String getFilename() {
return name.replace(" ", "_").toLowerCase();
}
public String getName() {
return name;
}
public String getExportName() {
return exportName;
}
public String getToolName() {
return toolName;
}
}
int export() {
PriceDataGetter priceDataGetter = new PriceDataGetter();
priceDataGetter.load();
ProfileManager profileManager = new ProfileManager();
profileManager.searchProfile();
profileManager.loadActiveProfile();
ProfileData profileData = new ProfileData(profileManager);
profileData.updateEventLists();
int fails = 0;
for (Map.Entry> entry : CliOptions.get().getExportSettings().entrySet()) {
ExportTool tool = entry.getKey();
String toolName = tool.getToolName();
boolean ok;
for (ExportSettings exportSettings : entry.getValue()) {
switch (tool) {
case ASSETS:
ok = export(profileData.getAssetsEventList(), TableFormatFactory.assetTableFormat(), toolName, exportSettings);
break;
case CONTRACTS:
ok = export(profileData.getContractItemEventList(), TableFormatFactory.contractsTableFormat(), toolName, exportSettings);
break;
case INDUSTRY_JOBS:
ok = export(profileData.getIndustryJobsEventList(), TableFormatFactory.industryJobTableFormat(), toolName, exportSettings);
break;
case SLOTS:
ok = export(new SlotsData(profileManager, profileData).getData(), TableFormatFactory.slotTableFormat(), toolName, exportSettings);
break;
case ISK:
ok = export(new IskData(profileManager, profileData).getData(), TableFormatFactory.valueTableFormat(), toolName, exportSettings);
break;
case ITEMS:
ok = export(EventListManager.create(StaticData.get().getItems().values()), TableFormatFactory.itemTableFormat(), toolName, exportSettings);
break;
case JOURNAL:
ok = export(profileData.getJournalEventList(), TableFormatFactory.journalTableFormat(), toolName, exportSettings);
break;
case LOADOUTS:
ok = exportLoadout(profileManager, profileData, exportSettings, toolName);
break;
case MARKET_ORDERS:
ok = export(profileData.getMarketOrdersEventList(), TableFormatFactory.marketTableFormat(), toolName, exportSettings);
break;
case MATERIALS:
ok = export(new MaterialsData(profileManager, profileData).getData(CliOptions.get().getMaterialsOwner(), CliOptions.get().isMaterialsOre(), CliOptions.get().isMaterialsPI(), CliOptions.get().isMaterialsCommodity()), TableFormatFactory.materialTableFormat(), toolName, exportSettings);
break;
case MINING:
ok = export(profileData.getMiningEventList(), TableFormatFactory.miningTableFormat(), toolName, exportSettings);
break;
case OVERVIEW_STATIONS:
ok = exportOverview(profileManager, profileData, exportSettings, toolName, View.STATIONS);
break;
case OVERVIEW_PLANETS:
ok = exportOverview(profileManager, profileData, exportSettings, toolName, View.PLANETS);
break;
case OVERVIEW_SYSTEMS:
ok = exportOverview(profileManager, profileData, exportSettings, toolName, View.SYSTEMS);
break;
case OVERVIEW_CONSTELLATIONS:
ok = exportOverview(profileManager, profileData, exportSettings, toolName, View.CONSTELLATIONS);
break;
case OVERVIEW_REGIONS:
ok = exportOverview(profileManager, profileData, exportSettings, toolName, View.REGIONS);
break;
case OVERVIEW_GROUPS:
ok = exportOverview(profileManager, profileData, exportSettings, toolName, View.GROUPS);
break;
case REPROCESSED:
ok = exportReprocessed(profileManager, profileData, exportSettings, toolName);
break;
case ROUTING: //ToDo: Not a table tool
ok = false;
break;
case SKILLS:
ok = export(profileData.getSkillsEventList(), TableFormatFactory.skillsTableFormat(), toolName, exportSettings);
break;
case STOCKPILE:
ok = export(new StockpileData(profileManager, profileData).getData(), TableFormatFactory.stockpileTableFormat(), toolName, exportSettings);
break;
case TRACKER: //ToDo: Not a table tool
ok = false;
break;
case TRANSACTIONS:
ok = export(profileData.getTransactionsEventList(), TableFormatFactory.transactionTableFormat(), toolName, exportSettings);
break;
case TREE_LOCATION:
ok = export(new TreeData(profileManager, profileData).getDataLocations(), TableFormatFactory.treeTableFormat(), toolName, exportSettings);
break;
case TREE_CATEGORY:
ok = export(new TreeData(profileManager, profileData).getDataCategories(), TableFormatFactory.treeTableFormat(), toolName, exportSettings);
break;
default:
ok = false;
}
if (!ok) {
LOG.error(tool.getName() + " export failed");
fails++;
} else {
LOG.info(tool.getName() + " data exported");
}
}
}
StringBuilder builder = new StringBuilder();
if (CliOptions.get().getExportSettings().size() == fails) {
builder.append("Failed to export data");
} else {
builder.append("Data exported");
if (fails == 0) {
builder.append(" successfully");
} else {
builder.append(" with ");
builder.append(fails);
builder.append(" error");
if (fails > 1) {
builder.append("s");
}
}
builder.append(" to ");
builder.append(CliOptions.get().getOutputDirectory());
}
if (fails == 0) {
LOG.info(builder.toString());
} else {
LOG.warn(builder.toString());
}
return -fails; //Return negative exit code
}
private boolean exportLoadout(ProfileManager profileManager, ProfileData profileData, ExportSettings exportSettings, String toolName) {
Set loadoutsNames = CliOptions.get().getLoadoutsNames();
Set loadoutsIDs = CliOptions.get().getLoadoutsIDs();
EventList eventList = new LoadoutData(profileManager, profileData).getData();
if ((loadoutsNames != null && !loadoutsNames.isEmpty())
|| (loadoutsIDs != null && !loadoutsIDs.isEmpty())) {
FilterList filterList = new FilterList<>(eventList, new LoadoutMatcher(loadoutsNames, loadoutsIDs));
return export(filterList, TableFormatFactory.loadoutTableFormat(), toolName, exportSettings);
} else {
return export(eventList, TableFormatFactory.loadoutTableFormat(), toolName, exportSettings);
}
}
private boolean exportReprocessed(ProfileManager profileManager, ProfileData profileData, ExportSettings exportSettings, String toolName) {
Map- items = new HashMap<>();
Set typeIDs = CliOptions.get().getReprocessedIDs();
if (typeIDs != null) {
//IDs to Items
for (Integer typeID : typeIDs) {
Item item = StaticData.get().getItems().get(typeID);
if (item != null) {
items.put(item, 1L);
}
}
}
Set typeNames = CliOptions.get().getReprocessedNames();
if (typeNames != null && !typeNames.isEmpty()) {
if (typeNames.size() > 1) {
//Build {name, item} Cache
Map itemsNyName = new TreeMap<>(StringComparators.CASE_INSENSITIVE);
for (Item item : StaticData.get().getItems().values()) {
itemsNyName.put(item.getTypeName(), item);
}
//Names to Items
for (String typeName : typeNames) {
Item item = itemsNyName.get(typeName);
if (item != null) {
items.put(item, 1L);
}
}
} else {
String typeName = typeNames.iterator().next();
for (Item item : StaticData.get().getItems().values()) {
if (typeName.equalsIgnoreCase(item.getTypeName())) {
items.put(item, 1L);
break;
}
}
}
}
return export(new ReprocessedData(profileManager, profileData).getData(items), TableFormatFactory.reprocessedTableFormat(), toolName, exportSettings);
}
private boolean exportOverview(ProfileManager profileManager, ProfileData profileData, ExportSettings exportSettings, String toolName, View view) {
String owner = ""; //ToDo: Owner is not settable (yet?)
String filterName = exportSettings.getFilterName();
//Assets Filter
List filter;
if (filterName == null) {
filter = new ArrayList<>();
} else if (filterName.isEmpty()) {
filter = Settings.get().getCurrentTableFilters(ExportTool.ASSETS.getToolName());
} else {
filter = Settings.get().getTableFilters(ExportTool.ASSETS.getToolName()).get(filterName);
if (filter == null) {
LOG.error(toolName + ": No such saved filter (" + filterName + ")");
return false;
}
}
//Assets Filtered
FilterList filterList = new FilterList<>(profileData.getAssetsEventList(), new FilterLogicalMatcher<>(TableFormatFactory.assetTableFormat(), null, filter));
//Overview
EnumTableFormatAdaptor tableFormat = TableFormatFactory.overviewTableFormat();
OverviewTab.updateShownColumns(tableFormat, view);
return ExportTableData.exportEmpty(new OverviewData(profileManager, profileData).getData(filterList, owner, view), tableFormat, toolName, exportSettings);
}
private & EnumTableColumn
, Q> boolean export(EventList data, final SimpleTableFormat tableFormat, String toolName, ExportSettings exportSettings) {
return ExportTableData.exportAutoNoCache(data, tableFormat, toolName, exportSettings);
}
private static class LoadoutMatcher implements Matcher {
private final Set loadoutsNames = new TreeSet<>(StringComparators.CASE_INSENSITIVE);
private final Set loadoutsIDs;
public LoadoutMatcher(Set loadoutsNames, Set loadoutsIDs) {
if (loadoutsNames != null) {
this.loadoutsNames.addAll(loadoutsNames);
}
if (loadoutsIDs != null) {
this.loadoutsIDs = loadoutsIDs;
} else {
this.loadoutsIDs = new HashSet<>();
}
}
@Override
public boolean matches(Loadout item) {
if (loadoutsNames.contains(item.getShipItemName())) {
return true;
} else if (loadoutsNames.contains(item.getShipTypeName())) {
return true;
} else if (loadoutsIDs.contains(item.getShipTypeID())) {
return true;
}
return false;
}
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/CliOptions.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.nikr.eve.jeveasset.CliExport.ExportTool;
import net.nikr.eve.jeveasset.data.settings.ExportSettings;
import net.nikr.eve.jeveasset.data.settings.ExportSettings.ColumnSelection;
import net.nikr.eve.jeveasset.data.settings.ExportSettings.DecimalSeparator;
import net.nikr.eve.jeveasset.data.settings.ExportSettings.ExportFormat;
import net.nikr.eve.jeveasset.data.settings.ExportSettings.FilterSelection;
import net.nikr.eve.jeveasset.data.settings.ExportSettings.LineDelimiter;
import net.nikr.eve.jeveasset.data.settings.Settings;
import net.nikr.eve.jeveasset.gui.shared.Formatter;
import net.nikr.eve.jeveasset.io.shared.FileUtil;
import picocli.CommandLine;
import picocli.CommandLine.ArgGroup;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
import picocli.CommandLine.PicocliException;
@Command(sortOptions = false,
synopsisHeading = "",
customSynopsis = "Usage: java [-Djava.awt.headless=true] -jar jeveassets.jar [-h] [-v] [-p] [-z] [-u] [-e [OPTIONS]]",
description="%n -Djava.awt.headless=true Run without a GUI%n"
+ " Java parameter (must be specified before -jar)"
)
public class CliOptions {
private static final Logger LOG = Logger.getLogger(CliOptions.class.getName());
public static final String ASSETS = "assets";
public static final String CONTRACTS = "contracts";
public static final String INDUSTRY_JOBS = "industryjobs";
public static final String SLOTS = "slots";
public static final String ISK = "isk";
public static final String ITEMS = "items";
public static final String JOURNAL = "journal";
public static final String LOADOUTS = "fittings";
public static final String MATERIALS = "materials";
public static final String MARKET_ORDERS = "marketorders";
public static final String MINING = "mining";
public static final String OVERVIEW = "overview";
public static final String REPROCESSED = "reprocessed";
public static final String ROUTING = "routing"; //ToDo
public static final String SKILLS = "skills";
public static final String STOCKPILE = "stockpile";
public static final String TRACKER = "tracker"; //ToDo
public static final String TRANSACTIONS = "transactions";
public static final String TREE_LOCATION = "tree-location";
public static final String TREE_CATEGORY = "tree-category";
private static final String REPROCESSED_NAMES = "-"+REPROCESSED+"-names";
private static final String REPROCESSED_IDS = "-"+REPROCESSED+"-ids";
private static final String END_GROUP = "%n";
private static final String TOOLS_BEFORE = "Export ";
private static final String TOOLS_AFTER = " Data";
private static final String FILTER_BEFORE = "Use saved filter for ";
private static final String FILTER_AFTER = " export";
private static final String FILTER_CMD = "-filter";
private static final String FILTER_LABEL = "filter";
private static final String VIEW_BEFORE = "Use saved view for ";
private static final String VIEW_AFTER = " export";
private static final String VIEW_CMD = "-view";
private static final String VIEW_LABEL = "view";
private static final CliOptions CLI_OPTIONS = new CliOptions();
public static CliOptions get() {
return CLI_OPTIONS;
}
public static CommandLine set(final String[] args) {
CommandLine cmd = new CommandLine(CLI_OPTIONS);
try {
cmd.parseArgs(args);
} catch (PicocliException ex) {
LOG.log(Level.SEVERE, ex.getMessage(), ex);
System.exit(-1);
}
if (CLI_OPTIONS.help) {
cmd.setUsageHelpWidth(110);
cmd.setUsageHelpAutoWidth(true);
cmd.usage(System.out);
System.exit(0);
}
if (CLI_OPTIONS.version) {
System.out.println(Program.PROGRAM_NAME + " " + Program.PROGRAM_VERSION);
System.exit(0);
}
return cmd;
}
@Option(names = {"-h", "-help", "/?"}, usageHelp = true, description = "Display this help message")
boolean help;
@Option(names = {"-v", "-version"}, versionHelp = true, description = "Display version information")
boolean version;
@Option(names = {"-p", "-portable"}, description = "Run jEveAssets portable%nSave all data in the jEveAssets program directory ")
boolean portable;
@Option(names = {"-z", "-lazysave"}, description = "Only save to disk on update and exit%n"
+ " Warning:%n"
+ " This may cause you to lose data if jEveAssets exit unexpectedly" + END_GROUP)
boolean lazySave;
@ArgGroup(exclusive = false, heading = "Update Options:%n")
UpdateOptions updateOptions;
static class UpdateOptions {
@Option(names = { "-u", "-update"}, required = true, description = "Update Data%nUpdate all profiles and accounts%nAll data with cache expired will be updated" + END_GROUP)
boolean update;
}
@ArgGroup(exclusive = false, heading = "Export Options:%n")
ExportOptions exportOptions;
//-u -e -html -csv -sql
//-u -e -html -csv -sql -nodate
//-u -e -html -csv -sql -nodate -assets-filter "Propulsion Modules" -reprocessed-ids 12066 -reprocessed-names "100MN Afterburner II"
//-e -a -html -nodate -assets-filter "Propulsion Modules" -assets-view "Simple"
//-e -a -html -nodate -assets-filter -assets-view
public static class ExportOptions {
@Option(names = { "-e", "-export"}, required = true, description = "Export Data%n")
boolean export;
@Option(names = { "-f", "-output" }, paramLabel = "directory", description = "Output directory")
File output;
@Option(names = "-nodate", description = "Do not include date and time in the filenames")
boolean noDate;
@Option(names = "-noformula", description = "Do not include formula columns")
boolean noFormulas;
@Option(names = "-nojumps", description = "Do not include jump columns"
+ END_GROUP + "%nFormat Help:%nYou can select as many formats as you want")
boolean noJumps;
@ArgGroup(exclusive = false)
ExportOptionsFormat exportOptionsFormat;
@ArgGroup(exclusive = false)
ExportOptionsTools tools;
@ArgGroup(exclusive = false)
ExportOptionsFilters filters = new ExportOptionsFilters();
@ArgGroup(exclusive = false)
ExportOptionsView views = new ExportOptionsView();
}
static class ExportOptionsFormat {
@ArgGroup(exclusive = false)
ExportOptionsCsv csv;
@ArgGroup(exclusive = false)
ExportOptionsHtml html;
@ArgGroup(exclusive = false)
ExportOptionsSql sql;
}
static class ExportOptionsCsv {
@Option(names = "-csv", required = true, description = "Export to CSV (default)")
boolean csv;
@Option(names = "-comma", description = " Use comma as decimal separator and semicolon as field delimiter%n"
+ " Default is dot as decimal separator and comma as field delimiter")
boolean comma;
@ArgGroup(exclusive = true)
ExportOptionsLine line;
}
static class ExportOptionsLine {
@Option(names = "-dos", description = " Use DOS (\\r\\n) line terminator (default)")
boolean dos;
@Option(names = "-unix", description = " Use UNIX (\\n) line terminator")
boolean unix;
@Option(names = "-mac", description = " Use MAC (\\r) line terminator"
+ END_GROUP)
boolean mac;
}
static class ExportOptionsHtml {
@Option(names = "-html", required = true, description = "Export to HTML")
boolean html;
@Option(names = "-nostyle", description = " Do not style the HTML" )
boolean noStyle;
@Option(names = "-igb", description = " Add in-game browser links")
boolean igb;
@Option(names = "-header", arity = "1", paramLabel = "row", description = " Header every X row"
+ END_GROUP)
int headers = 0;
}
static class ExportOptionsSql {
@Option(names = "-sql", required = true, description = "Export to SQL")
boolean sql;
@Option(names = "-droptable", description = " Drop Table (if exist)")
boolean dropTable;
@Option(names = "-createtable", description = " Create Table (if not exist)")
boolean createTable;
@Option(names = "-extended", description = " Extended Inserts"
+ END_GROUP +"%nTools Help:%nOmit all the tool parameters to export all tools")
boolean extendedInserts;
}
static class ExportOptionsTools {
/**
* Free letters: b w
*/
@Option(names = {"-a" ,"-"+ASSETS}, description = TOOLS_BEFORE+"Assets"+TOOLS_AFTER)
boolean assets;
@Option(names = {"-c" ,"-"+CONTRACTS}, description = TOOLS_BEFORE+"Contracts"+TOOLS_AFTER)
boolean contracts;
@Option(names = {"-i" ,"-"+INDUSTRY_JOBS}, description = TOOLS_BEFORE+"Industry Jobs"+TOOLS_AFTER)
boolean industryJobs;
@Option(names = {"-n" ,"-"+SLOTS}, description = TOOLS_BEFORE+"Slots"+TOOLS_AFTER)
boolean slots;
@Option(names = {"-k" ,"-"+ISK}, description = TOOLS_BEFORE+"Isk"+TOOLS_AFTER)
boolean isk;
@Option(names = {"-x" ,"-"+ITEMS}, description = TOOLS_BEFORE+"Items"+TOOLS_AFTER)
boolean items;
@Option(names = {"-j" ,"-"+JOURNAL}, description = TOOLS_BEFORE+"Journal"+TOOLS_AFTER)
boolean journal;
@Option(names = {"-y" ,"-"+LOADOUTS}, description = TOOLS_BEFORE+"Ship Fittings"+TOOLS_AFTER)
boolean loadouts;
@Option(names = {"-m" ,"-"+MATERIALS}, description = TOOLS_BEFORE+"Materials"+TOOLS_AFTER)
boolean materials;
@Option(names = {"-o" ,"-"+MARKET_ORDERS}, description = TOOLS_BEFORE+"Market Orders"+TOOLS_AFTER)
boolean marketOrders;
@Option(names = {"-d" ,"-"+MINING}, description = TOOLS_BEFORE+"Mining"+TOOLS_AFTER)
boolean mining;
@Option(names = {"-q" ,"-"+SKILLS}, description = TOOLS_BEFORE+"Skills"+TOOLS_AFTER)
boolean skills;
@Option(names = {"-s" ,"-"+STOCKPILE}, description = TOOLS_BEFORE+"Stockpile"+TOOLS_AFTER)
boolean stockpile;
@Option(names = {"-t" ,"-"+TRANSACTIONS}, description = TOOLS_BEFORE+"Transaction"+TOOLS_AFTER)
boolean transaction;
@Option(names = {"-g" ,"-"+TREE_CATEGORY}, description = TOOLS_BEFORE+"Tree Category"+TOOLS_AFTER)
boolean treeCategory;
@Option(names = {"-l" ,"-"+TREE_LOCATION}, description = TOOLS_BEFORE+"Tree Location"+TOOLS_AFTER)
boolean treeLocation;
@Option(names = {"-vs", "-"+OVERVIEW+"-stations"}, description = TOOLS_BEFORE+"Overview Stations"+TOOLS_AFTER)
boolean overviewStations;
@Option(names = {"-vp", "-"+OVERVIEW+"-planets"}, description = TOOLS_BEFORE+"Overview Planets"+TOOLS_AFTER)
boolean overviewPlanets;
@Option(names = {"-vy", "-"+OVERVIEW+"-systems"}, description = TOOLS_BEFORE+"Overview Systems"+TOOLS_AFTER)
boolean overviewSystems;
@Option(names = {"-vc", "-"+OVERVIEW+"-constellations"}, description = TOOLS_BEFORE+"Overview Constellations"+TOOLS_AFTER)
boolean overviewConstellations;
@Option(names = {"-vr", "-"+OVERVIEW+"-regions"}, description = TOOLS_BEFORE+"Overview Regions"+TOOLS_AFTER)
boolean overviewRegions;
@Option(names = {"-vg", "-"+OVERVIEW+"-groups"}, description = TOOLS_BEFORE+"Overview Groups"+TOOLS_AFTER)
boolean overviewGroups;
@Option(names = {"-rn",REPROCESSED_NAMES}, arity = "1..", split = ",", paramLabel = "typeName", description = TOOLS_BEFORE+"Reprocessed"+TOOLS_AFTER+" for typeName(s)")
Set reprocessedNames;
@Option(names = {"-ri",REPROCESSED_IDS}, arity = "1..", split = ",", paramLabel = "typeID", description = TOOLS_BEFORE+"Reprocessed"+TOOLS_AFTER+" for typeID(s)"
+ END_GROUP + END_GROUP + "%nFilters Help:%nOmit the parameter value to use the current filter%nOmit the parameter to use no filter")
Set reprocessedIDs;
}
static class ExportOptionsFilters {
@Option(names = "-"+ASSETS+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Assets"+FILTER_AFTER)
String assetsFilter;
@Option(names = "-"+CONTRACTS+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Contracts"+FILTER_AFTER)
String contractsFilter;
@Option(names = "-"+INDUSTRY_JOBS+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Industry Jobs"+FILTER_AFTER)
String industryJobsFilter;
@Option(names = "-"+SLOTS+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Slots"+FILTER_AFTER)
String slotsFilter;
@Option(names = "-"+ISK+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Isk"+FILTER_AFTER)
String iskFilter;
@Option(names = "-"+ITEMS+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Items"+FILTER_AFTER)
String itemsFilter;
@Option(names = "-"+JOURNAL+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Journal"+FILTER_AFTER)
String journalFilter;
@Option(names = "-"+LOADOUTS+"-names", arity = "1..", split = ",", paramLabel = "typeName|itemName", description = "Export Ship Fittings matching ships typeName or itemName")
Set loadoutsNames;
@Option(names = "-"+LOADOUTS+"-ids", arity = "1..", split = ",", paramLabel = "typeID", description = "Export Ship Fittings matching ships typeID")
Set loadoutsIDs;
@Option(names = "-"+MATERIALS+"-owner", fallbackValue = "", arity = "0..1", paramLabel = "owner", description = "Materials owner name")
String materialsOwner;
@Option(names = "-"+MATERIALS+"-pi", fallbackValue = "", description = "Materials include PI")
boolean materialsPI;
@Option(names = "-"+MATERIALS+"-ore", fallbackValue = "", description = "Materials include Ore")
boolean materialsOre;
@Option(names = "-"+MATERIALS+"-commodity", fallbackValue = "", description = "Materials include Commodity")
boolean materialsCommodity;
@Option(names = "-"+MARKET_ORDERS+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Market Orders"+FILTER_AFTER)
String marketOrdersFilter;
@Option(names = "-"+MINING+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Mining"+FILTER_AFTER)
String miningFilter;
//Reprocesseddoes not support filters
@Option(names = "-"+OVERVIEW+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Asset filter to use with Overview")
String overviewFilter;
@Option(names = "-"+SKILLS+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Skills"+FILTER_AFTER)
String skillsFilter;
@Option(names = "-"+STOCKPILE+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Stockpile"+FILTER_AFTER)
String stockpileFilter;
@Option(names = "-"+TRANSACTIONS+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Transaction"+FILTER_AFTER)
String transactionFilter;
@Option(names = "-"+TREE_CATEGORY+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Tree Category"+FILTER_AFTER)
String treeFilterCategory;
@Option(names = "-"+TREE_LOCATION+FILTER_CMD, fallbackValue = "", arity = "0..1", paramLabel = FILTER_LABEL, description = FILTER_BEFORE+"Tree Location"+FILTER_AFTER
+ END_GROUP + END_GROUP + "%nViews Help:%nOmit the parameter value to use the current columns%nOmit the parameter to include all columns")
String treeFilterLocation;
}
static class ExportOptionsView {
@Option(names = "-"+ASSETS+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Assets"+VIEW_AFTER)
String assetsView;
@Option(names = "-"+CONTRACTS+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Contracts"+VIEW_AFTER)
String contractsView;
@Option(names = "-"+INDUSTRY_JOBS+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Industry Jobs"+VIEW_AFTER)
String industryJobsView;
@Option(names = "-"+SLOTS+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Slots"+VIEW_AFTER)
String slotsView;
@Option(names = "-"+ISK+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Isk"+VIEW_AFTER)
String iskView;
@Option(names = "-"+ITEMS+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Items"+VIEW_AFTER)
String itemsView;
@Option(names = "-"+JOURNAL+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Journal"+VIEW_AFTER)
String journalView;
//Loadouts does not support views
@Option(names = "-"+MATERIALS+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Materials"+VIEW_AFTER)
String materialsView;
@Option(names = "-"+MARKET_ORDERS+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Market Orders"+VIEW_AFTER)
String marketOrdersView;
@Option(names = "-"+MINING+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Mining"+VIEW_AFTER)
String miningView;
@Option(names = "-"+REPROCESSED+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Reprocessed"+VIEW_AFTER)
String reprocessedView;
//Overview does not support views
@Option(names = "-"+SKILLS+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Skills"+VIEW_AFTER)
String skillsView;
@Option(names = "-"+STOCKPILE+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Stockpile"+VIEW_AFTER)
String stockpileView;
@Option(names = "-"+TRANSACTIONS+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Transaction"+VIEW_AFTER)
String transactionView;
@Option(names = "-"+TREE_CATEGORY+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Tree Category"+VIEW_AFTER)
String treeViewCategory;
@Option(names = "-"+TREE_LOCATION+VIEW_CMD, fallbackValue = "", arity = "0..1", paramLabel = VIEW_LABEL, description = VIEW_BEFORE+"Tree Location"+VIEW_AFTER
+ END_GROUP + END_GROUP)
String treeViewLocation;
}
@ArgGroup(exclusive = false, heading = "Development Options (use at your own risk):%n")
DevOptions devOptions;
static class DevOptions {
@Option(names = { "-debug" }, description = "Dev Command: Enable debug logging and other debug shenanigans")
boolean debug;
@Option(names = { "-edtdebug" }, description = "Dev Command: Detect painting outside EDT")
boolean edtdebug;
@Option(names = { "-noupdate" }, description = "Dev Command: Disable all updates")
boolean forceNoUpdate;
@Option(names = { "-forceupdate" }, description = "Dev Command: Ignore update times%n"
+ " Warning:%n"
+ " Using -forceupdate may get you banned from ESI%n"
+ " It does not give you access to any new data%n"
+ " You will just get a cached result and a lot of bad karma… ")
boolean forceUpdate;
@Option(names = { "-jmemory" }, description = "Dev Command: Notify jEveAssets It's being run with jmemory.jar")
boolean jMemory;
}
private Map> settings = null;
public Map> getExportSettings() {
if (settings == null) {
settings = new HashMap<>();
if (exportOptions == null) {
return settings;
}
ExportOptionsTools tools = exportOptions.tools;
ExportOptionsFilters filters = exportOptions.filters;
ExportOptionsView views = exportOptions.views;
if (tools == null || tools.assets) createExportSettings(ExportTool.ASSETS, filters.assetsFilter, views.assetsView);
if (tools == null || tools.contracts) createExportSettings(ExportTool.CONTRACTS, filters.contractsFilter, views.contractsView);
if (tools == null || tools.industryJobs) createExportSettings(ExportTool.INDUSTRY_JOBS, filters.industryJobsFilter, views.industryJobsView);
if (tools == null || tools.slots) createExportSettings(ExportTool.SLOTS, filters.slotsFilter, views.slotsView);
if (tools == null || tools.isk) createExportSettings(ExportTool.ISK, filters.iskFilter, views.iskView);
if (tools == null || tools.items) createExportSettings(ExportTool.ITEMS, filters.itemsFilter, views.itemsView);
if (tools == null || tools.journal) createExportSettings(ExportTool.JOURNAL, filters.journalFilter, views.journalView);
if (tools == null || tools.loadouts) createExportSettings(ExportTool.LOADOUTS, null, null);
if (tools == null || tools.materials) createExportSettings(ExportTool.MATERIALS, filters.materialsOwner, views.materialsView);
if (tools == null || tools.marketOrders) createExportSettings(ExportTool.MARKET_ORDERS, filters.marketOrdersFilter, views.marketOrdersView);
if (tools == null || tools.mining) createExportSettings(ExportTool.MINING, filters.miningFilter, views.miningView);
if (tools != null && (tools.reprocessedIDs != null || tools.reprocessedNames != null)) createExportSettings(ExportTool.REPROCESSED, null, views.reprocessedView);
if (tools == null || tools.overviewStations) createExportSettings(ExportTool.OVERVIEW_STATIONS, filters.overviewFilter, null);
if (tools == null || tools.overviewPlanets) createExportSettings(ExportTool.OVERVIEW_PLANETS, filters.overviewFilter, null);
if (tools == null || tools.overviewSystems) createExportSettings(ExportTool.OVERVIEW_SYSTEMS, filters.overviewFilter, null);
if (tools == null || tools.overviewConstellations) createExportSettings(ExportTool.OVERVIEW_CONSTELLATIONS, filters.overviewFilter, null);
if (tools == null || tools.overviewRegions) createExportSettings(ExportTool.OVERVIEW_REGIONS, filters.overviewFilter, null);
if (tools == null || tools.overviewGroups) createExportSettings(ExportTool.OVERVIEW_GROUPS, filters.overviewFilter, null);
if (tools == null || tools.skills) createExportSettings(ExportTool.SKILLS, filters.skillsFilter, views.skillsView);
if (tools == null || tools.stockpile) createExportSettings(ExportTool.STOCKPILE, filters.stockpileFilter, views.stockpileView);
if (tools == null || tools.transaction) createExportSettings(ExportTool.TRANSACTIONS, filters.transactionFilter, views.transactionView);
if (tools == null || tools.treeLocation) createExportSettings(ExportTool.TREE_LOCATION, filters.treeFilterLocation, views.treeViewLocation);
if (tools == null || tools.treeCategory) createExportSettings(ExportTool.TREE_CATEGORY, filters.treeFilterCategory, views.treeViewCategory);
}
return settings;
}
private void createExportSettings(ExportTool exportTool, String filterName, String viewName) {
ExportOptionsFormat exportOptionsFormat = exportOptions.exportOptionsFormat;
if (exportOptionsFormat != null) {
//CSV
if (exportOptionsFormat.csv != null && exportOptionsFormat.csv.csv) {
ExportSettings exportSettings = new ExportSettings(exportTool.getToolName());
if (exportOptionsFormat.csv.comma) {
exportSettings.setDecimalSeparator(DecimalSeparator.COMMA);
}
if (exportOptionsFormat.csv.line != null) {
if (exportOptionsFormat.csv.line.unix) {
exportSettings.setCsvLineDelimiter(LineDelimiter.UNIX);
} else if (exportOptionsFormat.csv.line.mac) {
exportSettings.setCsvLineDelimiter(LineDelimiter.MAC);
}
}
set(exportSettings, exportTool, ExportFormat.CSV, filterName, viewName);
}
//HTML
if (exportOptionsFormat.html != null && exportOptionsFormat.html.html) {
ExportSettings exportSettings = new ExportSettings(exportTool.getToolName());
exportSettings.setHtmlRepeatHeader(exportOptionsFormat.html.headers);
exportSettings.setHtmlIGB(exportOptionsFormat.html.igb);
exportSettings.setHtmlStyled(!exportOptionsFormat.html.noStyle);
set(exportSettings, exportTool, ExportFormat.HTML, filterName, viewName);
}
//SQL
if (exportOptionsFormat.sql != null && exportOptionsFormat.sql.sql) {
ExportSettings exportSettings = new ExportSettings(exportTool.getToolName());
exportSettings.setSqlDropTable(exportOptionsFormat.sql.dropTable);
exportSettings.setSqlCreateTable(exportOptionsFormat.sql.createTable);
exportSettings.setSqlExtendedInserts(exportOptionsFormat.sql.extendedInserts);
exportSettings.setSqlTableName(Settings.get().getExportSettings(exportTool.getToolName()).getSqlTableName());
set(exportSettings, exportTool, ExportFormat.SQL, filterName, viewName);
}
} else { //Default CSV
set(new ExportSettings(exportTool.getToolName()), exportTool, ExportFormat.CSV, filterName, viewName);
}
}
private void set(ExportSettings exportSettings, ExportTool exportTool, ExportFormat exportFormat, String filterName, String viewName) {
StringBuilder builder = new StringBuilder();
builder.append(getOutputDirectory());
builder.append(File.separator);
if (!exportOptions.noDate) {
builder.append(Formatter.fileDate(new Date()));
builder.append("_");
}
builder.append(exportTool.getFilename());
builder.append("_export.");
builder.append(exportFormat.getExtension());
exportSettings.setFilename(builder.toString());
//Format
exportSettings.setExportFormat(exportFormat);
//Filter
if (filterName == null) {
exportSettings.setFilterName("");
exportSettings.setFilterSelection(FilterSelection.NONE);
} else if (filterName.isEmpty()) {
exportSettings.setFilterName("");
exportSettings.setFilterSelection(FilterSelection.CURRENT);
} else {
exportSettings.setFilterName(filterName);
exportSettings.setFilterSelection(FilterSelection.SAVED);
}
//Formula Columns
exportSettings.setFormulas(!exportOptions.noFormulas);
//Jump Columns
exportSettings.setJumps(!exportOptions.noJumps);
//Columns
if (viewName == null) { //All columns
exportSettings.setColumnSelection(ColumnSelection.SELECTED);
exportSettings.putTableExportColumns(null); //null = all
exportSettings.setViewName(null);
} else if (viewName.isEmpty()) { //Current shown columns in order
exportSettings.setColumnSelection(ColumnSelection.SHOWN);
exportSettings.setViewName(null);
} else { //Saved View
exportSettings.setColumnSelection(ColumnSelection.SAVED);
exportSettings.setViewName(viewName);
}
//Add
List list = settings.get(exportTool);
if (list == null) {
list = new ArrayList<>();
settings.put(exportTool, list);
}
list.add(exportSettings);
}
public String getMaterialsOwner() {
if (exportOptions == null || exportOptions.filters == null
|| exportOptions.filters.materialsOwner == null || exportOptions.filters.materialsOwner.isEmpty()) {
return null;
}
return exportOptions.filters.materialsOwner;
}
public boolean isMaterialsPI() {
if (exportOptions == null || exportOptions.filters == null) {
return false;
}
return exportOptions.filters.materialsPI;
}
public boolean isMaterialsOre() {
if (exportOptions == null || exportOptions.filters == null) {
return false;
}
return exportOptions.filters.materialsOre;
}
public boolean isMaterialsCommodity() {
if (exportOptions == null || exportOptions.filters == null) {
return false;
}
return exportOptions.filters.materialsCommodity;
}
public Set getReprocessedNames() {
if (exportOptions == null
|| exportOptions.tools == null
|| exportOptions.tools.reprocessedNames == null
|| exportOptions.tools.reprocessedNames.isEmpty()) {
return null;
}
return exportOptions.tools.reprocessedNames;
}
public Set getReprocessedIDs() {
if (exportOptions == null
|| exportOptions.tools == null
|| exportOptions.tools.reprocessedIDs == null
|| exportOptions.tools.reprocessedIDs.isEmpty()) {
return null;
}
return exportOptions.tools.reprocessedIDs;
}
public Set getLoadoutsNames() {
if (exportOptions == null
|| exportOptions.filters == null
|| exportOptions.filters.loadoutsNames == null
|| exportOptions.filters.loadoutsNames.isEmpty()) {
return null;
}
return exportOptions.filters.loadoutsNames;
}
public Set getLoadoutsIDs() {
if (exportOptions == null
|| exportOptions.filters == null
|| exportOptions.filters.loadoutsIDs == null
|| exportOptions.filters.loadoutsIDs.isEmpty()) {
return null;
}
return exportOptions.filters.loadoutsIDs;
}
public File getOutputDirectory() {
//Output
if (exportOptions.output == null) {
exportOptions.output = new File(FileUtil.getPathExports());
}
return exportOptions.output;
}
public boolean isPortable() {
return portable;
}
public boolean isLazySave() {
return lazySave;
}
public boolean isDebug() {
if (devOptions == null) {
return false;
}
return devOptions.debug;
}
public boolean isEDTdebug() {
if (devOptions == null) {
return false;
}
return devOptions.edtdebug;
}
public boolean isForceNoUpdate() {
if (devOptions == null) {
return false;
}
return devOptions.debug && devOptions.forceNoUpdate;
}
public boolean isForceUpdate() {
if (devOptions == null) {
return false;
}
return devOptions.debug && devOptions.forceUpdate;
}
public boolean isUpdate() {
if (updateOptions == null) {
return false;
}
return updateOptions.update;
}
public boolean isCLI() {
return isUpdate() || isExport();
}
public boolean isExport() {
if (exportOptions == null) {
return false;
}
return exportOptions.export;
}
public boolean isJmemory() {
if (devOptions == null) {
return false;
}
return devOptions.jMemory;
}
public void setPortable(boolean portable) {
this.portable = portable;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/CliUpdate.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import net.nikr.eve.jeveasset.data.profile.Profile;
import net.nikr.eve.jeveasset.data.profile.ProfileData;
import net.nikr.eve.jeveasset.data.profile.ProfileManager;
import net.nikr.eve.jeveasset.data.settings.Settings;
import net.nikr.eve.jeveasset.data.settings.TrackerData;
import net.nikr.eve.jeveasset.gui.dialogs.update.UpdateDialog.PriceDataTask;
import net.nikr.eve.jeveasset.gui.dialogs.update.UpdateDialog.Step1Task;
import net.nikr.eve.jeveasset.gui.dialogs.update.UpdateDialog.Step2Task;
import net.nikr.eve.jeveasset.gui.dialogs.update.UpdateDialog.Step3Task;
import net.nikr.eve.jeveasset.gui.dialogs.update.UpdateDialog.Step4Task;
import net.nikr.eve.jeveasset.gui.dialogs.update.UpdateTask;
import net.nikr.eve.jeveasset.gui.tabs.values.AssetValue;
import net.nikr.eve.jeveasset.gui.tabs.values.DataSetCreator;
import net.nikr.eve.jeveasset.io.online.PriceDataGetter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CliUpdate {
private static final Logger LOG = LoggerFactory.getLogger(CliUpdate.class);
int update() {
PriceDataGetter priceDataGetter = new PriceDataGetter();
priceDataGetter.load();
ProfileManager profileManager = new ProfileManager();
profileManager.searchProfile();
SplashUpdater.setText("Updating DATA");
SplashUpdater.setProgress(0);
int count = 0;
Date date = Settings.getNow();
boolean ok = true;
for (Profile profile : profileManager.getProfiles()) {
profileManager.setActiveProfile(profile);
if (!profile.load()) {
LOG.warn("Failed to load profile");
count++;
SplashUpdater.setProgress( (int)(count * 100.0 / profileManager.getProfiles().size()));
continue; //Error loading profile
}
ProfileData profileData = new ProfileData(profileManager);
profileData.updateEventLists();
List updateTasks = new ArrayList<>();
updateTasks.add(new Step1Task(profileManager));
updateTasks.add(new Step2Task(profileManager, true, true, true, true, true, true, true, true, true, true, true, true));
updateTasks.add(new Step3Task(profileManager, true));
updateTasks.add(new Step4Task(profileManager));
updateTasks.add(new PriceDataTask(priceDataGetter, profileData, false));
for (UpdateTask updateTask : updateTasks) {
updateTask.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
SplashUpdater.setSubProgress(updateTask.getProgress());
}
});
SplashUpdater.setSubProgress(0);
updateTask.update();
if (updateTask.hasError()) {
ok = false;
}
}
//Update tracker locations
AssetValue.updateData();
//Update eventlists
profileData.updateEventLists();
//Create value tracker point
DataSetCreator.createTrackerDataPoint(profileData, date);
TrackerData.save("Added", true);
//Save settings
Settings.saveSettings();
//Save profile
profile.save();
//Clean up
profile.clear();
//Progress
count++;
SplashUpdater.setProgress( (int)(count * 100.0 / profileManager.getProfiles().size()));
}
if (ok) {
LOG.info("Data updated successfully");
return 0;
} else {
LOG.info("Data updated with errors");
return -1; //on error
}
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/DetectEdtViolationRepaintManager.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset;
import javax.swing.JComponent;
import javax.swing.RepaintManager;
import javax.swing.SwingUtilities;
import org.slf4j.LoggerFactory;
public class DetectEdtViolationRepaintManager extends RepaintManager {
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(Program.class);
/**
* Used to ensure we only print a stack trace once per abusing thread. May
* be null if the option is disabled.
*/
private ThreadLocal alreadyWarnedLocal;
/**
* Installs a new instance of DetectEdtViolationRepaintManager which does
* not warn repeatedly, as the current repaint manager.
*/
public static void install() {
install(false);
}
/**
* Installs a new instance of DetectEdtViolationRepaintManager as the
* current repaint manager.
*
* @param warnRepeatedly whether multiple warnings should be logged for each
* violating thread
*/
public static void install(boolean warnRepeatedly) {
RepaintManager.setCurrentManager(new DetectEdtViolationRepaintManager(warnRepeatedly));
LOG.info("Installed new DetectEdtViolationRepaintManager");
}
/**
* Creates a new instance of DetectEdtViolationRepaintManager.
*
* @param warnRepeatedly whether multiple warnings should be logged for each
* violating thread
*/
private DetectEdtViolationRepaintManager(boolean warnRepeatedly) {
if (!warnRepeatedly) {
this.alreadyWarnedLocal = new ThreadLocal();
}
}
/**
* {@inheritDoc}
*/
@Override
public synchronized void addInvalidComponent(JComponent component) {
checkThreadViolations();
super.addInvalidComponent(component);
}
/**
* {@inheritDoc}
*/
@Override
public synchronized void addDirtyRegion(JComponent component, int x, int y,
int w, int h) {
checkThreadViolations();
super.addDirtyRegion(component, x, y, w, h);
}
/**
* Checks if the calling thread is called in the event dispatch thread. If
* not an exception will be printed to the console.
*/
private void checkThreadViolations() {
if (alreadyWarnedLocal != null && Boolean.TRUE.equals(alreadyWarnedLocal.get())) {
return;
}
if (!SwingUtilities.isEventDispatchThread()) {
if (alreadyWarnedLocal != null) {
alreadyWarnedLocal.set(Boolean.TRUE);
}
LOG.warn("painting on non-EDT thread", new Exception());
}
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/LibraryManager.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.swing.JOptionPane;
import net.nikr.eve.jeveasset.io.online.Updater;
import net.nikr.eve.jeveasset.io.shared.FileUtilSimple;
public class LibraryManager {
private static Set files = null;
public static void checkLibraries() {
checkMissing();
purge();
}
private static void purge() {
File lib = new File(FileUtilSimple.getPathLib());
List delete = new ArrayList<>();
int libsFiles = 0;
for (File file : lib.listFiles()) {
if (getLibFiles().contains(file.getName())) {
libsFiles++;
continue;
}
if (!getLibFiles().contains(file.getName()) && file.getName().endsWith(".jar") && !file.isDirectory()) {
delete.add(file);
}
}
if (libsFiles != getLibFiles().size()) {
return; //Wrong directory?
}
for (File file : delete) {
file.delete();
}
}
private static void checkMissing() {
File jar = new File(FileUtilSimple.getPathRunJar());
boolean temp = false;
//Check if trying to run from inside zip file (Windows only)
if (jar.getAbsolutePath().contains(".zip") && jar.getAbsolutePath().contains(System.getProperty("java.io.tmpdir")) && System.getProperty("os.name").startsWith("Windows")) {
temp = true;
}
boolean missing = false;
//Check if all libraries are pressent
for (String filename : getLibFiles()) {
File file = new File(FileUtilSimple.getPathLib(filename));
if (!file.exists()) {
missing = true;
break;
}
}
if (temp && missing) { //Running from zip file...
JOptionPane.showMessageDialog(Main.getTop(), "You need to unzip jEveAssets to run it\r\nIt will not work from inside the zip file", Program.PROGRAM_NAME + " - Critical Error", JOptionPane.ERROR_MESSAGE);
System.exit(-1);
} else if (missing) { //Missing libraries
Updater updater = new Updater();
updater.fixLibs();
}
}
public static synchronized Set getLibFiles() {
if (files == null) { //Lazy init
files = new HashSet<>();
files.add("asm-9.2.jar");
files.add("dom4j-2.1.3.jar");
files.add("glazedlists-1.11.0.jar");
files.add("graph-2.0.0.jar");
files.add("guava-r09.jar");
files.add("jaxen-1.2.0.jar");
files.add("javax.activation-api-1.2.0.jar");
files.add("guava-r09.jar");
files.add("LGoodDatePicker-11.2.1.jar");
files.add("jfreechart-1.5.3.jar");
files.add("pricing-3.1.2.jar");
files.add("routing-2.0.0.jar");
files.add("super-csv-2.4.0.jar");
files.add("translations-3.1.1.jar");
files.add("annotations-13.0.jar");
files.add("hamcrest-core-1.3.jar");
files.add("hamcrest-core-1.3.jar");
files.add("jaxb-api-2.3.1.jar");
files.add("sqlite-jdbc-3.50.3.0.jar");
files.add("jna-platform-5.6.0.jar");
files.add("jna-5.6.0.jar");
files.add("jsr305-3.0.2.jar");
files.add("flatlaf-3.4.1.jar");
files.add("EvalEx-2.7.jar");
files.add("picocli-4.6.2.jar");
//Logging
files.add("slf4j-api-2.0.16.jar");
files.add("jul-to-slf4j-2.0.16.jar");
files.add("jcl-over-slf4j-2.0.16.jar");
files.add("logback-core-1.3.15.jar");
files.add("log4j-over-slf4j-2.0.16.jar");
files.add("logback-classic-1.3.15.jar");
//Native Mac GUI integration
files.add("jsvg-1.4.0.jar");
files.add("flatlaf-extras-3.4.1.jar");
//MP3
files.add("jlayer-1.0.2.jar");
//Eve-ESI
files.add("eve-esi-7.0.0.jar");
files.add("logging-interceptor-5.1.0.jar");
files.add("okio-jvm-3.15.0.jar");
files.add("kotlin-stdlib-2.2.0.jar");
files.add("okio-3.15.0.jar");
files.add("okhttp-5.1.0.jar");
files.add("okhttp-jvm-5.1.0.jar");
files.add("gson-2.9.0.jar");
files.add("jackson-core-2.14.0-rc2.jar");
files.add("org.apache.oltu.oauth2.common-1.0.2.jar");
files.add("jackson-databind-nullable-0.2.6.jar");
files.add("jackson-annotations-2.14.0-rc2.jar");
files.add("json-20140107.jar");
files.add("commons-codec-1.9.jar");
files.add("org.apache.oltu.oauth2.client-1.0.2.jar");
files.add("jackson-databind-2.14.0-rc2.jar");
files.add("gson-fire-1.9.0.jar");
files.add("commons-lang3-3.18.0.jar");
}
return files;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/Main.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset;
import java.awt.GraphicsEnvironment;
import java.io.File;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import net.nikr.eve.jeveasset.io.local.FileLock;
import net.nikr.eve.jeveasset.io.online.Updater;
import org.slf4j.bridge.SLF4JBridgeHandler;
public final class Main {
private static JDialog top;
private static Logger log;
public static JDialog getTop() {
if (top == null) {
top = new JDialog();
top.setAlwaysOnTop(true);
}
return top;
}
/**
* Entry point for jEveAssets.
*
* @param args the command line arguments
*/
public static void main(final String[] args) {
boolean portable = false;
boolean debug = false;
for (String arg : args) {
if (arg.toLowerCase().equals("-debug")) {
debug = true;
}
if (arg.toLowerCase().equals("-portable")) {
portable = true;
}
}
//Force UTF-8 File system
System.setProperty("sun.jnu.encoding", "UTF-8");
System.setProperty("file.encoding", "UTF-8");
setLogLocation(portable);
// ditto here.
if (System.getProperty("log.level") == null) {
if (debug) {
System.setProperty("log.level", "DEBUG");
} else {
System.setProperty("log.level", "INFO");
}
}
//Set format
System.setProperty("java.util.logging.SimpleFormatter.format", "%4$s: %2$s - %5$s%n");
try {
SLF4JBridgeHandler.install();
} catch (Throwable t) {
//This is ignored
}
log = Logger.getLogger(Main.class.getName());
//Add user agent to online requests
System.setProperty("http.agent", Program.PROGRAM_USER_AGENT);
//XXX - Workaround for IPv6 fail (force IPv4)
//eveonline.com is not IPv6 ready...
System.setProperty("java.net.preferIPv4Stack", "true");
//XXX - Workaround for Java Bug
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
//XXX - Workaround: Allow basic proxy authorization
System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
System.setProperty("jdk.http.auth.proxying.disabledSchemes", "");
//XXX - Workaround: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
System.setProperty("https.protocols", "SSLv3,TLSv1,TLSv1.1,TLSv1.2");
//Mac OSX
System.setProperty("apple.laf.useScreenMenuBar", "true");
System.setProperty("apple.awt.application.name", Program.PROGRAM_NAME);
//Validate directory
LibraryManager.checkLibraries();
//install the uncaught exception handlers
NikrUncaughtExceptionHandler.install();
//Splash screen
if (!GraphicsEnvironment.isHeadless()) {
SplashUpdater splashUpdater = new SplashUpdater();
splashUpdater.start();
}
//Arguments
CliOptions.set(args);
//Print program data
if (CliOptions.get().isJmemory()) {
log.info("jmemory ok");
}
log.info("Starting " + Program.PROGRAM_NAME + " " + Program.PROGRAM_VERSION);
log.log(Level.INFO, "OS: {0} {1}", new Object[]{System.getProperty("os.name"), System.getProperty("os.version")});
log.log(Level.INFO, "Java: {0} {1}", new Object[]{System.getProperty("java.vendor"), System.getProperty("java.version")});
if (Updater.isPackageManager()) {
log.log(Level.INFO, "Package Manager Mode: Enabled");
log.log(Level.INFO, "Package Maintainers: {0}", Updater.getPackageMaintainers());
}
//Ensure only one instance is running...
SingleInstance instance = new SingleInstance();
if (instance.isSingleInstance()) {
FileLock.unlockAll();
}
//Command line interface
if (CliOptions.get().isCLI()) {
Program.init();
}
int exitCode = 0;
//Update
if (CliOptions.get().isUpdate()) {
CliUpdate update = new CliUpdate();
exitCode = update.update();
}
//Export
if (CliOptions.get().isExport()) {
CliExport cliExport = new CliExport();
exitCode = cliExport.export();
}
if (CliOptions.get().isCLI()) {
System.exit(exitCode);
} else { //GUI
if(GraphicsEnvironment.isHeadless()) {
System.err.println("ERROR: Java is running in headless mode");
System.err.println(" jEveAssets can not display a GUI in headless mode");
System.err.println(" use -help to see CLI options available in headless mode");
System.out.println("ERROR: Java is running in headless mode");
System.out.println(" jEveAssets can not display a GUI in headless mode");
System.out.println(" use -help to see CLI options available in headless mode");
System.exit(-1);
}
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//Lets go!
Program program = new Program();
}
});
}
}
public static void setLogLocation(boolean portable) {
// the tests for null indicate that the property is not set
// It is possible to set properties using the -Dlog.home=foo/bar
// and thus we want to allow this to take priority over the
// configuration options here.
if (System.getProperty("log.home") == null) {
if (portable) {
try {
//jeveassets.jar directory
File file = new File(net.nikr.eve.jeveasset.Program.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParentFile();
System.setProperty("log.home", file.getAbsolutePath() + File.separator);
} catch (URISyntaxException ex) {
//Working directory
System.setProperty("log.home", System.getProperty("user.dir") + File.separator); //Working directory
}
} else {
//Note: We can not use Program.onMac() as that will initialize the Program LOG
if (System.getProperty("os.name").toLowerCase().startsWith("mac os x")) { //Mac
System.setProperty("log.home", System.getProperty("user.home") + File.separator + "Library" + File.separator + "Preferences" + File.separator + "JEveAssets" + File.separator);
} else { //Windows/Linux
System.setProperty("log.home", System.getProperty("user.home") + File.separator + ".jeveassets" + File.separator);
}
}
}
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/NahimicDetector.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class NahimicDetector {
private NahimicDetector() { }
public static boolean isNahimicRunning() {
try {
StringBuilder builder = new StringBuilder();
String line;
//Process p = Runtime.getRuntime().exec(System.getenv("windir") + File.separator + "system32" + File.separator + "tasklist.exe");
Process p = Runtime.getRuntime().exec("tasklist");
try (BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
while ((line = input.readLine()) != null) {
builder.append(line.toLowerCase());
}
}
String string = builder.toString();
return string.contains("nahimicservice") //exact
|| string.contains("nahimicsvc64") //exact
|| string.contains("nahimicsvc32") //exact
/*
|| string.contains("nahimicsvc64run") //Other?
|| string.contains("nahimicsvc32run") //Other?
|| string.contains("nahimctask32") //Other?
|| string.contains("nahimic2uilauncher") //Other?
|| string.contains("nahimic") //Match all
*/
;
} catch (IOException ex) {
return false;
}
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/NikrUncaughtExceptionHandler.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset;
import java.awt.Component;
import java.awt.Desktop;
import java.awt.GraphicsEnvironment;
import java.awt.IllegalComponentStateException;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JOptionPane;
import net.nikr.eve.jeveasset.io.online.Updater;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class NikrUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
private static final Logger LOG = LoggerFactory.getLogger(NikrUncaughtExceptionHandler.class);
private static final String SUBMIT = "https://eve.nikr.net/jeveassets/bugs/submit.php";
private static final String JAVA = "Java 8";
private static boolean error = false;
public static void install() {
System.setProperty("sun.awt.exception.handler", NikrUncaughtExceptionHandler.class.getName());
Thread.setDefaultUncaughtExceptionHandler(new NikrUncaughtExceptionHandler());
}
private NikrUncaughtExceptionHandler() { }
@Override
public void uncaughtException(final Thread t, final Throwable e) {
reportError("Thread", e);
}
public void handle(final Throwable t) {
reportError("AWT", t);
}
private void reportError(String s, Throwable t) {
if (!error) {
error = true;
LOG.error("Uncaught Exception (" + s + "): " + t.getMessage(), t);
//Get root cause
Set> causes = new HashSet<>();
Throwable cause = t;
while (cause != null) {
causes.add(cause.getClass());
cause = cause.getCause(); //Next or null
}
if (causes.contains(IllegalComponentStateException.class)
&& t.getMessage().toLowerCase().contains("component must be showing on the screen to determine its location")
) { //XXX - Workaround for Java bug: https://bugs.openjdk.java.net/browse/JDK-8179665 (Ignore error)
LOG.warn("Ignoring: component must be showing on the screen to determine its location");
error = false;
return;
} else if (causes.contains(UnsupportedClassVersionError.class)) { //Old Java
showMessageDialog(Main.getTop(),
"Please update Java to the latest version.\r\n"
+ "The minimum supported version is " + JAVA + "\r\n"
+ "\r\n"
+ "Press OK to close jEveAssets"
+ "\r\n"
+ "\r\n"
, Program.PROGRAM_NAME + " - Critical Error", JOptionPane.ERROR_MESSAGE);
} else if (causes.contains(OutOfMemoryError.class)) { //Out of memory
int value = showConfirmDialog(Main.getTop(),
"Java has run out of memory. jEveAssets will now close\r\n"
+ "Do you want to browse to the wiki article explaining how to fix this?\r\n"
+ "\r\n"
, Program.PROGRAM_NAME + " - Critical Error", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
if (value == JOptionPane.OK_OPTION) {
try {
Desktop.getDesktop().browse(new URI("https://wiki.jeveassets.org/jmemory"));
} catch (Throwable ex) {
//We tried our best, nothing more to do now...
}
}
} else if (causes.contains(NoClassDefFoundError.class) || causes.contains(ClassNotFoundException.class)) { //Corrupted class files
try {
Updater updater = new Updater();
updater.fixMissingClasses();
} catch (Throwable ex) { //Better safe than sorry...
showMessageDialog(Main.getTop(),
"Please, re-download jEveAssets and leave the unzipped directory intact\r\n"
+ "Press OK to close jEveAssets"
, Program.PROGRAM_NAME + " - Critical Error", JOptionPane.ERROR_MESSAGE);
}
} else { //Bug
if (isJavaBug(t)) { //Java Bug
showMessageDialog(Main.getTop(),
"You have encountered a bug that is most likely a java bug.\r\n"
+ "Updating to the latest version of java may fix this problem.\r\n"
+ "It's still very helpful to send the the bug report.\r\n"
+ "\r\n"
+ "Press OK to continue\r\n"
+ "\r\n"
+ "\r\n"
, Program.PROGRAM_NAME + " - Critical Error", JOptionPane.ERROR_MESSAGE);
}
int value = showConfirmDialog(Main.getTop(),
"Send bug report?\r\n"
+ "\r\n"
+ "Data send and saved:\r\n"
+ "-OS (name and version)\r\n"
+ "-Java (vendor and version)\r\n"
+ "-Program (name and version)\r\n"
+ "-Date (current)\r\n"
+ "-Java stack trace (bug)\r\n"
+ "\r\n"
+ "\r\n"
, Program.PROGRAM_NAME + " - Critical Error", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
if (value == JOptionPane.OK_OPTION) {
String result = send(t);
showMessageDialog(Main.getTop(), result, "Bug Report", JOptionPane.PLAIN_MESSAGE);
}
}
System.exit(-1);
}
}
private void showMessageDialog(Component parentComponent,
Object message, String title, int messageType) {
if (GraphicsEnvironment.isHeadless()) {
return;
}
JOptionPane.showMessageDialog(parentComponent, message, title, messageType);
}
public static int showConfirmDialog(Component parentComponent,
Object message, String title, int optionType, int messageType) {
if (GraphicsEnvironment.isHeadless()) {
return JOptionPane.CANCEL_OPTION;
}
return JOptionPane.showConfirmDialog(parentComponent, message, title, optionType, messageType);
}
private static boolean isJavaBug(Throwable t) {
for (StackTraceElement stackTraceElement : t.getStackTrace()) {
if (stackTraceElement.getClassName().startsWith("net.nikr")) {
return false;
}
}
return true;
}
private String send(Throwable t) {
return send(getStackTrace(t));
}
public static String send(String bug) {
HttpURLConnection connection = null;
try {
String urlParameters
= "os=" + URLEncoder.encode(System.getProperty("os.name") + " " + System.getProperty("os.version"), "UTF-8")
+ "&java=" + URLEncoder.encode(System.getProperty("java.vendor") + " " + System.getProperty("java.version"), "UTF-8")
+ "&version=" + URLEncoder.encode(Program.PROGRAM_NAME + " " + Program.PROGRAM_VERSION, "UTF-8")
+ "&log=" + URLEncoder.encode(bug, "UTF-8");
URL url = new URL(SUBMIT);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", Integer.toString(urlParameters.getBytes().length));
connection.setRequestProperty("Content-Language", "en-US");
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuilder response = new StringBuilder();
while ((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
String bugID = response.toString();
if (!bugID.trim().equals("0") && !bugID.trim().isEmpty()) {
return "Bug report send. Thank you very much!\r\n"
+ "\r\n"
+ "BugID: " + bugID;
}
} catch (MalformedURLException ex) {
LOG.error(ex.getMessage(), ex);
} catch (IOException ex) {
LOG.error(ex.getMessage(), ex);
} finally {
if (connection != null) {
connection.disconnect();
}
}
return "Failed to submit bug report...";
}
private String getStackTrace(Throwable t) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
if (t != null) {
t.printStackTrace(pw);
}
return sw.toString(); // stack trace as a string
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/Program.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset;
import com.formdev.flatlaf.extras.FlatDesktop;
import com.formdev.flatlaf.extras.FlatDesktop.QuitResponse;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.DefaultEditorKit;
import net.nikr.eve.jeveasset.data.api.accounts.OwnerType;
import net.nikr.eve.jeveasset.data.api.my.MyAccountBalance;
import net.nikr.eve.jeveasset.data.api.my.MyAsset;
import net.nikr.eve.jeveasset.data.api.my.MyContract;
import net.nikr.eve.jeveasset.data.api.my.MyContractItem;
import net.nikr.eve.jeveasset.data.api.my.MyIndustryJob;
import net.nikr.eve.jeveasset.data.api.my.MyJournal;
import net.nikr.eve.jeveasset.data.api.my.MyMarketOrder;
import net.nikr.eve.jeveasset.data.api.my.MyTransaction;
import net.nikr.eve.jeveasset.data.profile.ProfileData;
import net.nikr.eve.jeveasset.data.profile.ProfileManager;
import net.nikr.eve.jeveasset.data.sde.MyLocation;
import net.nikr.eve.jeveasset.data.sde.StaticData;
import net.nikr.eve.jeveasset.data.settings.AddedData;
import net.nikr.eve.jeveasset.data.settings.PriceHistoryDatabase;
import net.nikr.eve.jeveasset.data.settings.Settings;
import net.nikr.eve.jeveasset.data.settings.TempDirs;
import net.nikr.eve.jeveasset.data.settings.TrackerData;
import net.nikr.eve.jeveasset.data.settings.tag.TagUpdate;
import net.nikr.eve.jeveasset.gui.dialogs.AboutDialog;
import net.nikr.eve.jeveasset.gui.dialogs.account.AccountManagerDialog;
import net.nikr.eve.jeveasset.gui.dialogs.profile.ProfileDialog;
import net.nikr.eve.jeveasset.gui.dialogs.settings.SettingsDialog;
import net.nikr.eve.jeveasset.gui.dialogs.settings.UserLocationSettingsPanel;
import net.nikr.eve.jeveasset.gui.dialogs.settings.UserNameSettingsPanel;
import net.nikr.eve.jeveasset.gui.dialogs.settings.UserPriceSettingsPanel;
import net.nikr.eve.jeveasset.gui.dialogs.update.StructureUpdateDialog;
import net.nikr.eve.jeveasset.gui.dialogs.update.UpdateDialog;
import net.nikr.eve.jeveasset.gui.frame.MainMenu.MainMenuAction;
import net.nikr.eve.jeveasset.gui.frame.MainWindow;
import net.nikr.eve.jeveasset.gui.frame.StatusPanel;
import net.nikr.eve.jeveasset.gui.frame.StatusPanel.UpdateType;
import net.nikr.eve.jeveasset.gui.images.Images;
import net.nikr.eve.jeveasset.gui.shared.Updatable;
import net.nikr.eve.jeveasset.gui.shared.components.JLockWindow;
import net.nikr.eve.jeveasset.gui.shared.components.JLockWindow.LockWorkerAdaptor;
import net.nikr.eve.jeveasset.gui.shared.components.JMainTab;
import net.nikr.eve.jeveasset.gui.shared.filter.FilterMatcher;
import net.nikr.eve.jeveasset.gui.sounds.SoundPlayer;
import net.nikr.eve.jeveasset.gui.tabs.agents.AgentsTab;
import net.nikr.eve.jeveasset.gui.tabs.assets.AssetsTab;
import net.nikr.eve.jeveasset.gui.tabs.contracts.ContractsTab;
import net.nikr.eve.jeveasset.gui.tabs.items.ItemsTab;
import net.nikr.eve.jeveasset.gui.tabs.jobs.IndustryJobsTab;
import net.nikr.eve.jeveasset.gui.tabs.journal.JournalTab;
import net.nikr.eve.jeveasset.gui.tabs.loadout.LoadoutsTab;
import net.nikr.eve.jeveasset.gui.tabs.loyalty.LoyaltyPointsTab;
import net.nikr.eve.jeveasset.gui.tabs.materials.MaterialsTab;
import net.nikr.eve.jeveasset.gui.tabs.mining.ExtractionsTab;
import net.nikr.eve.jeveasset.gui.tabs.mining.MiningGraphTab;
import net.nikr.eve.jeveasset.gui.tabs.mining.MiningTab;
import net.nikr.eve.jeveasset.gui.tabs.orders.MarketOrdersTab;
import net.nikr.eve.jeveasset.gui.tabs.orders.OutbidProcesser.OutbidProcesserOutput;
import net.nikr.eve.jeveasset.gui.tabs.overview.OverviewTab;
import net.nikr.eve.jeveasset.gui.tabs.prices.PriceChangesTab;
import net.nikr.eve.jeveasset.gui.tabs.prices.PriceHistoryTab;
import net.nikr.eve.jeveasset.gui.tabs.reprocessed.ReprocessedTab;
import net.nikr.eve.jeveasset.gui.tabs.routing.RoutingTab;
import net.nikr.eve.jeveasset.gui.tabs.skills.SkillsTab;
import net.nikr.eve.jeveasset.gui.tabs.skills.SkillsOverviewTab;
import net.nikr.eve.jeveasset.gui.tabs.slots.SlotsTab;
import net.nikr.eve.jeveasset.gui.tabs.standing.NpcStandingTab;
import net.nikr.eve.jeveasset.gui.tabs.stockpile.StockpileTab;
import net.nikr.eve.jeveasset.gui.tabs.tracker.TrackerTab;
import net.nikr.eve.jeveasset.gui.tabs.transaction.TransactionTab;
import net.nikr.eve.jeveasset.gui.tabs.tree.TreeTab;
import net.nikr.eve.jeveasset.gui.tabs.values.DataSetCreator;
import net.nikr.eve.jeveasset.gui.tabs.values.ValueRetroTab;
import net.nikr.eve.jeveasset.gui.tabs.values.ValueTableTab;
import net.nikr.eve.jeveasset.i18n.GuiFrame;
import net.nikr.eve.jeveasset.i18n.GuiShared;
import net.nikr.eve.jeveasset.io.local.profile.ProfileDatabase.Table;
import net.nikr.eve.jeveasset.io.online.PriceDataGetter;
import net.nikr.eve.jeveasset.io.online.Updater;
import net.nikr.eve.jeveasset.io.shared.ApiIdConverter;
import net.nikr.eve.jeveasset.io.shared.DesktopUtil;
import net.nikr.eve.jeveasset.io.shared.FileUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Program implements ActionListener {
private static final Logger LOG = LoggerFactory.getLogger(Program.class);
private enum ProgramAction {
TIMER
}
//Major.Minor.Bugfix [Release Candidate n] [BETA n] [DEV BUILD #n];
public static final String PROGRAM_VERSION = "8.1.3 DEV BUILD 1";
public static final String PROGRAM_NAME = "jEveAssets";
public static final String PROGRAM_HOMEPAGE = "https://eve.nikr.net/jeveasset";
public static final String PROGRAM_USER_AGENT = PROGRAM_NAME + "/" + PROGRAM_VERSION.replace(" ", "_") + " (nkr@niklaskr.dk)";
private static final boolean PROGRAM_DEV_BUILD = false;
//Height
private static int height = 22; //Defaults to 22
//GUI
private MainWindow mainWindow;
//Dialogs
private AccountManagerDialog accountManagerDialog;
private AboutDialog aboutDialog;
private ProfileDialog profileDialog;
private SettingsDialog settingsDialog;
private UpdateDialog updateDialog;
private StructureUpdateDialog structureUpdateDialog;
//Tabs
private ValueRetroTab valueRetroTab;
private ValueTableTab valueTableTab;
private PriceHistoryTab priceHistoryTab;
private MaterialsTab materialsTab;
private LoadoutsTab loadoutsTab;
private RoutingTab routingTab;
private MarketOrdersTab marketOrdersTab;
private JournalTab journalTab;
private TransactionTab transactionsTab;
private IndustryJobsTab industryJobsTab;
private SlotsTab slotsTab;
private AssetsTab assetsTab;
private OverviewTab overviewTab;
private StockpileTab stockpileTab;
private ItemsTab itemsTab;
private TrackerTab trackerTab;
private ReprocessedTab reprocessedTab;
private ContractsTab contractsTab;
private TreeTab treeTab;
private SkillsTab skillsTab;
private SkillsOverviewTab skillsOverviewTab;
private LoyaltyPointsTab loyaltyPointsTab;
private NpcStandingTab npcStandingTab;
private AgentsTab agentsTab;
private MiningTab miningTab;
private MiningGraphTab miningGraphTab;
private ExtractionsTab extractionsTab;
private PriceChangesTab priceChangesTab;
//Misc
private Updater updater;
private Timer timer;
private Updatable updatable;
private final Map jMainTabs = new HashMap<>();
//Data
private final ProfileData profileData;
private final ProfileManager profileManager;
private final PriceDataGetter priceDataGetter;
private final String localData;
public Program() {
if (CliOptions.get().isDebug() || CliOptions.get().isEDTdebug()) {
LOG.info("ForceUpdate: {} NoUpdate: {} Debug: {} EDTDebug: {}", CliOptions.get().isForceUpdate(), CliOptions.get().isForceNoUpdate(), CliOptions.get().isDebug(), CliOptions.get().isEDTdebug());
DetectEdtViolationRepaintManager.install();
}
//Load Static Data, Settings, Tracker Data, Added Data, Contract Prices
init();
//Look and feel
initLookAndFeel(Settings.get().getColorSettings().getLookAndFeelClass());
calcButtonsHeight(); //Must be done after setting the LAF
//Check for data/program updates
updater = new Updater();
localData = updater.getLocalData();
if (!isDevBuild()) {
update();
}
//Load profile data
profileManager = new ProfileManager();
profileManager.searchProfile();
profileManager.loadActiveProfile();
profileData = new ProfileData(profileManager);
//Can not update profile data now - list needs to be empty doing creation...
//Load price data
priceDataGetter = new PriceDataGetter();
priceDataGetter.load();
SplashUpdater.setProgress(45);
//Timer
timer = new Timer(15000, this); //4 times each minute
timer.setActionCommand(ProgramAction.TIMER.name());
//Updatable
updatable = new Updatable(this);
//GUI
SplashUpdater.setText("Loading GUI");
LOG.info("GUI Loading:");
LOG.info("Loading: Images");
Images.preload();
LOG.info("Loading: Sounds");
SoundPlayer.load();
LOG.info("Loading: Main Window");
mainWindow = new MainWindow(this);
SplashUpdater.setProgress(50);
//Tools
LOG.info("Loading: Assets Tab");
assetsTab = new AssetsTab(this);
mainWindow.addTab(assetsTab);
SplashUpdater.setProgress(52);
if (Settings.get().isLoadToolsStartup()) {
ToolLoader.initAllTools(this);
} else {
ToolLoader.initTools(this,Settings.get().getShowTools());
}
//Dialogs
LOG.info("Loading: Account Manager Dialog");
accountManagerDialog = new AccountManagerDialog(this);
SplashUpdater.setProgress(85);
LOG.info("Loading: About Dialog");
aboutDialog = new AboutDialog(this);
SplashUpdater.setProgress(86);
LOG.info("Loading: Profiles Dialog");
profileDialog = new ProfileDialog(this);
SplashUpdater.setProgress(88);
LOG.info("Loading: Update Dialog");
updateDialog = new UpdateDialog(this);
SplashUpdater.setProgress(90);
LOG.info("Loading: Options Dialog");
settingsDialog = new SettingsDialog(this);
SplashUpdater.setProgress(96);
LOG.info("Loading: Structure UpdateDialog");
structureUpdateDialog = new StructureUpdateDialog(this);
//GUI Done
LOG.info("GUI loaded");
//Updating data...
LOG.info("Updating data...");
updateEventLists();
//OSXAdapter
macOsxCode();
//Open Tools
ToolLoader.openTools(this, Settings.get().getShowTools());
SplashUpdater.setProgress(100);
LOG.info("Showing GUI");
mainWindow.show();
SplashUpdater.hide();
//Start timer
timerTicked();
//Background tool loader
ToolLoader.init(this);
if (Settings.get().isLoadToolsBackground()) {
ToolLoader.startBackgroundToolLoading(this);
}
LOG.info("Startup Done");
if (CliOptions.get().isDebug()) {
LOG.info("Show Debug Warning");
JOptionPane.showMessageDialog(mainWindow.getFrame(), "WARNING: Debug is enabled", "Debug", JOptionPane.WARNING_MESSAGE);
}
if (isDevBuild()) {
JOptionPane.showMessageDialog(mainWindow.getFrame(), "WARNING: This is a dev build\r\n\r\nNotes:\r\n- Always run portable\r\n- Settings and profiles are cloned\r\n- Does not check for updates\r\n- Expect bugs!", "DEV BUILD", JOptionPane.WARNING_MESSAGE);
}
if (Settings.get().isSettingsLoadError()) {
JOptionPane.showMessageDialog(mainWindow.getFrame(), GuiShared.get().errorLoadingSettingsMsg(), GuiShared.get().errorLoadingSettingsTitle(), JOptionPane.ERROR_MESSAGE);
}
if (NahimicDetector.isNahimicRunning()) {
JOptionPane.showMessageDialog(mainWindow.getFrame(), "WARNING: Nahimic service detected. It's known to corrupt the jEveAssets GUI", "Nahimic Detected", JOptionPane.WARNING_MESSAGE);
}
profileManager.showProfileLoadErrorWarning(mainWindow.getFrame());
if (profileManager.getOwnerTypes().isEmpty()) {
LOG.info("Show Account Manager");
accountManagerDialog.setVisible(true);
}
ApiIdConverter.setUpdateItem(true);
}
/**
* To be REMOVED!
* @return
*/
public Map getMainTabs() {
return jMainTabs;
}
/**
* Load: Static Data, Settings, Tracker Data, Added Data, Contract Prices.
* PROGRAM_DEV_BUILD == true > run portable
*/
public static void init() {
if (isDevBuild()) {
CliOptions.get().setPortable(true);
}
SplashUpdater.setText("Loading DATA");
LOG.info("DATA Loading...");
FileUtil.autoImportFileUtil();
TempDirs.fixTempDir();
StaticData.load();
Settings.load();
TrackerData.load();
AddedData.load();
PriceHistoryDatabase.load();
}
/**
*
* @param load does nothing except change the signature.
*/
protected Program(final boolean load) {
profileData = null;
profileManager = null;
priceDataGetter = null;
localData = null;
}
private void initLookAndFeel(String lookAndFeel) {
initLookAndFeel(lookAndFeel, true);
}
private void initLookAndFeel(String lookAndFeel, boolean tryDefault) {
//Allow users to overwrite LaF
if (System.getProperty("swing.defaultlaf") != null) {
return;
}
//lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
//lookAndFeel = UIManager.getSystemLookAndFeelClassName(); //System
//lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName(); //Java
//lookAndFeel = "javax.swing.plaf.nimbus.NimbusLookAndFeel"; //Nimbus
//lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel"; //Metal
//lookAndFeel = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"; //GTK+
//lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; //CDE/Motif
//flatlaf
//lookAndFeel = "com.formdev.flatlaf.FlatLightLaf"; //Flat Light
//lookAndFeel = "com.formdev.flatlaf.FlatDarkLaf"; //Flat Dark
//lookAndFeel = "com.formdev.flatlaf.FlatIntelliJLaf"; //Flat IntelliJ
//lookAndFeel = "com.formdev.flatlaf.FlatDarculaLaf"; //Flat Darcula
try {
UIManager.setLookAndFeel(lookAndFeel);
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
LOG.error(ex.getMessage(), ex);
//In case the settings is using an unsupported look and feel
//Try system look and feel
if (tryDefault) {
initLookAndFeel(UIManager.getSystemLookAndFeelClassName(), false);
}
}
setKeys(); // This must be performed immediately after the LaF has been set
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
}
private void setKeys() {
// Ensure Max OSX/Windows/Linux key bindings are useable for copy, cut, paste, and select all
addKeysText(UIManager.get("EditorPane.focusInputMap"));
addKeysText(UIManager.get("FormattedTextField.focusInputMap"));
addKeysText(UIManager.get("PasswordField.focusInputMap"));
addKeysText(UIManager.get("TextField.focusInputMap"));
addKeysText(UIManager.get("TextPane.focusInputMap"));
addKeysText(UIManager.get("TextArea.focusInputMap"));
addKeysMisc(UIManager.get("Table.ancestorInputMap"));
addKeysMisc(UIManager.get("Tree.focusInputMap"));
addKeysMisc(UIManager.get("List.focusInputMap"));
}
private void addKeysText(Object object) {
if (object instanceof InputMap) { //Better safe than sorry
InputMap inputMap = (InputMap) object;
//Mac Keys
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.META_DOWN_MASK), DefaultEditorKit.copyAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.META_DOWN_MASK), DefaultEditorKit.cutAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.META_DOWN_MASK), DefaultEditorKit.pasteAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.META_DOWN_MASK), DefaultEditorKit.selectAllAction);
//Win Keys
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK), DefaultEditorKit.copyAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_DOWN_MASK), DefaultEditorKit.cutAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_DOWN_MASK), DefaultEditorKit.pasteAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK), DefaultEditorKit.selectAllAction);
//Other
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, KeyEvent.CTRL_DOWN_MASK), DefaultEditorKit.copyAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, KeyEvent.SHIFT_DOWN_MASK), DefaultEditorKit.cutAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, KeyEvent.SHIFT_DOWN_MASK), DefaultEditorKit.pasteAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SLASH, KeyEvent.CTRL_DOWN_MASK), DefaultEditorKit.selectAllAction);
}
}
private void addKeysMisc(Object object) {
if (object instanceof InputMap) { //Better safe than sorry
InputMap inputMap = (InputMap) object;
//Mac Keys
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.META_DOWN_MASK), "copy");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.META_DOWN_MASK), "cut");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.META_DOWN_MASK), "parse");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.META_DOWN_MASK), "selectAll");
//Win Keys
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK), "copy");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_DOWN_MASK), "cut");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_DOWN_MASK), "parse");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK), "selectAll");
//Other
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, KeyEvent.CTRL_DOWN_MASK), "copy");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, KeyEvent.SHIFT_DOWN_MASK), "cut");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, KeyEvent.SHIFT_DOWN_MASK), "parse");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SLASH, KeyEvent.CTRL_DOWN_MASK), "selectAll");
}
}
public static int getButtonsHeight() {
return height;
}
private void calcButtonsHeight() {
height = Math.max(height, new JComboBox<>().getPreferredSize().height);
height = Math.max(height, new JTextField().getPreferredSize().height);
height = Math.max(height, new JButton().getPreferredSize().height);
}
public static int getButtonsWidth() {
return 90;
}
public static int getIconButtonsWidth() {
return 30;
}
public void addMainTab(final String toolName, final JMainTab jMainTab) {
JMainTab old = jMainTabs.put(toolName, jMainTab);
if (old != null) {
throw new RuntimeException("toolName: " + toolName + " is duplicated");
}
}
public Map getInitTabs() {
return jMainTabs;
}
private void timerTicked() {
if (!timer.isRunning()) {
timer.start();
}
boolean isUpdatable = updatable.isUpdatable();
this.getStatusPanel().timerTicked(isUpdatable);
this.getMainWindow().getMenu().timerTicked(isUpdatable, StructureUpdateDialog.structuresUpdatable(this));
}
public final void update() {
updater.update(Program.PROGRAM_VERSION, localData, Settings.get().getProxyData());
}
public boolean checkProgramUpdate() {
return updater.checkProgramUpdate(Program.PROGRAM_VERSION);
}
public boolean checkDataUpdate() {
return updater.checkDataUpdate(localData);
}
public final void showUpdateStructuresDialog(boolean minimizable) {
if (getStatusPanel().updateing(UpdateType.STRUCTURE)) {
JOptionPane.showMessageDialog(getMainWindow().getFrame(), GuiFrame.get().updatingInProgressMsg(), GuiFrame.get().updatingInProgressTitle(), JOptionPane.PLAIN_MESSAGE);
} else {
updateStructures(null, minimizable);
}
}
public final void updateMarketOrdersWithProgress(OutbidProcesserOutput output) {
JLockWindow jLockWindow = new JLockWindow(getMainWindow().getFrame());
jLockWindow.show(GuiShared.get().updating(), new LockWorkerAdaptor() {
@Override
public void task() {
updateEventLists(null, null, null, output);
}
});
}
public final void updateMarketOrders(OutbidProcesserOutput output) {
updateEventLists(null, null, null, output);
}
public final void updateLocations(Set locationIDs) {
JLockWindow jLockWindow = new JLockWindow(getMainWindow().getFrame());
jLockWindow.show(GuiShared.get().updating(), new LockWorkerAdaptor() {
@Override
public void task() {
updateEventLists(null, locationIDs, null, null);
}
});
}
public final void updatePrices(Set typeIDs) {
JLockWindow jLockWindow = new JLockWindow(getMainWindow().getFrame());
jLockWindow.show(GuiShared.get().updating(), new LockWorkerAdaptor() {
@Override
public void task() {
updateEventLists(null, null, typeIDs, null);
}
});
}
public final void updateNames(Set itemIDs) {
JLockWindow jLockWindow = new JLockWindow(getMainWindow().getFrame());
jLockWindow.show(GuiShared.get().updating(), new LockWorkerAdaptor() {
@Override
public void task() {
updateEventLists(itemIDs, null, null, null);
}
});
}
public final void updateEventListsWithProgress() {
updateEventListsWithProgress(getMainWindow().getFrame());
}
public final void updateEventListsWithProgress(final Window parent) {
JLockWindow jLockWindow = new JLockWindow(parent);
jLockWindow.show(GuiShared.get().updating(), new LockWorkerAdaptor() {
@Override
public void task() {
updateEventLists();
}
});
}
public final void updateEventLists() {
updateEventLists(null, null, null, null);
}
private synchronized void updateEventLists(Set itemIDs, Set locationIDs, Set typeIDs, OutbidProcesserOutput output) {
LOG.info("Updating EventList");
FilterMatcher.clearColumnValueCache();
for (JMainTab jMainTab : mainWindow.getTabs()) {
ensureEDT(new Runnable() {
@Override
public void run() {
jMainTab.beforeUpdateData();
}
});
}
if (output != null) {
profileData.updateMarketOrders(output);
} else if (itemIDs != null) {
profileData.updateNames(itemIDs);
} else if (locationIDs != null) {
profileData.updateLocations(locationIDs);
} else if (typeIDs != null) {
profileData.updatePrice(typeIDs);
} else {
SoundPlayer.cancelAll(); //Stop sounds
profileData.updateEventLists();
}
if (locationIDs != null) { //Update locations
for (JMainTab jMainTab : mainWindow.getTabs()) {
ensureEDT(new Runnable() {
@Override
public void run() {
jMainTab.updateLocations(locationIDs);
}
});
}
} else if (typeIDs != null) { //Update prices
for (JMainTab jMainTab : mainWindow.getTabs()) {
ensureEDT(new Runnable() {
@Override
public void run() {
jMainTab.updatePrices(typeIDs);
}
});
}
} else if (itemIDs != null) { //Update names
for (JMainTab jMainTab : mainWindow.getTabs()) {
ensureEDT(new Runnable() {
@Override
public void run() {
jMainTab.updateNames(itemIDs);
}
});
}
} else { //Full update
for (JMainTab jMainTab : mainWindow.getTabs()) {
ensureEDT(new Runnable() {
@Override
public void run() {
jMainTab.updateData();
}
});
}
}
for (JMainTab jMainTab : mainWindow.getTabs()) {
ensureEDT(new Runnable() {
@Override
public void run() {
jMainTab.afterUpdateData();
jMainTab.updateCache();
jMainTab.repaintFilters();
}
});
}
ensureEDT(new Runnable() {
@Override
public void run() {
StockpileTab stockpile = getStockpileTab(false);
if (stockpile != null) {
stockpile.updateStockpileDialog();
}
}
});
ensureEDT(new Runnable() {
@Override
public void run() {
timerTicked();
}
});
ensureEDT(new Runnable() {
@Override
public void run() {
updateTableMenu();
}
});
}
public void repaintTables() {
for (JMainTab jMainTab : mainWindow.getTabs()) {
ensureEDT(new Runnable() {
@Override
public void run() {
jMainTab.repaintTable();
}
});
}
}
public static void ensureEDT(Runnable runnable) {
if (SwingUtilities.isEventDispatchThread()) {
runnable.run();
} else {
try {
SwingUtilities.invokeAndWait(runnable);
} catch (InterruptedException | InvocationTargetException ex) {
throw new RuntimeException(ex);
}
}
}
/**
* Save Settings ASAP
* @param msg Who is saving what?
*/
public void saveSettings(final String msg) {
if (!CliOptions.get().isLazySave() && !Settings.ignoreSave()) {
Settings.saveStart();
Thread thread = new SaveSettings(msg, this);
thread.start();
}
}
private void doSaveSettings(final String msg) {
LOG.info("Saving Settings: " + msg);
Settings.lock("Table (Column/Width/Resize) and Window Settings"); //Lock for Table (Column/Width/Resize) and Window Settings
mainWindow.updateSettings();
for (JMainTab jMainTab : getInitTabs().values()) {
jMainTab.saveSettings();
}
Settings.unlock("Table (Column/Width/Resize) and Window Settings"); //Unlock for Table (Column/Width/Resize) and Window Settings
Settings.saveSettings();
}
public void saveSettingsAndProfile() {
if (CliOptions.get().isLazySave()) {
doSaveSettings("API Update");
} else {
saveSettings("API Update");
Settings.waitForEmptySaveQueue();
}
profileManager.saveProfile();
}
public synchronized void saveProfile() {
LOG.info("Saving Profile");
profileManager.saveProfile();
}
public synchronized void saveTable(Table table) {
LOG.info("Saving Profile Table");
profileManager.saveProfileTable(table);
}
public void exit() {
if (safeExit()) {
System.exit(0);
}
}
/**
* Make ready to exit
* @return true for exit and false to cancel exit
*/
private boolean safeExit() {
if (getStatusPanel().updateInProgress() > 0) {
int value = JOptionPane.showConfirmDialog(getMainWindow().getFrame(), GuiFrame.get().exitMsg(getStatusPanel().updateInProgress()), GuiFrame.get().exitTitle(getStatusPanel().updateInProgress()), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (value != JOptionPane.OK_OPTION) {
return false;
}
}
getStatusPanel().cancelUpdates();
saveExit();
LOG.info("Running shutdown hook(s) and exiting...");
return true;
}
private void saveExit() {
if (CliOptions.get().isLazySave()) {
doSaveSettings("Exit");
} else {
LOG.info("Waiting for save queue to finish...");
Settings.waitForEmptySaveQueue();
}
TrackerData.waitForEmptySaveQueue();
}
private void showAbout() {
ensureEDT(new Runnable() {
@Override
public void run() {
aboutDialog.setVisible(true);
}
});
}
private void showSettings() {
ensureEDT(new Runnable() {
@Override
public void run() {
settingsDialog.setVisible(true);
}
});
}
public String getProgramDataVersion() {
return localData;
}
private void macOsxCode() {
if (FileUtil.onMac()) {
FlatDesktop.setAboutHandler(new Runnable() {
@Override
public void run() {
showAbout();
}
});
FlatDesktop.setPreferencesHandler(new Runnable() {
@Override
public void run() {
showSettings();
}
});
FlatDesktop.setQuitHandler(new Consumer() {
@Override
public void accept(QuitResponse quitResponse) {
if (safeExit()) {
quitResponse.performQuit();
} else {
quitResponse.cancelQuit();
}
}
});
}
}
public MainWindow getMainWindow() {
return mainWindow;
}
public AssetsTab getAssetsTab() {
return assetsTab;
}
public ContractsTab getContractsTab(boolean init) {
if (init && contractsTab == null) {
LOG.info("Loading: Contracts Tab");
contractsTab = new ContractsTab(this);
}
return contractsTab;
}
public IndustryJobsTab getIndustryJobsTab(boolean init) {
if (init && industryJobsTab == null) {
LOG.info("Loading: Industry Jobs Tab");
industryJobsTab = new IndustryJobsTab(this);
}
return industryJobsTab;
}
public SlotsTab getSlotsTab(boolean init) {
if (init && slotsTab == null) {
LOG.info("Loading: Slots Tab");
slotsTab = new SlotsTab(this);
}
return slotsTab;
}
public OverviewTab getOverviewTab(boolean init) {
if (init && overviewTab == null) {
LOG.info("Loading: Overview Tab");
overviewTab = new OverviewTab(this);
}
return overviewTab;
}
public TreeTab getTreeTab(boolean init) {
if (init && treeTab == null) {
LOG.info("Loading: Tree Tab");
treeTab = new TreeTab(this);
}
return treeTab;
}
public LoadoutsTab getLoadoutsTab(boolean init) {
if (init && loadoutsTab == null) {
LOG.info("Loading: Ship Loadouts Tab");
loadoutsTab = new LoadoutsTab(this);
}
return loadoutsTab;
}
public StockpileTab getStockpileTab(boolean init) {
if (init && stockpileTab == null) {
LOG.info("Loading: Stockpile Tab");
stockpileTab = new StockpileTab(this);
}
return stockpileTab;
}
public ReprocessedTab getReprocessedTab(boolean init) {
if (init && reprocessedTab == null) {
LOG.info("Loading: Reprocessed Tab");
reprocessedTab = new ReprocessedTab(this);
}
return reprocessedTab;
}
public SkillsOverviewTab getSkillsOverviewTab(boolean init) {
if (init && skillsOverviewTab == null) {
LOG.info("Loading: Skills Overview Tab");
skillsOverviewTab = new SkillsOverviewTab(this);
}
return skillsOverviewTab;
}
public RoutingTab getRoutingTab(boolean init) {
if (init && routingTab == null) {
LOG.info("Loading: Routing Tab");
routingTab = new RoutingTab(this);
}
return routingTab;
}
public TrackerTab getTrackerTab(boolean init) {
if (init && trackerTab == null) {
LOG.info("Loading: Tracker Tab");
trackerTab = new TrackerTab(this);
}
return trackerTab;
}
public ValueRetroTab getValueTab(boolean init) {
if (init && valueRetroTab == null) {
LOG.info("Loading: Values Tab");
valueRetroTab = new ValueRetroTab(this);
}
return valueRetroTab;
}
public ValueTableTab getIskTab(boolean init) {
if (init && valueTableTab == null) {
LOG.info("Loading: Isk Tab");
valueTableTab = new ValueTableTab(this);
}
return valueTableTab;
}
public TransactionTab getTransactionsTab(boolean init) {
if (init && transactionsTab == null) {
LOG.info("Loading: Transactions Tab");
transactionsTab = new TransactionTab(this);
}
return transactionsTab;
}
public PriceHistoryTab getPriceHistoryTab(boolean init) {
if (init && priceHistoryTab == null) {
LOG.info("Loading: Price History Tab");
priceHistoryTab = new PriceHistoryTab(Program.this);
}
return priceHistoryTab;
}
public MarketOrdersTab getMarketOrdersTab(boolean init) {
if (init && marketOrdersTab == null) {
LOG.info("Loading: Market Orders Tab");
marketOrdersTab = new MarketOrdersTab(this);
}
return marketOrdersTab;
}
public MiningTab getMiningTab(boolean init) {
if (init && miningTab == null) {
LOG.info("Loading: Mining Log Tab");
miningTab = new MiningTab(this);
}
return miningTab;
}
public MiningGraphTab getMiningGraphTab(boolean init) {
if (init && miningGraphTab == null) {
LOG.info("Loading: Mining Graph Tab");
miningGraphTab = new MiningGraphTab(this);
}
return miningGraphTab;
}
public ExtractionsTab getExtractionsTab(boolean init) {
if (init && extractionsTab == null) {
LOG.info("Loading: Extractions Tab");
extractionsTab = new ExtractionsTab(this);
}
return extractionsTab;
}
public MaterialsTab getMaterialsTab(boolean init) {
if (init && materialsTab == null) {
LOG.info("Loading: Materials Tab");
materialsTab = new MaterialsTab(this);
}
return materialsTab;
}
public PriceChangesTab getPriceChangesTab(boolean init) {
if (init && priceChangesTab == null) {
LOG.info("Loading: Price Changes Tab");
priceChangesTab = new PriceChangesTab(this);
}
return priceChangesTab;
}
public JournalTab getJournalTab(boolean init) {
if (init && journalTab == null) {
LOG.info("Loading: Journal Tab");
journalTab = new JournalTab(this);
}
return journalTab;
}
public ItemsTab getItemsTab(boolean init) {
if (init && itemsTab == null) {
LOG.info("Loading: Items Tab");
itemsTab = new ItemsTab(this);
}
return itemsTab;
}
public SkillsTab getSkillsTab(boolean init) {
if (init && skillsTab == null) {
LOG.info("Loading: Skills Tab");
skillsTab = new SkillsTab(this);
}
return skillsTab;
}
public LoyaltyPointsTab getLoyaltyPointsTab(boolean init) {
if (init && loyaltyPointsTab == null) {
LOG.info("Loading: Loyalty Points Tab");
loyaltyPointsTab = new LoyaltyPointsTab(this);
}
return loyaltyPointsTab;
}
public NpcStandingTab getNpcStandingTab(boolean init) {
if (init && npcStandingTab == null) {
LOG.info("Loading: NPC Standing Tab");
npcStandingTab = new NpcStandingTab(this);
}
return npcStandingTab;
}
public AgentsTab getAgentsTab(boolean init) {
if (init && agentsTab == null) {
LOG.info("Loading: Agents Tab");
agentsTab = new AgentsTab(this);
}
return agentsTab;
}
public StatusPanel getStatusPanel() {
return this.getMainWindow().getStatusPanel();
}
public UserNameSettingsPanel getUserNameSettingsPanel() {
if (settingsDialog != null) {
return settingsDialog.getUserNameSettingsPanel();
} else {
return null;
}
}
public UserPriceSettingsPanel getUserPriceSettingsPanel() {
if (settingsDialog != null) {
return settingsDialog.getUserPriceSettingsPanel();
} else {
return null;
}
}
public UserLocationSettingsPanel getUserLocationSettingsPanel() {
if (settingsDialog != null) {
return settingsDialog.getUserLocationSettingsPanel();
} else {
return null;
}
}
public void showJumpsSettingsPanel() {
if (settingsDialog != null) {
settingsDialog.showJumpsSettingsPanel();
}
}
public ProfileData getProfileData() {
return profileData;
}
public List getAssetsList() {
return profileData.getAssetsList();
}
public List getContractList() {
return profileData.getContractList();
}
public List getContractItemList() {
return profileData.getContractItemList();
}
public List getIndustryJobsList() {
return profileData.getIndustryJobsList();
}
public List getMarketOrdersList() {
return profileData.getMarketOrdersList();
}
public List getJournalList() {
return profileData.getJournalList();
}
public List getTransactionsList() {
return profileData.getTransactionsList();
}
public List getAccountBalanceList() {
return profileData.getAccountBalanceList();
}
public List getOwnerNames(boolean all) {
return profileData.getOwnerNames(all);
}
public Map getOwners() {
return profileData.getOwners();
}
public List getOwnerTypes() {
return profileManager.getOwnerTypes();
}
public ProfileManager getProfileManager() {
return profileManager;
}
public PriceDataGetter getPriceDataGetter() {
return priceDataGetter;
}
public void createTrackerDataPoint() {
DataSetCreator.createTrackerDataPoint(profileData, Settings.getNow());
TrackerData.save("Added", true);
ensureEDT(new Runnable() {
@Override
public void run() {
TrackerTab tracker = getTrackerTab(false);
if (tracker != null) {
tracker.updateData();
}
}
});
}
public static boolean isDevBuild() {
return PROGRAM_DEV_BUILD;
}
public void updateStructures(Set locations, boolean minimizable) {
structureUpdateDialog.show(locations, minimizable);
}
/**
* Called when Tags are changed.
*/
public void updateTags() {
JLockWindow jLockWindow = new JLockWindow(getMainWindow().getFrame());
jLockWindow.show(GuiShared.get().updating(), new LockWorkerAdaptor() {
@Override
public void task() {
for (JMainTab mainTab : getInitTabs().values()) {
if (mainTab instanceof TagUpdate) {
mainTab.updateCache();
}
}
}
@Override
public void gui() {
for (JMainTab mainTab : getInitTabs().values()) {
if (mainTab instanceof TagUpdate) {
TagUpdate tagUpdate = (TagUpdate) mainTab;
tagUpdate.updateTags();
}
}
}
});
}
/**
* Called when Overview Groups are changed.
*/
public void overviewGroupsChanged() {
RoutingTab routing = getRoutingTab(false);
if (routing != null) {
routing.overviewGroupsChanged();
}
}
/**
* Called when the table menu needs update.
*/
public void updateTableMenu() {
this.getMainWindow().getSelectedTab().updateTableMenu();
}
/**
* Called when the active tab is change (close/open/change).
*/
public void tabChanged() {
getStatusPanel().tabChanged();
if (industryJobsTab != null) {
industryJobsTab.tabChanged();
}
updateTableMenu();
}
@Override
public void actionPerformed(final ActionEvent e) {
//Tools
if (MainMenuAction.VALUES.name().equals(e.getActionCommand())) {
mainWindow.addTab(getValueTab(true));
} else if (MainMenuAction.VALUE_TABLE.name().equals(e.getActionCommand())) {
mainWindow.addTab(getIskTab(true));
} else if (MainMenuAction.PRICE_HISTORY.name().equals(e.getActionCommand())) {
mainWindow.addTab(getPriceHistoryTab(true));
} else if (MainMenuAction.PRICE_CHANGES.name().equals(e.getActionCommand())) {
mainWindow.addTab(getPriceChangesTab(true));
} else if (MainMenuAction.MATERIALS.name().equals(e.getActionCommand())) {
mainWindow.addTab(getMaterialsTab(true));
} else if (MainMenuAction.LOADOUTS.name().equals(e.getActionCommand())) {
mainWindow.addTab(getLoadoutsTab(true));
} else if (MainMenuAction.MARKET_ORDERS.name().equals(e.getActionCommand())) {
mainWindow.addTab(getMarketOrdersTab(true));
} else if (MainMenuAction.JOURNAL.name().equals(e.getActionCommand())) {
mainWindow.addTab(getJournalTab(true));
} else if (MainMenuAction.TRANSACTION.name().equals(e.getActionCommand())) {
mainWindow.addTab(getTransactionsTab(true));
} else if (MainMenuAction.INDUSTRY_JOBS.name().equals(e.getActionCommand())) {
mainWindow.addTab(getIndustryJobsTab(true));
} else if (MainMenuAction.SLOTS.name().equals(e.getActionCommand())) {
mainWindow.addTab(getSlotsTab(true));
} else if (MainMenuAction.OVERVIEW.name().equals(e.getActionCommand())) {
mainWindow.addTab(getOverviewTab(true));
} else if (MainMenuAction.ROUTING.name().equals(e.getActionCommand())) {
mainWindow.addTab(getRoutingTab(true));
} else if (MainMenuAction.STOCKPILE.name().equals(e.getActionCommand())) {
mainWindow.addTab(getStockpileTab(true));
} else if (MainMenuAction.ITEMS.name().equals(e.getActionCommand())) {
mainWindow.addTab(getItemsTab(true));
} else if (MainMenuAction.TRACKER.name().equals(e.getActionCommand())) {
TrackerTab tracker = getTrackerTab(true);
mainWindow.addTab(tracker);
tracker.checkAll();
} else if (MainMenuAction.REPROCESSED.name().equals(e.getActionCommand())) {
mainWindow.addTab(getReprocessedTab(true));
} else if (MainMenuAction.CONTRACTS.name().equals(e.getActionCommand())) {
mainWindow.addTab(getContractsTab(true));
} else if (MainMenuAction.TREE.name().equals(e.getActionCommand())) {
mainWindow.addTab(getTreeTab(true));
} else if (MainMenuAction.SKILLS.name().equals(e.getActionCommand())) {
mainWindow.addTab(getSkillsTab(true));
} else if (MainMenuAction.SKILLS_OVERVIEW.name().equals(e.getActionCommand())) {
mainWindow.addTab(getSkillsOverviewTab(true));
} else if (MainMenuAction.LOYALTY_POINTS.name().equals(e.getActionCommand())) {
mainWindow.addTab(getLoyaltyPointsTab(true));
} else if (MainMenuAction.NPC_STANDING.name().equals(e.getActionCommand())) {
mainWindow.addTab(getNpcStandingTab(true));
} else if (MainMenuAction.AGENTS.name().equals(e.getActionCommand())) {
mainWindow.addTab(getAgentsTab(true));
} else if (MainMenuAction.MINING_ALL.name().equals(e.getActionCommand())) {
mainWindow.addTab(getMiningTab(true));
mainWindow.addTab(getMiningGraphTab(true));
mainWindow.addTab(getExtractionsTab(true));
} else if (MainMenuAction.MINING_LOG.name().equals(e.getActionCommand())) {
mainWindow.addTab(getMiningTab(true));
} else if (MainMenuAction.MINING_GRAPH.name().equals(e.getActionCommand())) {
mainWindow.addTab(getMiningGraphTab(true));
} else if (MainMenuAction.EXTRACTIONS.name().equals(e.getActionCommand())) {
mainWindow.addTab(getExtractionsTab(true));
} else if (MainMenuAction.ACCOUNT_MANAGER.name().equals(e.getActionCommand())) { //Settings
accountManagerDialog.setVisible(true);
} else if (MainMenuAction.PROFILES.name().equals(e.getActionCommand())) {
profileDialog.setVisible(true);
} else if (MainMenuAction.OPTIONS.name().equals(e.getActionCommand())) {
showSettings();
} else if (MainMenuAction.UPDATE.name().equals(e.getActionCommand())) { //Update
updateDialog.setVisible(true);
} else if (MainMenuAction.UPDATE_STRUCTURE.name().equals(e.getActionCommand())) {
showUpdateStructuresDialog(true);
} else if (MainMenuAction.ABOUT.name().equals(e.getActionCommand())) { //Others
showAbout();
} else if (MainMenuAction.LINK_WIKI.name().equals(e.getActionCommand())) {
DesktopUtil.browse("https://wiki.jeveassets.org", this); //Links
} else if (MainMenuAction.LINK_FEEDBACK_AND_HELP.name().equals(e.getActionCommand())) {
DesktopUtil.browse("https://wiki.jeveassets.org/faq#feedback_and_help", this);
} else if (MainMenuAction.LINK_DISCORD.name().equals(e.getActionCommand())) {
DesktopUtil.browse("https://discord.gg/8kYZvbM", this);
} else if (MainMenuAction.README.name().equals(e.getActionCommand())) { //External Files
DesktopUtil.open(FileUtil.getPathReadme(), this);
} else if (MainMenuAction.LICENSE.name().equals(e.getActionCommand())) {
DesktopUtil.open(FileUtil.getPathLicense(), this);
} else if (MainMenuAction.CREDITS.name().equals(e.getActionCommand())) {
DesktopUtil.open(FileUtil.getPathCredits(), this);
} else if (MainMenuAction.CHANGELOG.name().equals(e.getActionCommand())) {
DesktopUtil.open(FileUtil.getPathChangeLog(), this);
} else if (MainMenuAction.EXIT_PROGRAM.name().equals(e.getActionCommand())) { //Exit
exit();
} else if (ProgramAction.TIMER.name().equals(e.getActionCommand())) { //Ticker
timerTicked();
}
}
private static class SaveSettings extends Thread {
private static int counter = 0;
private final String msg;
private final Program program;
private final int id;
public SaveSettings(String msg, Program program) {
super("Save Settings " + counter++ + ": " + msg);
this.msg = msg;
this.program = program;
this.id = counter;
}
@Override
public void run() {
long before = System.currentTimeMillis();
program.doSaveSettings(msg);
Settings.saveEnd();
long after = System.currentTimeMillis();
LOG.debug("Settings saved in: " + (after - before) + "ms");
}
@Override
public int hashCode() {
int hash = 7;
hash = 67 * hash + this.id;
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final SaveSettings other = (SaveSettings) obj;
return this.id == other.id;
}
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/SingleInstance.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* Original code from: http://ganeshtiwaridotcomdotnp.blogspot.dk/2012/01/java-single-instance-of-application.html
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset;
import java.awt.GraphicsEnvironment;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
import net.nikr.eve.jeveasset.i18n.General;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SingleInstance {
private static final Logger LOG = LoggerFactory.getLogger(SingleInstance.class);
private final String HOST = "127.0.0.1";
private final int PORT = 2222;
private final DetectForNew thread;
private boolean msgShown = false;
public SingleInstance() {
// try to connect to server
test();
// start detecting server thread
thread = new DetectForNew();
thread.start();
}
public boolean isSingleInstance() {
return thread.isSingleInstance() && !msgShown;
}
private void test() {
if (!msgShown && findExisting()) {
msgShown = true;
if(GraphicsEnvironment.isHeadless()) {
LOG.error("jEveAssets is already running");
LOG.error("jEveAssets do not support running more than one instance");
LOG.error("To avoid losing or corrupting data jEveAssets will now exit");
LOG.error("Goodbye...");
System.exit(-1);
}
int value = JOptionPane.showConfirmDialog(Main.getTop(), General.get().singleInstanceMsg(), General.get().singleInstanceTitle(), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
if (value != JOptionPane.YES_OPTION) {
System.exit(-1);
}
}
}
private boolean findExisting() {
LOG.info("Check for existing instances");
try {
new Socket(HOST, PORT);
return true;
} catch (Exception e) {
return false;
}
}
class DetectForNew extends Thread {
private ServerSocket serverSocket;
private boolean singleInstance = true;
public DetectForNew() {
createServerSocket();
}
public boolean isSingleInstance() {
return singleInstance && serverSocket != null;
}
@Override
public void run() {
while (true) {
if (serverSocket == null && !findExisting()) {
createServerSocket();
}
try {
if (serverSocket != null) {
serverSocket.accept();
singleInstance = false;
} else {
Thread.sleep(2000); //Wait a bit and try again...
}
} catch (IOException ex) {
//Ignore IO error
} catch (InterruptedException ex) {
return; //We are done (exiting program)
}
}
}
private void createServerSocket() {
LOG.info("Creating instance blocker");
try {
serverSocket = new ServerSocket(PORT);
} catch (IOException ex) {
test();
}
}
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/SplashUpdater.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset;
import java.awt.AlphaComposite;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.SplashScreen;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SplashUpdater {
private static final Logger LOG = LoggerFactory.getLogger(SplashUpdater.class);
private static int progress = 0;
private static int subProgress = 0;
private static String text = "";
private static int currentLoadingImage = 0;
private static BufferedImage[] loadingImages;
private static SplashScreen splashScreen;
private static JWindow splashWindow;
private static Canvas splashWindowCanvas;
private static final int UPDATE_DELAY = 200;
private static final Object PAINT_LOCK = new Object();
private static BufferedImage splashImage;
private static boolean showSplashWindow = true;
private static long delta = 0;
private static Long lastPaint = null;
/** Creates a new instance of SplashUpdater. */
public SplashUpdater() {
splashScreen = SplashScreen.getSplashScreen();
loadingImages = new BufferedImage[8];
for (int i = 0; i < 8; i++) {
try {
loadingImages[i] = ImageIO.read(getClass().getResource("gui/images/loading0" + (i + 1) + ".png"));
} catch (IOException ex) {
LOG.warn("SplashScreen: loading0{}.png (NOT FOUND)", (i + 1));
}
}
try {
splashImage = ImageIO.read(getClass().getResource("/splash.jpg"));
} catch (IOException | IllegalArgumentException ex) {
splashImage = null;
}
splashWindow = new JWindow();
splashWindowCanvas = new Canvas();
splashWindowCanvas.setIgnoreRepaint(true);
splashWindowCanvas.setFocusable(false);
splashWindowCanvas.setFont(new Font("Dialog.plain", 0, 12));
splashWindow.add(splashWindowCanvas);
if (splashScreen != null) {
splashWindow.setBounds(splashScreen.getBounds());
} else if (splashImage != null) {
splashWindow.setSize(splashImage.getWidth(), splashImage.getHeight());
}
splashWindow.setLocationRelativeTo(null);
}
public static void hide() {
showSplashWindow = false;
splashWindow.setVisible(false);
}
public void start() {
Animator animator = new Animator();
animator.start();
Paineter paineter = new Paineter();
paineter.start();
}
public synchronized static void nextLoadingImage() {
currentLoadingImage++;
if (currentLoadingImage >= 8) {
currentLoadingImage = 0;
}
}
/**
* Set splash screen text.
* @param s String to show on splash screen
*/
public synchronized static void setText(final String s) {
text = s;
}
/**
* Set subprogress of splash screen progressbar in the range 0-100.
* @param n Set progress in the range 0-100
*/
public synchronized static void setSubProgress(final int n) {
int number = n;
if (number >= 100) {
number = 0;
}
if (number < 0) {
number = 0;
}
if (subProgress != number) {
if ((number > subProgress || number == 0)) {
subProgress = number;
update(true);
}
}
}
/**
* Set progress of splash screen progressbar in the range 0-100.
* @param n Set progress in the range 0-100
*/
public synchronized static void setProgress(final int n) {
int number = n;
if (number > 100) {
number = 100;
}
if (number < 0) {
number = 0;
}
if (progress != number) {
if (number > progress) {
progress = number;
update(false);
}
}
}
private static void update(boolean sub) {
if (isVisible()) {
synchronized (PAINT_LOCK) {
PAINT_LOCK.notify();
}
} else if (SwingUtilities.isEventDispatchThread()) {
showSplashWindow();
paintSplashWindow(sub);
}
}
private static void showSplashWindow() {
if (showSplashWindow && splashWindow != null && !splashWindow.isVisible()) {
splashWindow.setVisible(true);
splashWindow.toFront();
}
}
private static void paintSplashWindow(boolean sub) {
synchronized (PAINT_LOCK) {
if (splashWindow != null && splashWindow.isVisible()) {
if (lastPaint != null) {
delta = delta + (System.currentTimeMillis() - lastPaint);
}
boolean paint = sub || (lastPaint == null || (System.currentTimeMillis() - lastPaint) > 16);
if (delta > UPDATE_DELAY) {
nextLoadingImage();
delta = 0;
paint = true;
}
if (paint) {
lastPaint = System.currentTimeMillis();
nextLoadingImage();
BufferStrategy bufferStrategy = splashWindowCanvas.getBufferStrategy();
if (bufferStrategy == null) {
splashWindowCanvas.createBufferStrategy(2);
bufferStrategy = splashWindowCanvas.getBufferStrategy();
}
Graphics g = bufferStrategy.getDrawGraphics();
g.drawImage(splashImage, 0, 0, null);
paint((Graphics2D) g);
g.dispose();
splashWindowCanvas.getBufferStrategy().show();
}
}
}
}
private static void paintSplashScreen() {
if (isVisible()) {
try {
if (splashScreen != null) {
Graphics2D g = splashScreen.createGraphics();
if (g != null) {
g.setComposite(AlphaComposite.Clear);
Dimension size = splashScreen.getSize();
g.fillRect(0, 0, size.width, size.height);
g.setPaintMode();
paint(g);
splashScreen.update();
}
}
} catch (IllegalStateException ex) {
LOG.info("SplashScreen: Closed before painting ended (NO PROBLEM)");
}
}
}
private static void paint(final Graphics2D g) throws IllegalStateException {
//Clear Screen
if (CliOptions.get().isDebug()) {
g.setColor(Color.DARK_GRAY);
g.drawString("DEBUG", 344, 232);
g.setColor(Color.WHITE);
g.drawString("DEBUG", 343, 231);
}
if (!text.isEmpty()) {
g.setColor(Color.BLACK);
g.fillRect(0, 235, 90, 24);
g.setColor(Color.WHITE);
g.drawString(text, 5, 252);
}
g.setColor(Color.WHITE);
g.fillRect(106, 242, (int) (progress * 2.6), 12);
if (subProgress > 0) {
g.setColor(Color.LIGHT_GRAY);
g.fillRect(106, 248, (int) (subProgress * 2.6), 6);
}
if (loadingImages[currentLoadingImage] != null) {
g.drawImage(loadingImages[currentLoadingImage], 368, 238, null);
}
}
private static boolean isVisible() {
return (splashScreen != null && splashScreen.isVisible());
}
private class Paineter extends Thread {
@Override
public void run() {
while (isVisible()) {
synchronized (PAINT_LOCK) {
try {
PAINT_LOCK.wait();
} catch (InterruptedException ex) {
}
paintSplashScreen();
}
}
}
}
private class Animator extends Thread {
@Override
public void run() {
while (isVisible()) {
nextLoadingImage();
update(false);
synchronized (this) {
try {
wait(UPDATE_DELAY);
} catch (InterruptedException ex) {
break;
}
}
}
}
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/ToolLoader.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.KeyboardFocusManager;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.AWTEventListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.swing.AbstractButton;
import javax.swing.JComboBox;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import net.nikr.eve.jeveasset.data.settings.Settings;
import net.nikr.eve.jeveasset.gui.frame.StatusPanel;
import net.nikr.eve.jeveasset.gui.frame.StatusPanel.Progress;
import net.nikr.eve.jeveasset.gui.shared.components.JMainTab;
import net.nikr.eve.jeveasset.gui.shared.table.EnumTableColumn;
import net.nikr.eve.jeveasset.gui.tabs.agents.AgentsTab;
import net.nikr.eve.jeveasset.gui.tabs.agents.AgentsTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.assets.AssetTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.assets.AssetsTab;
import net.nikr.eve.jeveasset.gui.tabs.contracts.ContractsTab;
import net.nikr.eve.jeveasset.gui.tabs.contracts.ContractsTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.items.ItemTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.items.ItemsTab;
import net.nikr.eve.jeveasset.gui.tabs.jobs.IndustryJobTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.jobs.IndustryJobsTab;
import net.nikr.eve.jeveasset.gui.tabs.journal.JournalTab;
import net.nikr.eve.jeveasset.gui.tabs.journal.JournalTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.loadout.LoadoutExtendedTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.loadout.LoadoutTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.loadout.LoadoutsTab;
import net.nikr.eve.jeveasset.gui.tabs.loyalty.LoyaltyPointsTab;
import net.nikr.eve.jeveasset.gui.tabs.loyalty.LoyaltyPointsTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.materials.MaterialExtendedTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.materials.MaterialTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.materials.MaterialsTab;
import net.nikr.eve.jeveasset.gui.tabs.mining.ExtractionsTab;
import net.nikr.eve.jeveasset.gui.tabs.mining.ExtractionsTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.mining.MiningGraphTab;
import net.nikr.eve.jeveasset.gui.tabs.mining.MiningTab;
import net.nikr.eve.jeveasset.gui.tabs.mining.MiningTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.orders.MarketOrdersTab;
import net.nikr.eve.jeveasset.gui.tabs.orders.MarketTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.overview.OverviewTab;
import net.nikr.eve.jeveasset.gui.tabs.overview.OverviewTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.prices.PriceChangesTab;
import net.nikr.eve.jeveasset.gui.tabs.prices.PriceChangesTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.prices.PriceHistoryTab;
import net.nikr.eve.jeveasset.gui.tabs.reprocessed.ReprocessedExtendedTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.reprocessed.ReprocessedTab;
import net.nikr.eve.jeveasset.gui.tabs.reprocessed.ReprocessedTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.routing.RoutingTab;
import net.nikr.eve.jeveasset.gui.tabs.skills.SkillsTab;
import net.nikr.eve.jeveasset.gui.tabs.skills.SkillsTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.slots.SlotsTab;
import net.nikr.eve.jeveasset.gui.tabs.slots.SlotsTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.standing.NpcStandingTab;
import net.nikr.eve.jeveasset.gui.tabs.standing.NpcStandingTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.stockpile.StockpileExtendedTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.stockpile.StockpileTab;
import net.nikr.eve.jeveasset.gui.tabs.stockpile.StockpileTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.tracker.TrackerTab;
import net.nikr.eve.jeveasset.gui.tabs.transaction.TransactionTab;
import net.nikr.eve.jeveasset.gui.tabs.transaction.TransactionTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.tree.TreeTab;
import net.nikr.eve.jeveasset.gui.tabs.tree.TreeTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.values.ValueRetroTab;
import net.nikr.eve.jeveasset.gui.tabs.values.ValueTableFormat;
import net.nikr.eve.jeveasset.gui.tabs.values.ValueTableTab;
import net.nikr.eve.jeveasset.i18n.TabsAgents;
import net.nikr.eve.jeveasset.i18n.TabsAssets;
import net.nikr.eve.jeveasset.i18n.TabsContracts;
import net.nikr.eve.jeveasset.i18n.TabsItems;
import net.nikr.eve.jeveasset.i18n.TabsJobs;
import net.nikr.eve.jeveasset.i18n.TabsJournal;
import net.nikr.eve.jeveasset.i18n.TabsLoadout;
import net.nikr.eve.jeveasset.i18n.TabsLoyaltyPoints;
import net.nikr.eve.jeveasset.i18n.TabsMaterials;
import net.nikr.eve.jeveasset.i18n.TabsMining;
import net.nikr.eve.jeveasset.i18n.TabsNpcStanding;
import net.nikr.eve.jeveasset.i18n.TabsOrders;
import net.nikr.eve.jeveasset.i18n.TabsOverview;
import net.nikr.eve.jeveasset.i18n.TabsPriceChanges;
import net.nikr.eve.jeveasset.i18n.TabsPriceHistory;
import net.nikr.eve.jeveasset.i18n.TabsReprocessed;
import net.nikr.eve.jeveasset.i18n.TabsRouting;
import net.nikr.eve.jeveasset.i18n.TabsSkills;
import net.nikr.eve.jeveasset.i18n.TabsSlots;
import net.nikr.eve.jeveasset.i18n.TabsStockpile;
import net.nikr.eve.jeveasset.i18n.TabsTracker;
import net.nikr.eve.jeveasset.i18n.TabsTransaction;
import net.nikr.eve.jeveasset.i18n.TabsTree;
import net.nikr.eve.jeveasset.i18n.TabsValues;
public class ToolLoader implements ActionListener, KeyListener, MouseListener, MouseWheelListener, AWTEventListener, PropertyChangeListener {
public static enum ToolTab {
ASSETS(TabsAssets.get().assets(), AssetsTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getAssetsTab();
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return AssetTableFormat.valueOf(column);
}
},
VALUE(TabsValues.get().oldTitle(), ValueRetroTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getValueTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return null;
}
},
ISK(TabsValues.get().title(), ValueTableTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getIskTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return ValueTableFormat.valueOf(column);
}
},
PRICE_HISTORY(TabsPriceHistory.get().title(), PriceHistoryTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getPriceHistoryTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return null;
}
},
PRICE_CHANGES(TabsPriceChanges.get().title(), PriceChangesTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getPriceChangesTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return PriceChangesTableFormat.valueOf(column);
}
},
MATERIALS(TabsMaterials.get().materials(), MaterialsTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getMaterialsTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
try {
return MaterialExtendedTableFormat.valueOf(column);
} catch (IllegalArgumentException ex) {
return MaterialTableFormat.valueOf(column);
}
}
},
LOADOUTS(TabsLoadout.get().ship(), LoadoutsTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getLoadoutsTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
try {
return LoadoutExtendedTableFormat.valueOf(column);
} catch (IllegalArgumentException ex) {
return LoadoutTableFormat.valueOf(column);
}
}
},
MARKET_ORDERS(TabsOrders.get().market(), MarketOrdersTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getMarketOrdersTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return MarketTableFormat.valueOf(column);
}
},
JOURNAL(TabsJournal.get().title(), JournalTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getJournalTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return JournalTableFormat.valueOf(column);
}
},
TRANSACTION(TabsTransaction.get().title(), TransactionTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getTransactionsTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return TransactionTableFormat.valueOf(column);
}
},
INDUSTRY_JOBS(TabsJobs.get().industry(), IndustryJobsTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getIndustryJobsTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return IndustryJobTableFormat.valueOf(column);
}
},
INDUSTRY_SLOTS(TabsSlots.get().title(), SlotsTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getSlotsTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return SlotsTableFormat.valueOf(column);
}
},
OVERVIEW(TabsOverview.get().overview(), OverviewTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getOverviewTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return OverviewTableFormat.valueOf(column);
}
},
ROUTING(TabsRouting.get().routingTitle(), RoutingTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getRoutingTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return null;
}
},
STOCKPILE(TabsStockpile.get().stockpile(), StockpileTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getStockpileTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
try {
return StockpileExtendedTableFormat.valueOf(column);
} catch (IllegalArgumentException exception) {
return StockpileTableFormat.valueOf(column);
}
}
},
ITEMS(TabsItems.get().items(), ItemsTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getItemsTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return ItemTableFormat.valueOf(column);
}
},
TRACKER(TabsTracker.get().title(), TrackerTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getTrackerTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return null;
}
},
REPROCESSED(TabsReprocessed.get().title(), ReprocessedTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getReprocessedTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
try {
return ReprocessedExtendedTableFormat.valueOf(column);
} catch (IllegalArgumentException ex) {
return ReprocessedTableFormat.valueOf(column);
}
}
},
CONTRACTS(TabsContracts.get().title(), ContractsTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getContractsTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return ContractsTableFormat.valueOf(column);
}
},
TREE(TabsTree.get().title(), TreeTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getTreeTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return TreeTableFormat.valueOf(column);
}
},
SKILLS(TabsSkills.get().skills(), SkillsTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getSkillsTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return SkillsTableFormat.valueOf(column);
}
},
MINING_LOG(TabsMining.get().miningLog(), MiningTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getMiningTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return MiningTableFormat.valueOf(column);
}
},
MINING_GRAPH(TabsMining.get().miningGraph(), MiningGraphTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getMiningGraphTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return null;
}
},
EXTRACTIONS(TabsMining.get().extractions(), ExtractionsTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getExtractionsTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return ExtractionsTableFormat.valueOf(column);
}
},
LOYALTY_POINTS(TabsLoyaltyPoints.get().loyaltyPoints(), LoyaltyPointsTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getLoyaltyPointsTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return LoyaltyPointsTableFormat.valueOf(column);
}
},
NPC_STANDING(TabsNpcStanding.get().npcStanding(), NpcStandingTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getNpcStandingTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return NpcStandingTableFormat.valueOf(column);
}
},
AGENTS(TabsAgents.get().agents(), AgentsTab.NAME){
@Override
public JMainTab getTool(Program program, boolean init) {
return program.getAgentsTab(init);
}
@Override
public EnumTableColumn> getColumn(String column) throws IllegalArgumentException {
return AgentsTableFormat.valueOf(column);
}
};
private final String title;
private final String name;
private ToolTab(String title, String name) {
this.title = title;
this.name = name;
}
public String getTitle() {
return title;
}
public String getName() {
return name;
}
public abstract JMainTab getTool(Program program, boolean init);
public abstract EnumTableColumn> getColumn(final String column) throws IllegalArgumentException;
public EnumTableColumn> getColumn(final String column, final String toolName) {
if (toolName.equals(getName())) {
try {
return getColumn(column);
} catch (IllegalArgumentException exception) {
}
}
return null;
}
}
private static final int IDLE_DELAY_MS = 10000;
private static ToolLoader loader;
private static double max;
private static Map toolTabs;
private final Object SYNC_LOCK = new Object();
private final Program program;
private final Set tools = new HashSet<>();
private boolean ok = false;
private Timer timer;
private String tool = null;
private Progress progress = null;
private Component lastFocusOwner;
private ToolLoader(Program program) {
this.program = program;
tools.addAll(getToolTitles(program));
tools.removeAll(Settings.get().getShowTools());
if (tools.isEmpty()) {
stopBackgroundToolLoading();
return;
}
timer = new Timer(IDLE_DELAY_MS, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ok = true;
openTool();
}
});
Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.MOUSE_MOTION_EVENT_MASK);
KeyboardFocusManager.getCurrentKeyboardFocusManager().addPropertyChangeListener("permanentFocusOwner", this);
timer.start();
}
public static synchronized Map getTools(Program program) {
if (toolTabs == null) {
toolTabs = new HashMap<>();
for (ToolTab toolTab : ToolTab.values()) {
toolTabs.put(toolTab.getTitle(), toolTab);
}
}
return toolTabs;
}
private static void openTool(Program program, String title) {
ToolTab tool = getTools(program).get(title);
if (tool != null) {
program.getMainWindow().addTab(tool.getTool(program, true), false);
}
}
private static void initTool(Program program, String title) {
ToolTab tool = getTools(program).get(title);
if (tool != null) {
tool.getTool(program, true);
}
}
public static void initTools(Program program, Collection titles) {
int index = 0;
int size = titles.size();
for (String title : titles) {
initTool(program, title);
index++;
setProgress(index, size);
}
}
public static void initAllTools(Program program) {
SplashUpdater.setProgress(52);
Collection values = getTools(program).values();
int index = 0;
int size = values.size();
for (ToolTab tool : values) {
tool.getTool(program, true);
index++;
setProgress(index, size);
}
}
private static void setProgress(final float done, final float end) {
setProgress(done, end, 53, 84);
}
private static void setProgress(final float done, final float end, final int minimum, final int maximum) {
int progress = Math.round(((done / end) * (maximum - minimum)) + minimum);
if (progress > 100) {
progress = 100;
} else if (progress < 0) {
progress = 0;
}
SplashUpdater.setProgress(progress);
}
public static void openTools(Program program, Collection titles) {
for (String title : titles) {
openTool(program, title);
}
}
public static HashSet getToolTitles(Program program) {
return new HashSet<>(getTools(program).keySet());
}
public static synchronized void init(Program program) {
Set tools = new HashSet<>();
tools.addAll(getToolTitles(program));
tools.removeAll(Settings.get().getShowTools());
max = tools.size();
}
public static synchronized void startBackgroundToolLoading(Program program) {
if (loader == null) {
loader = new ToolLoader(program);
}
}
public static synchronized void stopBackgroundToolLoading() {
if (loader != null) {
loader.done();
loader = null;
}
}
private void openTool() {
Window currentWindow = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow();
boolean window = currentWindow == null || currentWindow.equals(program.getMainWindow().getFrame());
if (ok && window && tool == null && !tools.isEmpty()) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
openToolInner();
}
});
} else {
synchronized (SYNC_LOCK) {
if (timer != null) {
timer.start();
}
}
}
}
private void openToolInner() {
synchronized (SYNC_LOCK) {
if (timer != null) {
timer.stop();
}
}
addProgress();
tool = tools.iterator().next();
tools.remove(tool);
initTool(program, tool);
tool = null;
progress.setValue((int)((max - tools.size()) / max * 100.0));
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
openTool();
}
});
if (tools.isEmpty()) {
stopBackgroundToolLoading();
removeProgress();
}
}
private void addProgress() {
if (progress == null) {
progress = program.getStatusPanel().addProgress(StatusPanel.UpdateType.TOOLS, new StatusPanel.ProgressControl() {
@Override
public boolean isAuto() {
return true;
}
@Override
public void show() { }
@Override
public void cancel() { }
@Override
public void setPause(boolean pause) { }
});
progress.setVisible(true);
}
}
private void removeProgress() {
program.getStatusPanel().removeProgress(progress);
progress = null;
}
private void done() {
removeProgress();
KeyboardFocusManager.getCurrentKeyboardFocusManager().removePropertyChangeListener("permanentFocusOwner", this);
Toolkit.getDefaultToolkit().removeAWTEventListener(this);
removeListeners();
synchronized (SYNC_LOCK) {
timer.stop();
timer = null;
}
}
private void updateListeners() {
Component currentFocusOwner = program.getMainWindow().getFrame().getFocusOwner();
if (lastFocusOwner != null && (currentFocusOwner == null || !lastFocusOwner.equals(currentFocusOwner))) {
removeListeners();
}
if (currentFocusOwner != null && !tools.isEmpty()) {
addListeners();
}
}
private void removeListeners() {
if (lastFocusOwner != null) {
lastFocusOwner.removeKeyListener(this);
lastFocusOwner.removeMouseListener(this);
}
if (lastFocusOwner instanceof JComboBox) {
((JComboBox)lastFocusOwner).removeActionListener(this);
}
if (lastFocusOwner instanceof AbstractButton) {
((AbstractButton)lastFocusOwner).removeActionListener(this);
}
}
private void addListeners() {
Component currentFocusOwner = program.getMainWindow().getFrame().getFocusOwner();
lastFocusOwner = currentFocusOwner;
lastFocusOwner.addMouseListener(this);
lastFocusOwner.addKeyListener(this);
if (lastFocusOwner instanceof JComboBox) {
((JComboBox)lastFocusOwner).addActionListener(this);
}
if (lastFocusOwner instanceof AbstractButton) {
((AbstractButton)lastFocusOwner).addActionListener(this);
}
}
private void restart() {
synchronized (SYNC_LOCK) {
if (timer != null) {
timer.stop();
timer.start();
}
}
removeProgress();
ok = false;
}
@Override
public void eventDispatched(AWTEvent event) { restart(); }
@Override public void mouseWheelMoved(MouseWheelEvent e) { restart(); }
@Override public void mouseClicked(MouseEvent e) { restart(); }
@Override public void mousePressed(MouseEvent e) { restart(); }
@Override public void mouseReleased(MouseEvent e) { restart(); }
@Override public void mouseEntered(MouseEvent e) { }
@Override public void mouseExited(MouseEvent e) { }
@Override public void actionPerformed(final ActionEvent e) { restart(); }
@Override public void keyTyped(KeyEvent e) { restart(); }
@Override public void keyPressed(KeyEvent e) { restart(); }
@Override public void keyReleased(KeyEvent e) { restart(); }
@Override
public void propertyChange(PropertyChangeEvent evt) {
updateListeners();
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/accounts/AbstractOwner.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.accounts;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.nikr.eve.jeveasset.data.api.my.MyAccountBalance;
import net.nikr.eve.jeveasset.data.api.my.MyAsset;
import net.nikr.eve.jeveasset.data.api.my.MyContract;
import net.nikr.eve.jeveasset.data.api.my.MyContractItem;
import net.nikr.eve.jeveasset.data.api.my.MyExtraction;
import net.nikr.eve.jeveasset.data.api.my.MyIndustryJob;
import net.nikr.eve.jeveasset.data.api.my.MyJournal;
import net.nikr.eve.jeveasset.data.api.my.MyLoyaltyPoints;
import net.nikr.eve.jeveasset.data.api.my.MyMarketOrder;
import net.nikr.eve.jeveasset.data.api.my.MyMining;
import net.nikr.eve.jeveasset.data.api.my.MyNpcStanding;
import net.nikr.eve.jeveasset.data.api.my.MyShip;
import net.nikr.eve.jeveasset.data.api.my.MySkill;
import net.nikr.eve.jeveasset.data.api.my.MyTransaction;
import net.nikr.eve.jeveasset.data.api.raw.RawBlueprint;
import net.nikr.eve.jeveasset.data.api.raw.RawClone;
import net.nikr.eve.jeveasset.data.settings.Settings;
public abstract class AbstractOwner implements OwnerType {
private List accountBalances = new ArrayList<>();
private Set marketOrders = new HashSet<>();
private Set transactions = new HashSet<>();
private Set journal = new HashSet<>();
private Set industryJobs = new HashSet<>();
private Map> contracts = new HashMap<>();
private List assets = new ArrayList<>();
private Map blueprints = new HashMap<>();
private Map walletDivisions = new HashMap<>();
private Map assetDivisions = new HashMap<>();
private List skills = new ArrayList<>();
private List clones = new ArrayList<>();
private Set mining = new HashSet<>();
private Set extractions = new HashSet<>();
private Set loyaltyPoints = new HashSet<>();
private Set npcStanding = new HashSet<>();
private Long totalSkillPoints = null;
private Integer unallocatedSkillPoints = null;
private final String accountID;
private String ownerName;
private String corporationName = null;
private long ownerID;
private boolean showOwner = true;
private boolean invalid = false;
private MyShip activeShip;
private Date assetLastUpdate = null;
private Date assetNextUpdate = Settings.getNow();
private Date balanceLastUpdate = null;
private Date balanceNextUpdate = Settings.getNow();
private Date marketOrdersNextUpdate = Settings.getNow();
private Date journalNextUpdate = Settings.getNow();
private Date transactionsNextUpdate = Settings.getNow();
private Date industryJobsNextUpdate = Settings.getNow();
private Date contractsNextUpdate = Settings.getNow();
private Date locationsNextUpdate = Settings.getNow();
private Date blueprintsNextUpdate = Settings.getNow();
private Date skillsNextUpdate = Settings.getNow();
private Date loyaltyPointsNextUpdate = Settings.getNow();
private Date npcStandingNextUpdate = Settings.getNow();
private Date miningNextUpdate = Settings.getNow();
public AbstractOwner(String uniqueID) {
this.accountID = uniqueID;
}
public AbstractOwner(AbstractOwner abstractOwner) {
accountID = abstractOwner.accountID;
accountBalances.addAll(abstractOwner.accountBalances);
marketOrders.addAll(abstractOwner.marketOrders);
transactions.addAll(abstractOwner.transactions);
journal.addAll(abstractOwner.journal);
industryJobs.addAll(abstractOwner.industryJobs);
contracts.putAll(abstractOwner.contracts);
assets.addAll(abstractOwner.assets);
blueprints.putAll(abstractOwner.blueprints);
walletDivisions.putAll(abstractOwner.walletDivisions);
assetDivisions.putAll(abstractOwner.assetDivisions);
skills.addAll(abstractOwner.skills);
loyaltyPoints.addAll(abstractOwner.loyaltyPoints);
npcStanding.addAll(abstractOwner.npcStanding);
clones.addAll(abstractOwner.clones);
mining.addAll(abstractOwner.mining);
extractions.addAll(abstractOwner.extractions);
this.totalSkillPoints = abstractOwner.totalSkillPoints;
this.unallocatedSkillPoints = abstractOwner.unallocatedSkillPoints;
this.ownerName = abstractOwner.ownerName;
this.corporationName = abstractOwner.corporationName;
this.ownerID = abstractOwner.ownerID;
this.showOwner = abstractOwner.showOwner;
this.invalid = abstractOwner.invalid;
this.activeShip = abstractOwner.activeShip;
this.assetLastUpdate = abstractOwner.assetLastUpdate;
this.assetNextUpdate = abstractOwner.assetNextUpdate;
this.balanceLastUpdate = abstractOwner.balanceLastUpdate;
this.balanceNextUpdate = abstractOwner.balanceNextUpdate;
this.marketOrdersNextUpdate = abstractOwner.marketOrdersNextUpdate;
this.journalNextUpdate = abstractOwner.journalNextUpdate;
this.transactionsNextUpdate = abstractOwner.transactionsNextUpdate;
this.industryJobsNextUpdate = abstractOwner.industryJobsNextUpdate;
this.contractsNextUpdate = abstractOwner.contractsNextUpdate;
this.locationsNextUpdate = abstractOwner.locationsNextUpdate;
this.blueprintsNextUpdate = abstractOwner.blueprintsNextUpdate;
this.skillsNextUpdate = abstractOwner.skillsNextUpdate;
this.loyaltyPointsNextUpdate = abstractOwner.loyaltyPointsNextUpdate;
this.npcStandingNextUpdate = abstractOwner.npcStandingNextUpdate;
this.miningNextUpdate = abstractOwner.miningNextUpdate;
}
@Override
public String getAccountID() {
return accountID;
}
@Override
public synchronized void setAssetNextUpdate(final Date nextUpdate) {
this.assetNextUpdate = nextUpdate;
}
@Override
public synchronized void setBalanceNextUpdate(final Date balanceNextUpdate) {
this.balanceNextUpdate = balanceNextUpdate;
}
@Override
public synchronized void setBlueprintsNextUpdate(final Date blueprintsNextUpdate) {
this.blueprintsNextUpdate = blueprintsNextUpdate;
}
@Override
public synchronized void setContractsNextUpdate(final Date contractsNextUpdate) {
this.contractsNextUpdate = contractsNextUpdate;
}
@Override
public synchronized void setIndustryJobsNextUpdate(final Date industryJobsNextUpdate) {
this.industryJobsNextUpdate = industryJobsNextUpdate;
}
@Override
public synchronized void setLocationsNextUpdate(final Date locationsNextUpdate) {
this.locationsNextUpdate = locationsNextUpdate;
}
@Override
public synchronized void setMarketOrdersNextUpdate(final Date marketOrdersNextUpdate) {
this.marketOrdersNextUpdate = marketOrdersNextUpdate;
}
@Override
public synchronized void setJournalNextUpdate(final Date journalNextUpdate) {
this.journalNextUpdate = journalNextUpdate;
}
@Override
public void setSkillsNextUpdate(Date skillsNextUpdate) {
this.skillsNextUpdate = skillsNextUpdate;
}
@Override
public Date getLoyaltyPointsNextUpdate() {
return loyaltyPointsNextUpdate;
}
@Override
public Date getNpcStandingNextUpdate() {
return npcStandingNextUpdate;
}
@Override
public synchronized void setTransactionsNextUpdate(final Date transactionsNextUpdate) {
this.transactionsNextUpdate = transactionsNextUpdate;
}
@Override
public synchronized Date getTransactionsNextUpdate() {
return transactionsNextUpdate;
}
@Override
public synchronized Date getAssetNextUpdate() {
return assetNextUpdate;
}
@Override
public synchronized Date getBalanceNextUpdate() {
return balanceNextUpdate;
}
@Override
public synchronized Date getBlueprintsNextUpdate() {
return blueprintsNextUpdate;
}
@Override
public synchronized Date getContractsNextUpdate() {
return contractsNextUpdate;
}
@Override
public synchronized Date getIndustryJobsNextUpdate() {
return industryJobsNextUpdate;
}
@Override
public synchronized Date getLocationsNextUpdate() {
return locationsNextUpdate;
}
@Override
public synchronized Date getMarketOrdersNextUpdate() {
return marketOrdersNextUpdate;
}
@Override
public synchronized Date getJournalNextUpdate() {
return journalNextUpdate;
}
@Override
public Date getSkillsNextUpdate() {
return skillsNextUpdate;
}
@Override
public void setLoyaltyPointsNextUpdate(Date loyaltyPointsNextUpdate) {
this.loyaltyPointsNextUpdate = loyaltyPointsNextUpdate;
}
@Override
public void setNpcStandingNextUpdate(Date npcStandingNextUpdate) {
this.npcStandingNextUpdate = npcStandingNextUpdate;
}
@Override
public abstract int hashCode();
@Override
public abstract boolean equals(Object obj);
@Override
public final void setOwnerName(final String ownerName) {
this.ownerName = ownerName;
}
@Override
public final void setAssetLastUpdate(final Date assetLastUpdate) {
this.assetLastUpdate = assetLastUpdate;
}
@Override
public final void setBalanceLastUpdate(final Date balanceLastUpdate) {
this.balanceLastUpdate = balanceLastUpdate;
}
@Override
public final void setOwnerID(final long ownerID) {
this.ownerID = ownerID;
}
@Override
public final String toString() {
return getOwnerName();
}
@Override
public final boolean isCharacter() {
return !isCorporation();
}
@Override
public final boolean isExpired() {
if (getExpire() == null) {
return false;
} else {
return getExpire().before(new Date());
}
}
@Override
public final String getOwnerName() {
if (ownerName == null || ownerName.isEmpty()) {
return "Owner #" + getOwnerID();
} else {
return ownerName;
}
}
@Override
public final boolean isShowOwner() {
return showOwner;
}
@Override
public synchronized boolean isInvalid() {
return invalid;
}
@Override
public final Date getAssetLastUpdate() {
return assetLastUpdate;
}
@Override
public final Date getBalanceLastUpdate() {
return balanceLastUpdate;
}
@Override
public final long getOwnerID() {
return ownerID;
}
@Override
public String getCorporationName() {
return corporationName;
}
@Override
public MyShip getActiveShip() {
return activeShip;
}
@Override
public void setCorporationName(String corporationName) {
this.corporationName = corporationName;
}
@Override
public final List getAccountBalances() {
return accountBalances;
}
@Override
public synchronized final Set getMarketOrders() {
return marketOrders;
}
@Override
public Date getMiningNextUpdate() {
return miningNextUpdate;
}
@Override
public final Set getTransactions() {
return transactions;
}
@Override
public final Set getJournal() {
return journal;
}
@Override
public final Set getIndustryJobs() {
return industryJobs;
}
@Override
public final Map> getContracts() {
return contracts;
}
@Override
public final synchronized List getAssets() {
return assets;
}
public final synchronized void addAsset(MyAsset asset) {
assets.add(asset);
}
public final synchronized void removeAssets(List remove) {
assets.removeAll(remove);
}
@Override
public final Map getBlueprints() {
return blueprints;
}
@Override
public List getSkills() {
return skills;
}
@Override
public Set getLoyaltyPoints() {
return loyaltyPoints;
}
@Override
public Set getNpcStanding() {
return npcStanding;
}
@Override
public List getClones() {
return clones;
}
@Override
public Set getMining() {
return mining;
}
@Override
public Set getExtractions() {
return extractions;
}
@Override
public Long getTotalSkillPoints() {
return totalSkillPoints;
}
@Override
public Integer getUnallocatedSkillPoints() {
return unallocatedSkillPoints;
}
@Override
public final void setShowOwner(final boolean showOwner) {
this.showOwner = showOwner;
}
@Override
public synchronized void setInvalid(boolean invalid) {
this.invalid = invalid;
}
@Override
public final void setBlueprints(final Map blueprints) {
this.blueprints = blueprints;
}
@Override
public final void setIndustryJobs(final Set industryJobs) {
this.industryJobs = industryJobs;
}
@Override
public final void setTransactions(final Set transactions) {
this.transactions = transactions;
}
@Override
public final void setJournal(final Set journal) {
this.journal = journal;
}
@Override
public final void setMarketOrders(final Set marketOrders) {
this.marketOrders = marketOrders;
}
@Override
public void setMiningNextUpdate(Date miningNextUpdate) {
this.miningNextUpdate = miningNextUpdate;
}
@Override
public final void setContracts(final Map> contracts) {
this.contracts = contracts;
}
@Override
public final synchronized void setAssets(final List assets) {
this.assets = assets;
}
@Override
public final void setAccountBalances(final List accountBalances) {
this.accountBalances = accountBalances;
}
@Override
public Map getWalletDivisions() {
return walletDivisions;
}
@Override
public void setWalletDivisions(Map walletDivisions) {
this.walletDivisions = walletDivisions;
}
@Override
public Map getAssetDivisions() {
return assetDivisions;
}
@Override
public void setAssetDivisions(Map assetDivisions) {
this.assetDivisions = assetDivisions;
}
@Override
public void setSkills(List skills) {
this.skills = skills;
}
@Override
public void setLoyaltyPoints(Set loyaltyPoints) {
this.loyaltyPoints = loyaltyPoints;
}
@Override
public void setNpcStanding(Set npcStanding) {
this.npcStanding = npcStanding;
}
@Override
public void setClones(List clones) {
this.clones = clones;
}
@Override
public void setMining(Set mining) {
this.mining = mining;
}
@Override
public void setExtractions(Set extractions) {
this.extractions = extractions;
}
@Override
public void setTotalSkillPoints(Long totalSkillPoints) {
this.totalSkillPoints = totalSkillPoints;
}
@Override
public void setUnallocatedSkillPoints(Integer unallocatedSkillPoints) {
this.unallocatedSkillPoints = unallocatedSkillPoints;
}
@Override
public void setActiveShip(MyShip activeShip) {
this.activeShip = activeShip;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/accounts/ApiType.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.accounts;
public enum ApiType {
ESI
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/accounts/EsiOwner.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.accounts;
import java.util.Arrays;
import java.util.Date;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import net.nikr.eve.jeveasset.data.settings.Settings;
import net.nikr.eve.jeveasset.io.esi.AbstractEsiGetter;
import net.nikr.eve.jeveasset.io.esi.EsiCallbackURL;
import net.nikr.eve.jeveasset.io.esi.EsiScopes;
import net.troja.eve.esi.ApiClient;
import net.troja.eve.esi.ApiClientBuilder;
import net.troja.eve.esi.api.AssetsApi;
import net.troja.eve.esi.api.CharacterApi;
import net.troja.eve.esi.api.ClonesApi;
import net.troja.eve.esi.api.ContractsApi;
import net.troja.eve.esi.api.CorporationApi;
import net.troja.eve.esi.api.IndustryApi;
import net.troja.eve.esi.api.LocationApi;
import net.troja.eve.esi.api.LoyaltyApi;
import net.troja.eve.esi.api.MarketApi;
import net.troja.eve.esi.api.PlanetaryInteractionApi;
import net.troja.eve.esi.api.SkillsApi;
import net.troja.eve.esi.api.UniverseApi;
import net.troja.eve.esi.api.UserInterfaceApi;
import net.troja.eve.esi.api.WalletApi;
import net.troja.eve.esi.auth.OAuth;
import net.troja.eve.esi.model.CharacterRolesResponse.RolesEnum;
public class EsiOwner extends AbstractOwner implements OwnerType {
private final ApiClient apiClient = new ApiClientBuilder().okHttpClient(AbstractEsiGetter.getHttpClient()).build();
private final MarketApi marketApi = new MarketApi(apiClient);
private final IndustryApi industryApi = new IndustryApi(apiClient);
private final CharacterApi characterApi = new CharacterApi(apiClient);
private final ClonesApi clonesApi = new ClonesApi(apiClient);
private final AssetsApi assetsApi = new AssetsApi(apiClient);
private final WalletApi walletApi = new WalletApi(apiClient);
private final UniverseApi universeApi = new UniverseApi(apiClient);
private final ContractsApi contractsApi = new ContractsApi(apiClient);
private final CorporationApi corporationApi = new CorporationApi(apiClient);
private final LocationApi locationApi = new LocationApi(apiClient);
private final PlanetaryInteractionApi planetaryInteractionApi = new PlanetaryInteractionApi(apiClient);
private final UserInterfaceApi userInterfaceApi = new UserInterfaceApi(apiClient);
private final SkillsApi skillsApi = new SkillsApi(apiClient);
private final LoyaltyApi loyaltyApi = new LoyaltyApi(apiClient);
private String accountName;
private Set scopes = new HashSet<>();
private Date structuresNextUpdate = Settings.getNow();
private Date accountNextUpdate = Settings.getNow();
private EsiCallbackURL callbackURL;
private Set roles = EnumSet.noneOf(RolesEnum.class);
public static EsiOwner create() {
return new EsiOwner();
}
private EsiOwner() {
super(UUID.randomUUID().toString());
}
public EsiOwner(String uniqueID) {
super(uniqueID);
}
public EsiOwner(EsiOwner esiOwner) {
super(esiOwner);
this.accountName = esiOwner.accountName;
this.scopes = esiOwner.scopes;
this.structuresNextUpdate = esiOwner.structuresNextUpdate;
this.accountNextUpdate = esiOwner.accountNextUpdate;
this.roles = esiOwner.roles;
setAuth(esiOwner.callbackURL, esiOwner.getOAuth().getRefreshToken(), esiOwner.getOAuth().getAccessToken());
}
public synchronized String getRefreshToken() {
return getOAuth().getRefreshToken();
}
public Set getScopes() {
return scopes;
}
public void setScopes(String scopes) {
this.scopes = new HashSet<>(Arrays.asList(scopes.split(" ")));
}
public final void setScopes(Set scopes) {
this.scopes = new HashSet<>(scopes);
}
public synchronized Date getStructuresNextUpdate() {
return structuresNextUpdate;
}
public synchronized void setStructuresNextUpdate(Date structuresNextUpdate) {
this.structuresNextUpdate = structuresNextUpdate;
}
public Date getAccountNextUpdate() {
return accountNextUpdate;
}
public void setAccountNextUpdate(Date accountNextUpdate) {
this.accountNextUpdate = accountNextUpdate;
}
public EsiCallbackURL getCallbackURL() {
return callbackURL;
}
public Set getRoles() {
return roles;
}
public void setRoles(Set roles) {
this.roles = roles;
}
@Override
public boolean isCorporation() {
return isRoles();
}
@Override
public Date getExpire() {
return null;
}
@Override
public String getComparator() {
return "esi" + getAccountName() + getRefreshToken();
}
@Override
public String getAccountName() {
if (accountName == null || accountName.isEmpty()) {
accountName = getOwnerName();
}
return accountName;
}
@Override
public ApiType getAccountAPI() {
return ApiType.ESI;
}
@Override
public void setResetAccountName() {
accountName = getOwnerName();
}
@Override
public void setAccountName(String accountName) {
this.accountName = accountName;
}
@Override
public boolean isAssetList() {
if (isCorporation()) {
return EsiScopes.CORPORATION_ASSETS.isInScope(scopes) && roles.contains(RolesEnum.DIRECTOR);
} else {
return EsiScopes.CHARACTER_ASSETS.isInScope(scopes);
}
}
private boolean isWallet() {
if (isCorporation()) {
return EsiScopes.CORPORATION_WALLET.isInScope(scopes)
&& (roles.contains(RolesEnum.JUNIOR_ACCOUNTANT)
|| roles.contains(RolesEnum.ACCOUNTANT)
|| roles.contains(RolesEnum.DIRECTOR));
} else {
return EsiScopes.CHARACTER_WALLET.isInScope(scopes);
}
}
@Override
public boolean isClones() {
if (isCorporation()) {
return false; //Character Endpoint
} else {
return EsiScopes.CHARACTER_CLONE.isInScope(scopes);
}
}
@Override
public boolean isImplants() {
if (isCorporation()) {
return false; //Character Endpoint
} else {
return EsiScopes.CHARACTER_IMPLANT.isInScope(scopes);
}
}
@Override
public boolean isAccountBalance() {
return isWallet();
}
@Override
public boolean isBlueprints() {
if (isCorporation()) {
return EsiScopes.CORPORATION_BLUEPRINTS.isInScope(scopes) && roles.contains(RolesEnum.DIRECTOR);
} else {
return EsiScopes.CHARACTER_BLUEPRINTS.isInScope(scopes);
}
}
@Override
public boolean isDivisions() {
if (isCorporation()) {
return EsiScopes.CORPORATION_DIVISIONS.isInScope(scopes) && roles.contains(RolesEnum.DIRECTOR);
} else {
return false;
}
}
@Override
public boolean isIndustryJobs() {
if (isCorporation()) {
return EsiScopes.CORPORATION_INDUSTRY_JOBS.isInScope(scopes)
&& (roles.contains(RolesEnum.FACTORY_MANAGER)
|| roles.contains(RolesEnum.DIRECTOR));
} else {
return EsiScopes.CHARACTER_INDUSTRY_JOBS.isInScope(scopes);
}
}
@Override
public boolean isMarketOrders() {
if (isCorporation()) {
return EsiScopes.CORPORATION_MARKET_ORDERS.isInScope(scopes)
&& (roles.contains(RolesEnum.ACCOUNTANT)
|| roles.contains(RolesEnum.TRADER)
|| roles.contains(RolesEnum.DIRECTOR));
} else {
return EsiScopes.CHARACTER_MARKET_ORDERS.isInScope(scopes);
}
}
@Override
public boolean isPlanetaryInteraction() {
if (isCorporation()) {
return false; //Character Endpoint
} else {
return EsiScopes.CHARACTER_PLANETARY_INTERACTION.isInScope(scopes);
}
}
@Override
public boolean isTransactions() {
return isWallet();
}
@Override
public boolean isJournal() {
return isWallet();
}
@Override
public boolean isContracts() {
if (isCorporation()) {
return EsiScopes.CORPORATION_CONTRACTS.isInScope(scopes);
} else {
return EsiScopes.CHARACTER_CONTRACTS.isInScope(scopes);
}
}
@Override
public boolean isLocations() {
return isAssetList();
}
@Override
public boolean isStructures() {
if (isCorporation()) {
return false; //Character Endpoint
} else {
return EsiScopes.CHARACTER_STRUCTURES.isInScope(scopes);
}
}
@Override
public boolean isMarketStructures() {
if (isCorporation()) {
return false; //Character Endpoint
} else {
return EsiScopes.CHARACTER_MARKET_STRUCTURES.isInScope(scopes);
}
}
@Override
public boolean isShip() {
if (isCorporation()) {
return false; //Character Endpoint
} else {
return EsiScopes.CHARACTER_SHIP_TYPE.isInScope(scopes) && EsiScopes.CHARACTER_SHIP_LOCATION.isInScope(scopes);
}
}
@Override
public boolean isOpenWindows() {
if (isCorporation()) {
return false; //Character Endpoint
} else {
return EsiScopes.CHARACTER_OPEN_WINDOWS.isInScope(scopes);
}
}
@Override
public boolean isAutopilot() {
if (isCorporation()) {
return false; //Character Endpoint
} else {
return EsiScopes.CHARACTER_AUTOPILOT.isInScope(scopes);
}
}
@Override
public boolean isPrivilegesLimited() {
return EsiScopes.isPrivilegesLimited(isCorporation(), scopes);
}
@Override
public boolean isPrivilegesInvalid() {
return EsiScopes.isPrivilegesInvalid(isCorporation(), scopes);
}
@Override
public boolean isSkills() {
return EsiScopes.CHARACTER_SKILLS.isInScope(scopes);
}
@Override
public boolean isLoyaltyPoints() {
return EsiScopes.CHARACTER_LOYALTY_POINTS.isInScope(scopes);
}
@Override
public boolean isNpcStanding() {
if (isCorporation()) {
return EsiScopes.CORPORATION_NPC_STANDING.isInScope(scopes);
} else {
return EsiScopes.CHARACTER_NPC_STANDING.isInScope(scopes);
}
}
@Override
public boolean isMining() {
if (isCorporation()) {
return EsiScopes.CORPORATION_MINING.isInScope(scopes)
&& ((roles.contains(RolesEnum.ACCOUNTANT) && roles.contains(RolesEnum.STATION_MANAGER))
|| roles.contains(RolesEnum.DIRECTOR));
} else {
return EsiScopes.CHARACTER_MINING.isInScope(scopes);
}
}
public boolean isRoles() {
return EsiScopes.CORPORATION_ROLES.isInScope(scopes);
}
public final void updateAuth(EsiOwner esiOwner) {
OAuth oAuth = esiOwner.getOAuth();
setAuth(esiOwner.getCallbackURL(), oAuth.getRefreshToken(), oAuth.getAccessToken());
setScopes(esiOwner.getScopes()); //Is bound to the access token, so should be updated here
setInvalid(false);
}
public synchronized final void setAuth(EsiCallbackURL callbackURL, String refreshToken, String accessToken) {
if (callbackURL != null) {
this.callbackURL = callbackURL;
}
if (callbackURL != null && refreshToken != null) {
getOAuth().setAuth(callbackURL.getA(), refreshToken);
getOAuth().setAccessToken(accessToken);
}
}
private OAuth getOAuth() {
return (OAuth) apiClient.getAuthentication(ApiClientBuilder.AUTHENTICATION);
}
public synchronized ApiClient getApiClient() {
return apiClient;
}
public MarketApi getMarketApiAuth() {
return marketApi;
}
public IndustryApi getIndustryApiAuth() {
return industryApi;
}
public CharacterApi getCharacterApiAuth() {
return characterApi;
}
public AssetsApi getAssetsApiAuth() {
return assetsApi;
}
public WalletApi getWalletApiAuth() {
return walletApi;
}
public UniverseApi getUniverseApiAuth() {
return universeApi;
}
public ClonesApi getClonesApiAuth() {
return clonesApi;
}
public ContractsApi getContractsApiAuth() {
return contractsApi;
}
public CorporationApi getCorporationApiAuth() {
return corporationApi;
}
public LocationApi getLocationApiAuth() {
return locationApi;
}
public UserInterfaceApi getUserInterfaceApiAuth() {
return userInterfaceApi;
}
public PlanetaryInteractionApi getPlanetaryInteractionApiAuth() {
return planetaryInteractionApi;
}
public SkillsApi getSkillsApiAuth() {
return skillsApi;
}
public LoyaltyApi getLoyaltyApiAuth() {
return loyaltyApi;
}
@Override
public int hashCode() {
int hash = 5;
hash = 61 * hash + Objects.hashCode(this.getRefreshToken());
hash = 61 * hash + Objects.hashCode(this.scopes);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final EsiOwner other = (EsiOwner) obj;
if (!Objects.equals(this.getRefreshToken(), other.getRefreshToken())) {
return false;
}
if (!Objects.equals(this.scopes, other.scopes)) {
return false;
}
return true;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/accounts/OwnerType.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.accounts;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.nikr.eve.jeveasset.data.api.my.MyAccountBalance;
import net.nikr.eve.jeveasset.data.api.my.MyAsset;
import net.nikr.eve.jeveasset.data.api.my.MyContract;
import net.nikr.eve.jeveasset.data.api.my.MyContractItem;
import net.nikr.eve.jeveasset.data.api.my.MyExtraction;
import net.nikr.eve.jeveasset.data.api.my.MyIndustryJob;
import net.nikr.eve.jeveasset.data.api.my.MyJournal;
import net.nikr.eve.jeveasset.data.api.my.MyLoyaltyPoints;
import net.nikr.eve.jeveasset.data.api.my.MyMarketOrder;
import net.nikr.eve.jeveasset.data.api.my.MyMining;
import net.nikr.eve.jeveasset.data.api.my.MyNpcStanding;
import net.nikr.eve.jeveasset.data.api.my.MyShip;
import net.nikr.eve.jeveasset.data.api.my.MySkill;
import net.nikr.eve.jeveasset.data.api.my.MyTransaction;
import net.nikr.eve.jeveasset.data.api.raw.RawBlueprint;
import net.nikr.eve.jeveasset.data.api.raw.RawClone;
public interface OwnerType extends SimpleOwner {
//Info
public String getAccountID();
public String getCorporationName();
public void setOwnerName(final String ownerName);
public void setCorporationName(String corporationName);
public void setOwnerID(final long ownerID);
public boolean isShowOwner();
public Date getExpire();
public String getComparator();
public String getAccountName();
public boolean isExpired();
public boolean isInvalid();
public ApiType getAccountAPI();
public void setShowOwner(final boolean showOwner);
public void setInvalid(boolean invalid);
public void setResetAccountName();
public void setAccountName(final String accountName);
public void setActiveShip(MyShip activeShip);
//Data
public List getAccountBalances();
public Set getMarketOrders();
public Set getTransactions();
public Set getJournal();
public Set getIndustryJobs();
public Map> getContracts();
public List getAssets();
public Map getBlueprints();
public Map getWalletDivisions();
public List getSkills();
public Long getTotalSkillPoints();
public Integer getUnallocatedSkillPoints();
public Set getMining();
public Set getExtractions();
public Set getLoyaltyPoints();
public Set getNpcStanding();
public List getClones();
public void setBlueprints(final Map blueprints);
public void setIndustryJobs(final Set industryJobs);
public void setTransactions(final Set transactions);
public void setJournal(final Set journal);
public void setMarketOrders(final Set marketOrders);
public void setContracts(final Map> contracts);
public void setAssets(final List assets);
public void setAccountBalances(final List accountBalances);
public void setWalletDivisions(final Map walletDivisions);
public void setAssetDivisions(final Map assetDivisions);
public void setSkills(final List skills);
public void setTotalSkillPoints(final Long totalSkillPoints);
public void setUnallocatedSkillPoints(final Integer unallocatedSkillPoints);
public void setMining(Set mining);
public void setExtractions(Set extractions);
public void setClones(List clones);
public void setLoyaltyPoints(Set loyaltyPoints);
public void setNpcStanding(Set npcStanding);
//Account Mask
public boolean isCharacter();
public boolean isAssetList();
public boolean isClones();
public boolean isImplants();
public boolean isAccountBalance();
public boolean isIndustryJobs();
public boolean isMarketOrders();
public boolean isTransactions();
public boolean isJournal();
public boolean isContracts();
public boolean isLocations();
public boolean isStructures();
public boolean isMarketStructures();
public boolean isBlueprints();
public boolean isShip();
public boolean isOpenWindows();
public boolean isPlanetaryInteraction();
public boolean isAutopilot();
public boolean isDivisions();
public boolean isPrivilegesLimited();
public boolean isPrivilegesInvalid();
public boolean isSkills();
public boolean isMining();
public boolean isLoyaltyPoints();
public boolean isNpcStanding();
//Last Update
public Date getAssetLastUpdate();
public Date getBalanceLastUpdate();
public void setAssetLastUpdate(final Date assetLastUpdate);
public void setBalanceLastUpdate(final Date balanceLastUpdate);
//Next Update
public void setAssetNextUpdate(final Date nextUpdate);
public void setBalanceNextUpdate(final Date balanceNextUpdate);
public void setBlueprintsNextUpdate(Date blueprintsNextUpdate);
public void setContractsNextUpdate(final Date contractsNextUpdate);
public void setIndustryJobsNextUpdate(final Date industryJobsNextUpdate);
public void setLocationsNextUpdate(final Date locationsNextUpdate);
public void setMarketOrdersNextUpdate(final Date marketOrdersNextUpdate);
public void setJournalNextUpdate(final Date journalNextUpdate);
public void setTransactionsNextUpdate(final Date transactionsNextUpdate);
public void setSkillsNextUpdate(final Date skillsNextUpdate);
public void setLoyaltyPointsNextUpdate(final Date loyaltyPointsNextUpdate);
public void setNpcStandingNextUpdate(Date npcStandingNextUpdate);
public void setMiningNextUpdate(final Date miningNextUpdate);
public Date getTransactionsNextUpdate();
public Date getAssetNextUpdate();
public Date getBalanceNextUpdate();
public Date getBlueprintsNextUpdate();
public Date getContractsNextUpdate();
public Date getIndustryJobsNextUpdate();
public Date getLocationsNextUpdate();
public Date getMarketOrdersNextUpdate();
public Date getJournalNextUpdate();
public Date getSkillsNextUpdate();
public Date getLoyaltyPointsNextUpdate();
public Date getNpcStandingNextUpdate();
public Date getMiningNextUpdate();
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/accounts/SimpleOwner.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.accounts;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
import net.nikr.eve.jeveasset.data.api.my.MyShip;
public interface SimpleOwner extends Comparable {
public long getOwnerID();
public String getOwnerName();
public boolean isCorporation();
default Map getAssetDivisions() {
return new HashMap<>();
}
@Nullable
default MyShip getActiveShip() {
return null;
}
@Override
default int compareTo(final SimpleOwner o) {
return this.getOwnerName().compareToIgnoreCase(o.getOwnerName());
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyAccountBalance.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import net.nikr.eve.jeveasset.data.api.accounts.OwnerType;
import net.nikr.eve.jeveasset.data.api.raw.RawAccountBalance;
public class MyAccountBalance extends RawAccountBalance {
private final OwnerType owner;
public MyAccountBalance(RawAccountBalance rawAccountBalance, OwnerType owner) {
super(rawAccountBalance);
this.owner = owner;
}
public String getOwnerName() {
return owner.getOwnerName();
}
public long getOwnerID() {
return owner.getOwnerID();
}
public boolean isCorporation() {
return owner.isCorporation();
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyAsset.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import net.nikr.eve.jeveasset.data.api.accounts.SimpleOwner;
import net.nikr.eve.jeveasset.data.api.my.MyIndustryJob.IndustryActivity;
import net.nikr.eve.jeveasset.data.api.raw.RawAsset;
import net.nikr.eve.jeveasset.data.api.raw.RawClone;
import net.nikr.eve.jeveasset.data.sde.Item;
import net.nikr.eve.jeveasset.data.sde.MyLocation;
import net.nikr.eve.jeveasset.data.settings.MarketPriceData;
import net.nikr.eve.jeveasset.data.settings.PriceData;
import net.nikr.eve.jeveasset.data.settings.UserItem;
import net.nikr.eve.jeveasset.data.settings.tag.TagID;
import net.nikr.eve.jeveasset.data.settings.tag.Tags;
import net.nikr.eve.jeveasset.data.settings.types.BlueprintType;
import net.nikr.eve.jeveasset.data.settings.types.EditableLocationType;
import net.nikr.eve.jeveasset.data.settings.types.EditablePriceType;
import net.nikr.eve.jeveasset.data.settings.types.ItemType;
import net.nikr.eve.jeveasset.data.settings.types.OwnersType;
import net.nikr.eve.jeveasset.data.settings.types.TagsType;
import net.nikr.eve.jeveasset.gui.shared.Formatter;
import net.nikr.eve.jeveasset.gui.shared.menu.JMenuInfo.InfoItem;
import net.nikr.eve.jeveasset.gui.shared.table.containers.AssetContainer;
import net.nikr.eve.jeveasset.gui.tabs.assets.AssetsTab;
import net.nikr.eve.jeveasset.i18n.DataModelAsset;
import net.nikr.eve.jeveasset.i18n.General;
import net.nikr.eve.jeveasset.io.shared.ApiIdConverter;
public class MyAsset extends RawAsset implements Comparable, InfoItem, ItemType, BlueprintType, EditablePriceType, TagsType, EditableLocationType, OwnersType {
//Static values (set by constructor)
private final List assets = new ArrayList<>();
private final RawAsset rawAsset;
private final Item item;
private final SimpleOwner owner;
private final List parents;
private final Set owners;
private final boolean generated;
private final long count;
private final float volume;
//Static values cache (set by constructor)
private String typeName;
private String flagName;
private boolean bpo;
private boolean bpc;
//Dynamic values
private String name;
private String itemName = null;
private AssetContainer container = new AssetContainer();
private PriceData priceData = new PriceData();
private UserItem userPrice;
private long typeCount = 0;
private MarketPriceData marketPriceData;
private Date added;
private double price;
private Tags tags;
private MyBlueprint blueprint;
private MyLocation location;
//Dynamic values cache
private boolean userNameSet = false;
private boolean eveNameSet = false;
private boolean userPriceSet = false;
protected MyAsset(MyAsset asset) {
this(asset.rawAsset,
asset.item,
asset.owner,
asset.parents);
this.name = asset.name;
this.itemName = asset.itemName;
this.container = asset.container;
this.priceData = asset.priceData;
this.userPrice = asset.userPrice;
this.typeCount = asset.typeCount;
this.marketPriceData = asset.marketPriceData;
this.added = asset.added;
this.price = asset.price;
this.tags = asset.tags;
this.blueprint = asset.blueprint;
this.location = asset.location;
this.userNameSet = asset.userNameSet;
this.eveNameSet = asset.eveNameSet;
this.userPriceSet = asset.userPriceSet;
}
public MyAsset(MyLocation location) {
super(RawAsset.create());
this.rawAsset = RawAsset.create();
this.item = new Item(0);
this.owner = null;
this.parents = new ArrayList<>();
this.location = location;
this.owners = new HashSet<>();
this.generated = true;
if (getQuantity() == null || getQuantity() <= 0) {
this.count = 1;
} else {
this.count = getQuantity();
}
this.volume = 0;
this.flagName = ApiIdConverter.getFlagName(ApiIdConverter.getFlag(0));
setItemID(0L);
setItemFlag(ApiIdConverter.getFlag(0));
setLocationID(location.getLocationID());
}
public MyAsset(final RawAsset rawAsset, final Item item, final SimpleOwner owner, final List parents) {
super(rawAsset);
this.rawAsset = rawAsset;
this.item = item;
this.owner = owner;
this.parents = parents;
this.volume = ApiIdConverter.getVolume(item, !rawAsset.isSingleton());
this.typeName = item.getTypeName();
this.name = item.getTypeName();
this.itemName = null;
this.owners = Collections.singleton(owner.getOwnerID());
this.generated = getFlag().equals(General.get().marketOrderSellFlag()) //market sell orders
|| getFlag().equals(General.get().marketOrderBuyFlag()) //market buy orders
|| getFlag().equals(General.get().contractIncluded()) //contracts included
|| getFlag().equals(General.get().contractExcluded()) //contracts excluded
|| getFlag().equals(IndustryActivity.ACTIVITY_MANUFACTURING.toString()) //industry job manufacturing
|| getFlag().equals(IndustryActivity.ACTIVITY_REACTIONS.toString()) //industry job reactions
|| getFlag().equals(IndustryActivity.ACTIVITY_COPYING.toString()) //industry job copying
|| getFlag().equals(General.get().jumpClone()) //jump clone
|| getFlag().equals(General.get().activeClone()) //active clone
|| getFlagID() == 89 //plugged in implant
;
if (getQuantity() == null || getQuantity() <= 0) {
this.count = 1;
} else {
this.count = getQuantity();
}
updateBlueprint();
}
private void updateBlueprint() {
if (item.isBlueprint()) { //if this is a blueprint
//Try to figure out if it's a copy (BPC) or a original (BPO)
if (blueprint != null) { //Best
this.bpo = blueprint.getRuns() <= 0;
this.bpc = blueprint.getRuns() > 0;
} else { //2nd best
//rawQuantity: -1 = BPO. Only BPOs can be packaged (singleton == false). Only packaged items can be stacked (count > 1)
this.bpo = (getQuantity() == -1 || !isSingleton() || getQuantity() > 1);
//rawQuantity: -2 = BPC
this.bpc = getQuantity() == -2;
}
if (bpo) { //Found BPO
this.typeName = item.getTypeName() + " (BPO)";
} else if (bpc) { //Found BPC
this.typeName = item.getTypeName() + " (BPC)";
} else { //Could not figure it out, assume copy
this.bpc = true;
this.typeName = item.getTypeName() + " (BP)";
}
if (!userNameSet || !eveNameSet) { //No other name set, update name
this.name = this.typeName;
}
}
this.flagName = ApiIdConverter.getFlagName(rawAsset.getItemFlag(), owner);
}
public MyAsset(MyIndustryJob industryJob, boolean output) {
this(new RawAsset(industryJob, output),
industryJob.isManufacturing() && output ? ApiIdConverter.getItemUpdate(industryJob.getProductTypeID()) : industryJob.getItem(), industryJob.getOwner(), new ArrayList<>());
}
public MyAsset(MyMarketOrder marketOrder) {
this(new RawAsset(marketOrder), marketOrder.getItem(), marketOrder.getOwner(), new ArrayList<>());
}
public MyAsset(MyContractItem contractItem, final SimpleOwner owner) {
this(new RawAsset(contractItem), contractItem.getItem(), owner, new ArrayList<>());
}
public MyAsset(RawClone clone, Integer impantTypeID, final SimpleOwner owner, List parents) {
this(new RawAsset(clone, impantTypeID), ApiIdConverter.getItem(impantTypeID), owner, parents);
}
public MyAsset(RawClone clone, final SimpleOwner owner) {
this(new RawAsset(clone), getJumpCloneItem(clone), owner, new ArrayList<>());
}
private static Item getJumpCloneItem(RawClone clone) {
Item omegaClone = ApiIdConverter.getItem(29143); //Clone Grade Omega
String name;
if (clone.isActive()) {
name = General.get().activeClone();
} else {
name = General.get().jumpClone();
}
return new Item(0,
name,
omegaClone.getGroup(),
omegaClone.getCategory(),
900000,
omegaClone.getVolume(),
omegaClone.getVolumePackaged(),
omegaClone.getCapacity(),
omegaClone.getMeta(),
omegaClone.getTech(),
omegaClone.isMarketGroup(),
omegaClone.getPortion(),
omegaClone.getProductTypeID(),
omegaClone.getProductQuantity(),
omegaClone.getSlot(),
omegaClone.getChargeSize(),
null);
}
public void addAsset(final MyAsset asset) {
assets.add(asset);
}
public Date getAdded() {
return added;
}
public List getAssets() {
return assets;
}
public String getContainer() {
return container.getContainer();
}
public AssetContainer getAssetContainer() {
return container;
}
public boolean isGenerated() {
return generated;
}
@Override
public long getCount() {
return count;
}
public String getFlagName() {
return flagName;
}
public final String getFlag() {
if (getItemFlag() != null) {
return getItemFlag().getFlagName();
} else {
return null;
}
}
public final Integer getFlagID() {
if (getItemFlag() != null) {
return getItemFlag().getFlagID();
} else {
return null;
}
}
@Override
public Item getItem() {
return item;
}
@Override
public long getItemCount() {
return getCount();
}
@Override
public MyLocation getLocation() {
return location;
}
@Override
public void setLocation(MyLocation location) {
this.location = location;
}
public MarketPriceData getMarketPriceData() {
if (marketPriceData != null) {
return marketPriceData;
} else {
return new MarketPriceData();
}
}
public String getName() {
return name;
}
public String getOwnerName() {
return owner.getOwnerName();
}
public SimpleOwner getOwner() {
return owner;
}
@Override
public Set getOwners() {
return owners;
}
public long getOwnerID() {
return owner.getOwnerID();
}
public List getParents() {
return parents;
}
public MyAsset getParent() {
if (parents.isEmpty()) {
return null;
}
return parents.get(parents.size() - 1);
}
@Override
public Double getDynamicPrice() {
return price;
}
@Override
public void setDynamicPrice(double price) {
this.price = price;
}
public double getPriceBuyMax() {
return priceData.getBuyMax();
}
public double getPriceReprocessed() {
return item.getPriceReprocessed();
}
public double getPriceReprocessedDifference() {
return getPriceReprocessed() - getDynamicPrice();
}
public double getPriceReprocessedPercent() {
if (getDynamicPrice() > 0 && getPriceReprocessed() > 0) {
return (getPriceReprocessed() / getDynamicPrice());
} else {
return 0;
}
}
public double getPriceSellMin() {
return priceData.getSellMin();
}
@Override
public Tags getTags() {
return tags;
}
@Override
public TagID getTagID() {
return new TagID(AssetsTab.NAME, getItemID());
}
public long getTypeCount() {
return typeCount;
}
public final String getTypeName() {
return typeName;
}
public String getItemName() {
return itemName;
}
public UserItem getUserPrice() {
return userPrice;
}
@Override
public double getValue() {
return Formatter.round(this.getDynamicPrice() * getCount(), 2);
}
@Override
public double getValueReprocessed() {
return Formatter.round(this.getPriceReprocessed() * getCount(), 2);
}
public float getVolume() {
return volume;
}
public double getValuePerVolume() {
if (getVolume() > 0 && getDynamicPrice() > 0) {
return getDynamicPrice() / getVolume();
} else {
return 0;
}
}
@Override
public double getVolumeTotal() {
return volume * getCount();
}
@Override
public final boolean isBPO() {
return bpo;
}
@Override
public final boolean isBPC() {
return bpc;
}
@Override
public int getMaterialEfficiency() {
if (blueprint != null) {
return blueprint.getMaterialEfficiency();
} else {
return 0;
}
}
@Override
public int getTimeEfficiency() {
if (blueprint != null) {
return blueprint.getTimeEfficiency();
} else {
return 0;
}
}
@Override
public int getRuns() {
if (blueprint != null) {
return blueprint.getRuns();
} else {
return 0;
}
}
public boolean isCorporation() {
return owner.isCorporation();
}
public boolean isEveName() {
return eveNameSet;
}
public String getSingleton() {
if (isSingleton()) {
return DataModelAsset.get().unpackaged();
} else {
return DataModelAsset.get().packaged();
}
}
public boolean isUserName() {
return userNameSet;
}
public boolean isUserPrice() {
return userPriceSet;
}
public void setAdded(final Date added) {
this.added = added;
}
public void setBlueprint(MyBlueprint blueprint) {
this.blueprint = blueprint;
updateBlueprint();
}
public void updateContainer() {
this.container = new AssetContainer(this);
}
public void setMarketPriceData(final MarketPriceData marketPriceData) {
this.marketPriceData = marketPriceData;
}
public void setName(UserItem customItem, String eveName) {
this.userNameSet = customItem != null;
this.eveNameSet = customItem == null && eveName != null;
if (customItem != null) {
name = customItem.getValue();
itemName = customItem.getValue();
} else if (eveName != null) {
name = eveName + " (" + typeName + ")";
itemName = eveName;
} else {
name = typeName;
itemName = null;
}
}
public void setPriceData(final PriceData priceData) {
this.priceData = priceData;
}
@Override
public void setTags(Tags tags) {
this.tags = tags;
}
public void setTypeCount(final long typeCount) {
this.typeCount = typeCount;
}
public void setUserPrice(final UserItem userPrice) {
this.userPrice = userPrice;
userPriceSet = (this.getUserPrice() != null);
}
@Override
public String toString() {
return this.getName();
}
@Override
public int compareTo(final MyAsset o) {
return this.getName().compareToIgnoreCase(o.getName());
}
@Override
public int hashCode() {
int hash = 7;
hash = 97 * hash + (this.owner != null ? this.owner.hashCode() : 0);
hash = 97 * hash + (int) (this.getItemID() ^ (this.getItemID() >>> 32));
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MyAsset other = (MyAsset) obj;
if (this.owner != other.owner && (this.owner == null || !this.owner.equals(other.owner))) {
return false;
}
return Objects.equals(this.getItemID(), other.getItemID());
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyBlueprint.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import net.nikr.eve.jeveasset.data.api.raw.RawBlueprint;
import net.nikr.eve.jeveasset.data.api.raw.RawContractItem;
import net.nikr.eve.jeveasset.data.api.raw.RawIndustryJob;
public class MyBlueprint {
private final int runs;
private final int materialEfficiency;
private final int timeEfficiency ;
/**
* Contract Item
* @param contractItem
*/
public MyBlueprint(RawContractItem contractItem) {
this(contractItem.getLicensedRuns(), contractItem.getME(), contractItem.getTE());
}
/**
* Blueprint
* @param blueprint
*/
public MyBlueprint(RawBlueprint blueprint) {
this(blueprint.getRuns(), blueprint.getMaterialEfficiency(), blueprint.getTimeEfficiency());
}
/**
* IndustryJob
* @param industryJob
*/
public MyBlueprint(RawIndustryJob industryJob) {
this(industryJob.getLicensedRuns(), null, null);
}
public MyBlueprint(Integer runs, Integer materialEfficiency, Integer timeEfficiency) {
this.runs = notNull(runs);
this.materialEfficiency = notNull(materialEfficiency);
this.timeEfficiency = notNull(timeEfficiency);
}
private int notNull(Integer value) {
if (value != null) {
return value;
} else {
return 0;
}
}
public int getRuns() {
return runs;
}
public int getMaterialEfficiency() {
return materialEfficiency;
}
public int getTimeEfficiency() {
return timeEfficiency;
}
@Override
public int hashCode() {
int hash = 5;
hash = 23 * hash + this.runs;
hash = 23 * hash + this.materialEfficiency;
hash = 23 * hash + this.timeEfficiency;
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MyBlueprint other = (MyBlueprint) obj;
if (this.runs != other.runs) {
return false;
}
if (this.materialEfficiency != other.materialEfficiency) {
return false;
}
return this.timeEfficiency == other.timeEfficiency;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyContract.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import java.util.Date;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import net.nikr.eve.jeveasset.data.api.raw.RawContract;
import net.nikr.eve.jeveasset.data.sde.MyLocation;
import net.nikr.eve.jeveasset.data.settings.Settings;
import net.nikr.eve.jeveasset.data.settings.types.LocationsType;
import net.nikr.eve.jeveasset.data.settings.types.OwnersType;
import net.nikr.eve.jeveasset.i18n.TabsContracts;
import net.nikr.eve.jeveasset.data.settings.types.EsiType;
public class MyContract extends RawContract implements Comparable, LocationsType, OwnersType, EsiType {
private MyLocation endLocation;
private MyLocation startLocation;
private String acceptor = "";
private String assignee = "";
private String issuerCorp = "";
private String issuer = "";
private final Set owners = new HashSet<>();
private boolean esi = true;
private boolean owned;
private boolean issuerAfterAssets = false;
private boolean acceptorAfterAssets = false;
public MyContract(RawContract rawContract) {
super(rawContract);
this.owners.add(getIssuerID());
this.owners.add(getIssuerCorpID());
this.owners.add(getAssigneeID());
this.owners.add(getAcceptorID());
this.owned = !rawContract.isForCorp();
}
public String getTypeName() {
switch (getType()) {
case AUCTION:
return TabsContracts.get().auction();
case COURIER:
return TabsContracts.get().courier();
case ITEM_EXCHANGE:
return TabsContracts.get().itemExchange();
case LOAN:
return TabsContracts.get().loan();
default:
return TabsContracts.get().unknown();
}
}
public String getAcceptor() {
if (acceptor.isEmpty()) {
return TabsContracts.get().notAccepted();
} else {
return acceptor;
}
}
public String getAssignee() {
if (assignee.isEmpty()) {
return TabsContracts.get().publicContract();
} else {
return assignee;
}
}
public String getIssuerCorp() {
return issuerCorp;
}
public String getIssuer() {
return issuer;
}
public void setAcceptor(String acceptor) {
this.acceptor = acceptor;
}
public void setAssignee(String assignee) {
this.assignee = assignee;
}
public void setIssuerCorp(String issuerCorp) {
this.issuerCorp = issuerCorp;
}
public void setIssuer(String issuer) {
this.issuer = issuer;
}
public MyLocation getEndLocation() {
return endLocation;
}
public boolean isIssuerAfterAssets() {
return issuerAfterAssets;
}
public void setIssuerAfterAssets(Date date) {
if (date != null && isCompletedSuccessful()) {
this.issuerAfterAssets = getDateCompleted().after(date);
} else {
this.issuerAfterAssets = false;
}
}
public boolean isAcceptorAfterAssets() {
return acceptorAfterAssets;
}
public void setAcceptorAfterAssets(Date date) {
if (date != null && isCompletedSuccessful()) {
this.acceptorAfterAssets = getDateCompleted().after(date);
} else {
this.acceptorAfterAssets = false;
}
}
@Override
public Set getLocations() {
Set locations = new HashSet<>();
if (startLocation != null) {
locations.add(startLocation);
}
if (endLocation != null) {
locations.add(endLocation);
}
return locations;
}
@Override
public Set getOwners() {
return owners;
}
public final void setEndLocation(MyLocation endLocation) {
this.endLocation = endLocation;
}
public final void setStartLocation(MyLocation startLocation) {
this.startLocation = startLocation;
}
public MyLocation getStartLocation() {
return startLocation;
}
public boolean isCourierContract() {
return getType() == ContractType.COURIER;
}
public boolean isPublic() {
return getAvailability() == ContractAvailability.PUBLIC;
}
public boolean isItemContract() {
return getType() == ContractType.AUCTION || getType() == ContractType.ITEM_EXCHANGE;
}
public boolean isIgnoreContract() {
return getType() != ContractType.AUCTION && getType() != ContractType.ITEM_EXCHANGE;
}
public boolean isOpen() {
//Note: expired isn't a contract completion
return getStatus() == ContractStatus.OUTSTANDING;
}
public boolean isInProgress() {
//Note: expired isn't a contract completion
return getStatus() == ContractStatus.IN_PROGRESS;
}
public boolean isDeleted() {
return getStatus() == ContractStatus.DELETED;
}
public boolean isCompletedSuccessful() {
return getDateCompleted() != null;
}
public boolean isExpired() {
return Settings.getNow().after(getDateExpired());
}
public boolean isOwned() {
return owned;
}
public void setOwned(boolean owned) {
this.owned = owned;
}
public String getStatusFormatted() {
return getStatusName(super.getStatus());
}
public static String getStatusName(ContractStatus status) {
switch (status) {
case CANCELLED:
return TabsContracts.get().statusCancelled();
case FINISHED:
return TabsContracts.get().statusCompleted();
case FINISHED_CONTRACTOR:
return TabsContracts.get().statusCompletedByContractor();
case FINISHED_ISSUER:
return TabsContracts.get().statusCompletedByIssuer();
case DELETED:
return TabsContracts.get().statusDeleted();
case FAILED:
return TabsContracts.get().statusFailed();
case IN_PROGRESS:
return TabsContracts.get().statusInProgress();
case OUTSTANDING:
return TabsContracts.get().statusOutstanding();
case REJECTED:
return TabsContracts.get().statusRejected();
case REVERSED:
return TabsContracts.get().statusReversed();
case ARCHIVED:
return TabsContracts.get().statusArchived();
default:
return TabsContracts.get().statusUnknown();
}
}
public String getAvailabilityFormatted() {
if (isPublic()) {
return TabsContracts.get().availabilityPublic();
} else {
return TabsContracts.get().availabilityPrivate();
}
}
@Override
public boolean archive() {
boolean update = esi; //Update if in esi
if (esi && (getStatus() == ContractStatus.OUTSTANDING || getStatus() == ContractStatus.IN_PROGRESS)) {
setStatus(ContractStatus.ARCHIVED);
}
this.esi = false;
return update;
}
@Override
public boolean isESI() {
return esi;
}
@Override
public void setESI(boolean esi) {
this.esi = esi;
}
@Override
public int hashCode() {
int hash = 7;
hash = 71 * hash + Objects.hashCode(this.getContractID());
hash = 71 * hash + (int) (this.getIssuerID() ^ (this.getIssuerID() >>> 32));
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MyContract other = (MyContract) obj;
if (!Objects.equals(this.getContractID(), other.getContractID())) {
return false;
}
return Objects.equals(this.getIssuerID(), other.getIssuerID());
}
@Override
public int compareTo(MyContract o) {
return Integer.compare(this.getContractID(), o.getContractID());
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyContractItem.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import java.util.Objects;
import java.util.Set;
import net.nikr.eve.jeveasset.data.api.raw.RawContractItem;
import net.nikr.eve.jeveasset.data.sde.Item;
import net.nikr.eve.jeveasset.data.sde.MyLocation;
import net.nikr.eve.jeveasset.data.settings.types.BlueprintType;
import net.nikr.eve.jeveasset.data.settings.types.EditablePriceType;
import net.nikr.eve.jeveasset.data.settings.types.ItemType;
import net.nikr.eve.jeveasset.data.settings.types.LocationsType;
import net.nikr.eve.jeveasset.data.settings.types.OwnersType;
import net.nikr.eve.jeveasset.gui.shared.CopyHandler.CopySeparator;
import net.nikr.eve.jeveasset.i18n.TabsContracts;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
public class MyContractItem extends RawContractItem implements Comparable, LocationsType, ItemType, BlueprintType, EditablePriceType, CopySeparator, OwnersType {
private MyContract contract;
private final Item item;
private double price;
public MyContractItem(MyContract contract) {
super(RawContractItem.create());
this.contract = contract;
this.item = new Item(0);
setIncluded(true);
setQuantity(0);
setRecordID(RawConverter.toLong(contract.getContractID()));
setSingleton(false);
setTypeID(0);
setRawQuantity(0);
}
public MyContractItem(RawContractItem rawContractItem, MyContract contract, Item item) {
super(rawContractItem);
this.contract = contract;
this.item = item;
}
public MyContract getContract() {
return contract;
}
public void setContract(MyContract contract) {
this.contract = contract;
}
public String getIncluded() {
if (getContract().isCourierContract()) {
return TabsContracts.get().courier();
} else if (getTypeID() == 0) {
return TabsContracts.get().missing();
} else if (isIncluded()) {
return TabsContracts.get().included();
} else {
return TabsContracts.get().excluded();
}
}
public String getSingleton() {
if (getContract().isCourierContract()) {
return TabsContracts.get().courier();
} else if (getTypeID() == 0) {
return TabsContracts.get().missing();
} else if (isSingleton()) {
return TabsContracts.get().unpackaged();
} else {
return TabsContracts.get().packaged();
}
}
public String getName() {
if (item.isEmpty()) {
return contract.getTypeName();
} else {
return item.getTypeName();
}
}
@Override
public void setDynamicPrice(double price) {
this.price = price;
}
@Override
public Double getDynamicPrice() {
return price;
}
@Override
public boolean isBPO() {
//Blueprint && RawQuantity > -2
return (item.isBlueprint() && this.getRawQuantity() != null && this.getRawQuantity() > -2);
}
@Override
public boolean isBPC() {
return (item.isBlueprint() && this.getRawQuantity() != null && this.getRawQuantity() == -2);
}
@Override
public int getRuns() {
Integer runs = getLicensedRuns();
if (runs != null) {
return runs;
} else if (isBPC()) {
return 1; //BPC
} else if (isBPO()) {
return -1; //BPO
} else {
return 0; //Default unknown
}
}
@Override
public int getMaterialEfficiency() {
Integer materialEfficiency = getME();
if (materialEfficiency != null) {
return materialEfficiency;
} else {
return 0;
}
}
@Override
public int getTimeEfficiency() {
Integer timeEfficiency = getTE();
if (timeEfficiency != null) {
return timeEfficiency;
} else {
return 0;
}
}
@Override
public Set getLocations() {
return getContract().getLocations();
}
@Override
public Set getOwners() {
return getContract().getOwners();
}
@Override
public Item getItem() {
return item;
}
@Override
public long getItemCount() {
return getQuantity();
}
@Override
public String getCopyString() {
StringBuilder builder = new StringBuilder();
builder.append(getContract().getTitle());
builder.append("\t");
builder.append(getContract().getTypeName());
return builder.toString();
}
@Override
public int compareTo(MyContractItem o) {
return 0;
}
@Override
public int hashCode() {
int hash = 3;
hash = 37 * hash + (this.contract != null ? this.contract.hashCode() : 0);
hash = 37 * hash + (int) (getRecordID() ^ (getRecordID() >>> 32));
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MyContractItem other = (MyContractItem) obj;
if (this.contract != other.contract && (this.contract == null || !this.contract.equals(other.contract))) {
return false;
}
return Objects.equals(this.getRecordID(), other.getRecordID());
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyExtraction.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import java.util.Objects;
import net.nikr.eve.jeveasset.data.api.raw.RawExtraction;
import net.nikr.eve.jeveasset.data.sde.MyLocation;
import net.nikr.eve.jeveasset.data.settings.types.EditableLocationType;
public class MyExtraction extends RawExtraction implements EditableLocationType, Comparable {
private final MyLocation moon;
private MyLocation location;
public MyExtraction(RawExtraction extraction, MyLocation moon) {
super(extraction);
this.moon = moon;
}
public MyLocation getMoon() {
return moon;
}
@Override
public MyLocation getLocation() {
return location;
}
@Override
public void setLocation(MyLocation location) {
this.location = location;
}
@Override
public long getLocationID() {
return getStructureID();
}
@Override
public int compareTo(MyExtraction o) {
int compared = o.getChunkArrivalTime().compareTo(this.getChunkArrivalTime());
if (compared != 0) {
return compared;
}
return this.moon.compareTo(o.moon);
}
@Override
public int hashCode() {
int hash = 7;
hash = 59 * hash + Objects.hashCode(this.getExtractionStartTime());
hash = 59 * hash + Objects.hashCode(this.getMoonID());
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final RawExtraction other = (RawExtraction) obj;
if (!Objects.equals(this.getExtractionStartTime(), other.getExtractionStartTime())) {
return false;
}
return Objects.equals(this.getMoonID(), other.getMoonID());
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyIndustryJob.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import java.util.Date;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import net.nikr.eve.jeveasset.data.api.accounts.OwnerType;
import net.nikr.eve.jeveasset.data.api.raw.RawIndustryJob;
import net.nikr.eve.jeveasset.data.sde.Item;
import net.nikr.eve.jeveasset.data.sde.MyLocation;
import net.nikr.eve.jeveasset.data.settings.Settings;
import net.nikr.eve.jeveasset.data.settings.types.BlueprintType;
import net.nikr.eve.jeveasset.data.settings.types.EditableLocationType;
import net.nikr.eve.jeveasset.data.settings.types.EditablePriceType;
import net.nikr.eve.jeveasset.data.settings.types.EsiType;
import net.nikr.eve.jeveasset.data.settings.types.ItemType;
import net.nikr.eve.jeveasset.data.settings.types.OwnersType;
import net.nikr.eve.jeveasset.gui.shared.table.containers.Duration;
import net.nikr.eve.jeveasset.i18n.DataModelIndustryJob;
import net.nikr.eve.jeveasset.io.shared.ApiIdConverter;
public class MyIndustryJob extends RawIndustryJob implements Comparable, EditableLocationType, ItemType, EditablePriceType, BlueprintType, OwnersType, EsiType {
public enum IndustryActivity {
ACTIVITY_ALL() {
@Override
String getI18N() {
return DataModelIndustryJob.get().activityAll();
}
},
ACTIVITY_NONE() {
@Override
String getI18N() {
return DataModelIndustryJob.get().activityNone();
}
},
ACTIVITY_MANUFACTURING() {
@Override
String getI18N() {
return DataModelIndustryJob.get().activityManufacturing();
}
},
ACTIVITY_RESEARCHING_TECHNOLOGY() {
@Override
String getI18N() {
return DataModelIndustryJob.get().activityResearchingTechnology();
}
},
ACTIVITY_RESEARCHING_TIME_PRODUCTIVITY() {
@Override
String getI18N() {
return DataModelIndustryJob.get().activityResearchingTimeProductivity();
}
},
ACTIVITY_RESEARCHING_METERIAL_PRODUCTIVITY() {
@Override
String getI18N() {
return DataModelIndustryJob.get().activityResearchingMeterialProductivity();
}
},
ACTIVITY_COPYING() {
@Override
String getI18N() {
return DataModelIndustryJob.get().activityCopying();
}
@Override
public String getDescriptionOf(final MyIndustryJob job) {
// "Copying: Xyz Blueprint making 5 copies with 1500 runs each."
return DataModelIndustryJob.get().descriptionCopying(
String.valueOf(job.getBlueprintTypeID()),
job.getRuns(),
job.getLicensedRuns()
);
}
},
ACTIVITY_DUPLICATING() {
@Override
String getI18N() {
return DataModelIndustryJob.get().activityDuplicating();
}
},
ACTIVITY_REVERSE_ENGINEERING() {
@Override
String getI18N() {
return DataModelIndustryJob.get().activityReverseEngineering();
}
},
ACTIVITY_REVERSE_INVENTION() {
@Override
String getI18N() {
return DataModelIndustryJob.get().activityReverseInvention();
}
},
ACTIVITY_REACTIONS() {
@Override
String getI18N() {
return DataModelIndustryJob.get().activityReactions();
}
},
ACTIVITY_UNKNOWN() {
@Override
String getI18N() {
return DataModelIndustryJob.get().activityUnknown();
}
};
abstract String getI18N();
@Override
public String toString() {
return getI18N();
}
/**
*
* @param job
* @return a single line, human readable description of the job.
*/
public String getDescriptionOf(final MyIndustryJob job) {
return toString();
}
}
private IndustryActivity activity;
private final Item item;
private final Item output;
private final OwnerType owner;
private final String name;
private final Set owners = new HashSet<>();
private final int outputCount;
private double price;
private double outputValue;
private String installer = "";
private String completedCharacter = "";
private MyBlueprint blueprint;
private MyLocation location;
private boolean esi = true;
private boolean owned;
public MyIndustryJob(final RawIndustryJob rawIndustryJob, final Item item, final Item output, final OwnerType owner) {
super(rawIndustryJob);
this.item = item;
this.output = output;
this.owner = owner;
this.owners.add(getInstallerID());
this.owners.add(owner.getOwnerID());
this.owned = owner.isCharacter();
switch (getActivityID()) {
case 0:
activity = IndustryActivity.ACTIVITY_NONE;
break;
case 1:
activity = IndustryActivity.ACTIVITY_MANUFACTURING;
break;
case 2:
activity = IndustryActivity.ACTIVITY_RESEARCHING_TECHNOLOGY;
break;
case 3:
activity = IndustryActivity.ACTIVITY_RESEARCHING_TIME_PRODUCTIVITY;
break;
case 4:
activity = IndustryActivity.ACTIVITY_RESEARCHING_METERIAL_PRODUCTIVITY;
break;
case 5:
activity = IndustryActivity.ACTIVITY_COPYING;
break;
case 6:
activity = IndustryActivity.ACTIVITY_DUPLICATING;
break;
case 7:
activity = IndustryActivity.ACTIVITY_REVERSE_ENGINEERING;
break;
case 8:
activity = IndustryActivity.ACTIVITY_REVERSE_INVENTION;
break;
case 9:
activity = IndustryActivity.ACTIVITY_REACTIONS;
break;
case 11:
activity = IndustryActivity.ACTIVITY_REACTIONS;
break;
default:
activity = IndustryActivity.ACTIVITY_UNKNOWN;
break;
}
switch (activity) {
case ACTIVITY_MANUFACTURING:
outputCount = getRuns() * item.getProductQuantity();
break;
case ACTIVITY_REACTIONS:
outputCount = getRuns() * item.getProductQuantity();
break;
case ACTIVITY_COPYING:
if (getLicensedRuns() != null) {
outputCount = getRuns() * getLicensedRuns();
} else { //Should never happen, but, better safe than sorry
outputCount = getRuns();
}
break;
default:
outputCount = 1;
break;
}
this.name = item.getTypeName();
}
@Override
public int compareTo(final MyIndustryJob o) {
return 0;
}
public void setBlueprint(MyBlueprint blueprint) {
this.blueprint = blueprint;
}
@Override
public boolean isBPO() {
if (blueprint != null) {
return blueprint.getRuns() <= 0;
} else {
return (getLicensedRuns() == null || getLicensedRuns() <= 0 //BPO should have value -1
|| activity == IndustryActivity.ACTIVITY_COPYING //BPO only
|| activity == IndustryActivity.ACTIVITY_RESEARCHING_METERIAL_PRODUCTIVITY //BPO only
|| activity == IndustryActivity.ACTIVITY_RESEARCHING_TIME_PRODUCTIVITY) //BPO only
&& activity != IndustryActivity.ACTIVITY_REVERSE_INVENTION //BPC only
;
}
}
@Override
public boolean isBPC() {
return !isBPO();
}
@Override
public int getMaterialEfficiency() {
if (blueprint != null) {
return blueprint.getMaterialEfficiency();
} else {
return 0;
}
}
@Override
public int getTimeEfficiency() {
if (blueprint != null) {
return blueprint.getTimeEfficiency();
} else {
return 0;
}
}
public Duration getTimeLeft() {
if (getEndDate() == null) {
return Duration.NEVER;
}
Date now = Settings.getNow();
if (now.after(getEndDate())) {
return Duration.DONE;
}
long time = getEndDate().getTime() - now.getTime();
if (time <= 1000) { //less than 1 second
return new Duration("...");
} else if (time < (60 * 1000)) { //less than 1 minute
return new Duration(time, false, false, false, true);
} else {
return new Duration(time, true, true, true, false);
}
}
@Override
public Integer getTypeID() {
return getBlueprintTypeID();
}
public final boolean isCompletedSuccessful() {
return getStatus() == IndustryJobStatus.DELIVERED;
}
public final boolean isDone() {
return getStatus() == IndustryJobStatus.DELIVERED
|| getStatus() == IndustryJobStatus.CANCELLED
|| getStatus() == IndustryJobStatus.REVERTED
|| getStatus() == IndustryJobStatus.ARCHIVED //Status is unknown -> default to done > true
;
}
public final boolean isNotDeliveredToAssets() {
return !isDone() //if not done -> not delivered to assets -> true
&& (owner.getAssetLastUpdate() == null //if null -> never updated -> not delivered to assets -> true
|| getCompletedDate() == null //if null -> not completed -> not delivered to assets -> true
|| owner.getAssetLastUpdate().before(getCompletedDate()) //if assets last updated before completed date -> not delivered to assets -> true
);
}
public final boolean isRemovedFromAssets() {
return owner.getAssetLastUpdate() != null //if null -> never updated -> not removed from assets -> false
&& getStartDate() != null //if null -> not started -> not removed from assets -> false
&& owner.getAssetLastUpdate().after(getStartDate()); //if assets last updated after started date -> removed from assets -> true
}
public final boolean isManufacturing() {
return getActivity() == IndustryActivity.ACTIVITY_MANUFACTURING || getActivity() == IndustryActivity.ACTIVITY_REACTIONS;
}
public final boolean isCopying() {
return getActivity() == IndustryActivity.ACTIVITY_COPYING;
}
public final boolean isInvention() {
return getActivity() == IndustryActivity.ACTIVITY_REVERSE_INVENTION;
}
public boolean isOwned() {
return owned;
}
public void setOwned(boolean owned) {
this.owned = owned;
}
public IndustryActivity getActivity() {
return activity;
}
public boolean isExpired() {
return getEndDate().before(Settings.getNow());
}
@Override
public IndustryJobStatus getStatus() {
//Update READY (may have changed after loading profile)
if (isExpired() && super.getStatus() == IndustryJobStatus.ACTIVE) {
setStatus(IndustryJobStatus.READY);
}
return super.getStatus();
}
public String getStatusFormatted() {
return getStatusName(getStatus(), isExpired());
}
public static String getStatusName(IndustryJobStatus status) {
return getStatusName(status, false);
}
public static String getStatusName(IndustryJobStatus status, boolean expired) {
switch (status) {
case ACTIVE: //Active
if (expired) {
return DataModelIndustryJob.get().statusDone();
} else {
return DataModelIndustryJob.get().statusActive();
}
case PAUSED:
return DataModelIndustryJob.get().statusPaused();
case READY:
return DataModelIndustryJob.get().statusDone();
case DELIVERED:
return DataModelIndustryJob.get().statusDelivered();
case CANCELLED:
return DataModelIndustryJob.get().statusCancelled();
case REVERTED:
return DataModelIndustryJob.get().statusReverted();
case ARCHIVED:
return DataModelIndustryJob.get().statusArchived();
default:
return DataModelIndustryJob.get().statusUnknown();
}
}
@Override
public void setDynamicPrice(double price) {
this.price = price;
}
@Override
public Double getDynamicPrice() {
return price;
}
public double getOutputValue() {
return outputValue;
}
public String getName() {
return name;
}
public void setOutputPrice(double outputPrice) {
if (isManufacturing()) {
this.outputValue = outputPrice * getRuns() * getProductQuantity();
} else if (isCopying() && getLicensedRuns() != null) {
this.outputValue = outputPrice * getRuns() * getLicensedRuns();
} else {
this.outputValue = 0;
}
}
public int getOutputCount() {
return outputCount;
}
public Item getOutputItem() {
return output;
}
public double getOutputVolume() {
if (isCopying()) {
return output.getVolumePackaged() * getRuns(); // Volume of the output blueprints (bp runs should not be counted)
} else {
return output.getVolumePackaged() * outputCount;
}
}
public String getInstaller() {
return installer;
}
public void setInstaller(String installer) {
this.installer = installer;
}
public String getCompletedCharacter() {
return completedCharacter;
}
public void setCompletedCharacter(String completedCharacter) {
this.completedCharacter = completedCharacter;
}
@Override
public Set getOwners() {
return owners;
}
@Override
public long getLocationID() {
if (ApiIdConverter.isLocationOK(getStationID())) {
return getStationID();
}
if (ApiIdConverter.isLocationOK(getBlueprintLocationID())) {
return getBlueprintLocationID();
}
if (ApiIdConverter.isLocationOK(getOutputLocationID())) {
return getOutputLocationID();
}
return getStationID();
}
@Override
public MyLocation getLocation() {
return location;
}
@Override
public void setLocation(MyLocation location) {
this.location = location;
}
public OwnerType getOwner() {
return owner;
}
public String getOwnerName() {
return owner.getOwnerName();
}
public long getOwnerID() {
return owner.getOwnerID();
}
public int getProductQuantity() {
return item.getProductQuantity();
}
@Override
public boolean archive() {
boolean update = esi; //Update if in esi
if (esi && (getStatus() == IndustryJobStatus.READY || getStatus() == IndustryJobStatus.ACTIVE)) {
setStatus(IndustryJobStatus.ARCHIVED);
}
this.esi = false;
return update;
}
@Override
public boolean isESI() {
return esi;
}
@Override
public void setESI(boolean esi) {
this.esi = esi;
}
@Override
public Item getItem() {
return item;
}
@Override
public long getItemCount() {
return 1; //Just one blueprint here
}
@Override
public int hashCode() {
int hash = 5;
hash = 37 * hash + Objects.hashCode(this.getJobID());
hash = 37 * hash + (int) (this.owner.getOwnerID() ^ (this.owner.getOwnerID() >>> 32));
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MyIndustryJob other = (MyIndustryJob) obj;
if (!Objects.equals(this.getJobID(), other.getJobID())) {
return false;
}
return this.owner.getOwnerID() == other.owner.getOwnerID();
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyJournal.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import java.util.Date;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import net.nikr.eve.jeveasset.data.api.accounts.OwnerType;
import net.nikr.eve.jeveasset.data.api.raw.RawJournal;
import net.nikr.eve.jeveasset.data.api.raw.RawJournalRefType;
import net.nikr.eve.jeveasset.data.settings.tag.TagID;
import net.nikr.eve.jeveasset.data.settings.tag.Tags;
import net.nikr.eve.jeveasset.data.settings.types.OwnersType;
import net.nikr.eve.jeveasset.data.settings.types.TagsType;
import net.nikr.eve.jeveasset.gui.tabs.journal.JournalTab;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
public class MyJournal extends RawJournal implements Comparable, OwnersType, TagsType {
private static final String CORP = "(Corporation)";
private final OwnerType owner;
private final Set owners = new HashSet<>();
private String firstPartyName = "";
private String secondPartyName = "";
private Date added;
private String context = null;
private Tags tags;
public MyJournal(RawJournal rawJournal, OwnerType owner) {
super(rawJournal);
this.owner = owner;
owners.add(owner.getOwnerID());
owners.add(RawConverter.toLong(getFirstPartyID()));
owners.add(RawConverter.toLong(getSecondPartyID()));
}
public int getAccountKeyFormatted() {
return getAccountKey() - 999;
}
public String getOwnerName() {
return owner.getOwnerName();
}
public String getRefTypeFormatted() {
RawJournalRefType refType = getRefType();
if (refType != null) {
return capitalizeAll(refType.name().replace("_CORP_", CORP).replace('_', ' '));
} else {
return "";
}
}
public String getFirstPartyName() {
return firstPartyName;
}
public void setFirstPartyName(String firstPartyName) {
this.firstPartyName = firstPartyName;
}
public String getSecondPartyName() {
return secondPartyName;
}
public void setSecondPartyName(String secondPartyName) {
this.secondPartyName = secondPartyName;
}
private String capitalize(String s) {
if (s.length() == 0) {
return s;
}
if (s.equals(CORP)) {
return s;
}
return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
}
@Override
public Set getOwners() {
return owners;
}
public Date getAdded() {
return added;
}
public void setAdded(Date added) {
this.added = added;
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
private String capitalizeAll(String in) {
String[] words = in.split("\\s");
StringBuilder builder = new StringBuilder();
for (String word : words) {
if (builder.length() > 0) {
builder.append(' ');
}
builder.append(capitalize(word));
}
return builder.toString();
}
@Override
public Tags getTags() {
return tags;
}
private double getAmountNotNull() {
Double amount = getAmount();
if (amount != null) {
return amount;
} else {
return 0.0;
}
}
@Override
public TagID getTagID() {
return new TagID(JournalTab.NAME, getRefID(), getAmountNotNull());
}
@Override
public void setTags(Tags tags) {
this.tags = tags;
}
@Override
public int compareTo(MyJournal o) {
int compared = o.getDate().compareTo(this.getDate());
if (compared != 0) {
return compared;
} else {
return Double.compare(o.getAmount(), this.getAmount());
}
}
@Override
public int hashCode() {
int hash = 7;
hash = 83 * hash + Objects.hashCode(this.getAmount());
hash = 83 * hash + Objects.hashCode(this.getRefID());
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final RawJournal other = (RawJournal) obj;
if (!Objects.equals(this.getAmount(), other.getAmount())) {
return false;
}
if (!Objects.equals(this.getRefID(), other.getRefID())) {
return false;
}
return true;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyLoyaltyPoints.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import net.nikr.eve.jeveasset.data.api.accounts.OwnerType;
import net.nikr.eve.jeveasset.data.api.raw.RawLoyaltyPoints;
import net.nikr.eve.jeveasset.data.settings.types.CorporationType;
import net.nikr.eve.jeveasset.gui.images.Images;
import net.nikr.eve.jeveasset.gui.shared.table.containers.TextIcon;
import net.nikr.eve.jeveasset.io.online.EveImageGetter.ImageSize;
public class MyLoyaltyPoints extends RawLoyaltyPoints implements Comparable, CorporationType {
public static ImageSize IMAGE_SIZE = ImageSize.SIZE_32;
private final OwnerType owner;
private String corporationName = "";
private TextIcon textIcon = null;
public MyLoyaltyPoints(RawLoyaltyPoints rawLoyaltyPoints, OwnerType owner) {
super(rawLoyaltyPoints);
this.owner = owner;
}
public String getOwnerName() {
return owner.getOwnerName();
}
@Override
public String getCorporationName() {
return corporationName;
}
public void setCorporationName(String corporationName) {
this.corporationName = corporationName;
}
public TextIcon getTextIcon() {
if (textIcon == null) {
textIcon = new TextIcon(Images.getIcon(this), corporationName);
}
return textIcon;
}
@Override
public int compareTo(MyLoyaltyPoints o) {
int comp = this.getOwnerName().compareTo(o.getOwnerName());
if (comp != 0) {
return comp;
}
return this.getCorporationName().compareTo(o.getCorporationName());
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyMarketOrder.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.Objects;
import java.util.Set;
import javax.management.timer.Timer;
import javax.swing.JButton;
import net.nikr.eve.jeveasset.data.api.accounts.OwnerType;
import net.nikr.eve.jeveasset.data.api.raw.RawMarketOrder;
import net.nikr.eve.jeveasset.data.sde.Item;
import net.nikr.eve.jeveasset.data.sde.MyLocation;
import net.nikr.eve.jeveasset.data.settings.PriceData;
import net.nikr.eve.jeveasset.data.settings.Settings;
import net.nikr.eve.jeveasset.data.settings.types.BlueprintType;
import net.nikr.eve.jeveasset.data.settings.types.EditableLocationType;
import net.nikr.eve.jeveasset.data.settings.types.EditablePriceType;
import net.nikr.eve.jeveasset.data.settings.types.EsiType;
import net.nikr.eve.jeveasset.data.settings.types.ItemType;
import net.nikr.eve.jeveasset.data.settings.types.LastTransactionType;
import net.nikr.eve.jeveasset.data.settings.types.MarketDetailType;
import net.nikr.eve.jeveasset.data.settings.types.OwnersType;
import net.nikr.eve.jeveasset.gui.shared.components.JButtonComparable;
import net.nikr.eve.jeveasset.gui.shared.table.containers.Percent;
import net.nikr.eve.jeveasset.gui.tabs.orders.Outbid;
import net.nikr.eve.jeveasset.i18n.TabsOrders;
public class MyMarketOrder extends RawMarketOrder implements Comparable, EditableLocationType, ItemType, BlueprintType, EditablePriceType, OwnersType, LastTransactionType, MarketDetailType, EsiType {
private final Item item;
private final OwnerType owner;
private final Set owners;
private MyLocation location;
private double price;
private PriceData priceData = new PriceData();
private double transactionPrice;
private double transactionProfitDifference;
private Percent transactionProfitPercent;
private String issuedByName = "";
private Double brokersFee;
private Outbid outbid;
private boolean outbidOwned = false;
private boolean esi = true;
private boolean owned;
//soft init
private JButton jButton;
public MyMarketOrder(final RawMarketOrder rawMarketOrder, final Item item, final OwnerType owner) {
super(rawMarketOrder);
this.item = item;
this.owner = owner;
this.owners = Collections.singleton(owner.getOwnerID());
this.owned = !rawMarketOrder.isCorp();
}
@Override
public boolean archive() {
boolean update = esi; //Update if in esi
if (esi && getState() == MarketOrderState.OPEN) { //Only do once, as the user can set the state to open
setState(MarketOrderState.UNKNOWN);
}
esi = false;
return update;
}
@Override
public int compareTo(final MyMarketOrder o) {
return Long.compare(o.getOrderID(), this.getOrderID());
}
@Override
public boolean isESI() {
return esi;
}
@Override
public void setESI(boolean esi) {
this.esi = esi;
}
public Date getExpires() {
long expires = (this.getIssued().getTime() + ((this.getDuration()) * Timer.ONE_DAY));
return new Date(expires);
}
public final boolean isExpired() {
return getExpires().before(new Date());
}
public final boolean isNearExpired() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, Settings.get().getMarketOrdersSettings().getExpireWarnDays());
return getExpires().before(cal.getTime());
}
public final boolean isNearFilled() {
//How much do we want to worry about precision vs cost of converting to doubles for possibly
//thousands of orders in history, if we want more accuracy cast to doubles first and change
//comparison to Double.compare
//Multiply by 100 since we are dealing with percents as integers.
//This will be slightly inaccurate since int are essentially floored if they have a remainder.
return ( (getVolumeRemain() * 100) / getVolumeTotal() <= Settings.get().getMarketOrdersSettings().getRemainingWarnPercent());
}
public boolean isActive() {
return getState() == MarketOrderState.OPEN && !isExpired();
}
public boolean isOwned() {
return owned;
}
public void setOwned(boolean owned) {
this.owned = owned;
}
@Override
public boolean isBPC() {
return false; //Market Orders are always BPO
}
@Override
public boolean isBPO() {
return item.isBlueprint();
}
@Override
public int getRuns() {
return -1; //BPO - Can not sell BPC
}
@Override
public int getMaterialEfficiency() {
return 0; //Zero - Can not sell researched blueprints
}
@Override
public int getTimeEfficiency() {
return 0; //Zero - Can not sell researched blueprints
}
@Override
public void setDynamicPrice(double price) {
this.price = price;
}
@Override
public Double getDynamicPrice() {
return price;
}
@Override
public double getTransactionPrice() {
return transactionPrice;
}
@Override
public double getTransactionProfitDifference() {
return transactionProfitDifference;
}
@Override
public Percent getTransactionProfitPercent() {
return transactionProfitPercent;
}
@Override
public void setTransactionPrice(double transactionPrice) {
this.transactionPrice = transactionPrice;
}
@Override
public void setTransactionProfit(double transactionProfitDifference) {
this.transactionProfitDifference = transactionProfitDifference;
}
@Override
public void setTransactionProfitPercent(Percent transactionProfitPercent) {
this.transactionProfitPercent = transactionProfitPercent;
}
public double getMarketMargin() {
if (getDynamicPrice() > 0 && getPrice() > 0) {
if (isBuyOrder()) {
return (getDynamicPrice() - getPrice()) / getDynamicPrice();
} else {
return (getPrice() - getDynamicPrice()) / getPrice();
}
} else {
return 0;
}
}
public double getMarketProfit() {
if (isBuyOrder()) {
return getDynamicPrice() - getPrice();
} else {
return getPrice() - getDynamicPrice();
}
}
public Date getCreatedOrIssued() {
if (!getChanges().isEmpty()) {
return getChanges().iterator().next().getDate();
} else {
return getIssued();
}
}
@Override
public Item getItem() {
return item;
}
@Override
public long getItemCount() {
return getVolumeRemain();
}
@Override
public MyLocation getLocation() {
return location;
}
@Override
public Set getOwners() {
return owners;
}
@Override
public void setLocation(MyLocation location) {
this.location = location;
}
public String getIssuedByName() {
return issuedByName;
}
public void setIssuedByName(String issuedByName) {
this.issuedByName = issuedByName;
}
public OwnerType getOwner() {
return owner;
}
public String getOwnerName() {
return owner.getOwnerName();
}
public long getOwnerID() {
return owner.getOwnerID();
}
public String getStateFormatted() {
if ((isExpired() && getState() == MarketOrderState.UNKNOWN) //expired (status may be out-of-date)
|| getState() == MarketOrderState.EXPIRED) {
if (this.getVolumeRemain() == 0) {
return TabsOrders.get().statusFulfilled();
} else if (Objects.equals(this.getVolumeRemain(), this.getVolumeTotal())) {
return TabsOrders.get().statusExpired();
} else {
return TabsOrders.get().statusPartiallyFulfilled();
}
} else {
return getStateName(getState());
}
}
public static String getStateName(MarketOrderState state) {
switch (state) {
case OPEN: //open/active
return TabsOrders.get().statusActive();
case CLOSED: //closed
return TabsOrders.get().statusClosed();
case EXPIRED: //expired (or fulfilled)
return TabsOrders.get().statusExpired();
case CANCELLED: //cancelled
return TabsOrders.get().statusCancelled();
case PENDING: //pending
return TabsOrders.get().statusPending();
case CHARACTER_DELETED: //character deleted
return TabsOrders.get().statusCharacterDeleted();
case UNKNOWN: //Unknown or Auto Closed
return TabsOrders.get().statusUnknown();
default:
return TabsOrders.get().statusUnknown();
}
}
public boolean isCorporation() {
return owner.isCorporation();
}
public Double getBrokersFee() {
return brokersFee;
}
public Double getBrokersFeeNotNull() {
if (brokersFee != null) {
return brokersFee;
} else {
return 0.0;
}
}
public void setBrokersFee(Double brokerFee) {
this.brokersFee = brokerFee;
}
public boolean isOutbid() {
if (outbid == null) {
return false;
}
return outbid.getCount() > 0;
}
public boolean isOutbidOwned() {
return outbidOwned;
}
public void setOutbidOwned(boolean outbidOwned) {
this.outbidOwned = outbidOwned;
}
public boolean haveOutbid() {
return outbid != null;
}
public Double getOutbidPrice() {
if (outbid == null) {
return null;
}
return outbid.getPrice();
}
public Long getOutbidCount() {
if (outbid == null) {
return null;
}
return outbid.getCount();
}
public Double getOutbidDelta() {
if (outbid == null) {
return null;
}
if (isBuyOrder()) {
return getPrice() - outbid.getPrice();
} else {
return outbid.getPrice() - getPrice();
}
}
public void setOutbid(Outbid outbid) {
this.outbid = outbid;
}
public double getPriceReprocessed() {
return item.getPriceReprocessed();
}
public void setPriceData(PriceData priceData) {
this.priceData = priceData;
}
public double getPriceBuyMax() {
return priceData.getBuyMax();
}
public double getPriceSellMin() {
return priceData.getSellMin();
}
@Override
public JButton getButton() {
if (jButton == null) {
jButton = new JButtonComparable(TabsOrders.get().eveUiOpen());
}
return jButton;
}
@Override
public int hashCode() {
int hash = 7;
hash = 89 * hash + Objects.hashCode(this.getOrderID()); //OrderID is globaly unique
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MyMarketOrder other = (MyMarketOrder) obj;
return Objects.equals(this.getOrderID(), other.getOrderID()); //OrderID is globaly unique
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyMining.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import java.util.Objects;
import net.nikr.eve.jeveasset.data.api.raw.RawMining;
import net.nikr.eve.jeveasset.data.sde.Item;
import net.nikr.eve.jeveasset.data.sde.MyLocation;
import net.nikr.eve.jeveasset.data.settings.types.EditableLocationType;
import net.nikr.eve.jeveasset.data.settings.types.EditablePriceType;
import net.nikr.eve.jeveasset.data.settings.types.ItemType;
import net.nikr.eve.jeveasset.gui.shared.menu.JMenuInfo.InfoItem;
import net.nikr.eve.jeveasset.gui.shared.table.containers.DateOnly;
public class MyMining extends RawMining implements Comparable, InfoItem, ItemType, EditablePriceType, EditableLocationType {
private final DateOnly dateOnly;
private final Item item;
private MyLocation location;
private double price;
private String characterName;
public MyMining(RawMining mining, Item item, MyLocation location) {
super(mining);
this.dateOnly = new DateOnly(getDate());
this.item = item;
this.location = location;
}
public String getCharacterName() {
return characterName;
}
public void setCharacterName(String characterName) {
this.characterName = characterName;
}
@Override
public double getValue() {
return price * getCount();
}
public DateOnly getDateOnly() {
return dateOnly;
}
public double getPriceReprocessed() {
return item.getPriceReprocessed();
}
@Override
public double getValueReprocessed() {
return item.getPriceReprocessed() * getCount();
}
public double getPriceReprocessedMax() {
return item.getPriceReprocessedMax();
}
public double getValueReprocessedMax() {
return item.getPriceReprocessedMax() * getCount();
}
private float getVolume() {
return item.getVolumePackaged();
}
@Override
public double getVolumeTotal() {
return item.getVolumePackaged() * getCount();
}
public double getValuePerVolumeOre() {
if (getVolume() > 0 && getDynamicPrice() > 0) {
return getDynamicPrice() / getVolume();
} else {
return 0;
}
}
public double getValuePerVolumeReprocessed() {
if (getVolume() > 0 && getPriceReprocessed()> 0) {
return getPriceReprocessed() / getVolume();
} else {
return 0;
}
}
public double getValuePerVolumeReprocessedMax() {
if (getVolume() > 0 && getPriceReprocessedMax()> 0) {
return getPriceReprocessedMax() / getVolume();
} else {
return 0;
}
}
@Override
public void setDynamicPrice(double price) {
this.price = price;
}
@Override
public boolean isBPC() {
return false;
}
@Override
public Double getDynamicPrice() {
return price;
}
@Override
public void setLocation(MyLocation location) {
this.location = location;
}
@Override
public Item getItem() {
return item;
}
@Override
public long getItemCount() {
return getCount();
}
@Override
public MyLocation getLocation() {
return location;
}
@Override
public int compareTo(MyMining o) {
return o.getDate().compareTo(this.getDate());
}
@Override
public int hashCode() {
int hash = 3;
hash = 17 * hash + Objects.hashCode(this.getDate());
hash = 17 * hash + Objects.hashCode(this.getLocationID());
hash = 17 * hash + Objects.hashCode(this.getTypeID());
hash = 17 * hash + Objects.hashCode(this.getCharacterID());
hash = 17 * hash + Objects.hashCode(this.isForCorporation());
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MyMining other = (MyMining) obj;
if (!Objects.equals(this.getDate(), other.getDate())) {
return false;
}
if (!Objects.equals(this.getLocationID(), other.getLocationID())) {
return false;
}
if (!Objects.equals(this.getTypeID(), other.getTypeID())) {
return false;
}
if (!Objects.equals(this.getCharacterID(), other.getCharacterID())) {
return false;
}
return Objects.equals(this.isForCorporation(), other.isForCorporation());
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyNpcStanding.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import net.nikr.eve.jeveasset.data.api.accounts.OwnerType;
import net.nikr.eve.jeveasset.data.api.raw.RawNpcStanding;
import net.nikr.eve.jeveasset.data.sde.Agent;
import net.nikr.eve.jeveasset.data.sde.NpcCorporation;
import net.nikr.eve.jeveasset.data.settings.types.CorporationType;
import net.nikr.eve.jeveasset.gui.images.Images;
import net.nikr.eve.jeveasset.gui.shared.table.containers.Security;
import net.nikr.eve.jeveasset.gui.shared.table.containers.TextIcon;
import net.nikr.eve.jeveasset.io.online.EveImageGetter;
import net.nikr.eve.jeveasset.io.online.EveImageGetter.ImageSize;
import net.nikr.eve.jeveasset.io.shared.ApiIdConverter;
public class MyNpcStanding extends RawNpcStanding implements Comparable, CorporationType {
public static ImageSize IMAGE_SIZE = ImageSize.SIZE_32;
private final OwnerType owner;
private final int factionID;
private final int corporationID;
private final int agentID;
private final Agent agent;
private final boolean connections;
private final boolean criminalConnections;
private String factionName;
private String corporationName;
private TextIcon ownerTextIcon = null;;
private TextIcon factionTextIcon = null;
private TextIcon corporationTextIcon = null;
private TextIcon agentTextIcon = null;
private int connectionsLevel;
private int diplomacyLevel;
private int criminalConnectionsLevel;
public MyNpcStanding(RawNpcStanding rawNpcStanding, OwnerType owner) {
super(rawNpcStanding);
this.owner = owner;
agentID = getFromType() == FromType.AGENT ? getFromID() : 0;
agent = ApiIdConverter.getAgent(agentID);
NpcCorporation npcCorporation;
if (getFromType() == FromType.AGENT) {
if (!agent.isEmpty()) {
corporationID = agent.getCorporationID();
npcCorporation = ApiIdConverter.getNpcCorporation(corporationID);
factionID = npcCorporation.getFactionID();
} else {
npcCorporation = ApiIdConverter.getNpcCorporation(getCorporationID());
corporationID = npcCorporation.getCorporationID();
factionID = npcCorporation.getFactionID();
}
} else if (getFromType() == FromType.NPC_CORP) {
corporationID = getFromID();
npcCorporation = ApiIdConverter.getNpcCorporation(corporationID);
factionID = npcCorporation.getFactionID();
} else { //FromType.FACTION
corporationID = 0;
factionID = getFromID();
npcCorporation = ApiIdConverter.getNpcCorporation(factionID);
}
if (npcCorporation != null) {
connections = npcCorporation.isConnections();
criminalConnections = npcCorporation.isCriminalConnections();
} else {
connections = false;
criminalConnections = false;
}
}
public String getOwnerName() {
return owner.getOwnerName();
}
public int getFactionID() {
return factionID;
}
@Override
public Integer getCorporationID() {
return corporationID;
}
@Override
public String getCorporationName() {
return corporationName;
}
public int getAgentID() {
return agentID;
}
public Agent getAgent() {
return agent;
}
public String getAgentName() {
return agent.getAgent();
}
public TextIcon getOwnerTextIcon() {
if (ownerTextIcon == null ) {
if (owner.isCharacter()) {
ownerTextIcon = new TextIcon(Images.getIcon((int)owner.getOwnerID(), EveImageGetter.ImageCategory.CHARACTERS), owner.getOwnerName());
} else {
ownerTextIcon = new TextIcon(Images.getIcon((int)owner.getOwnerID(), EveImageGetter.ImageCategory.CORPORATIONS), owner.getOwnerName());
}
}
return ownerTextIcon;
}
public TextIcon getFactionTextIcon() {
if (factionTextIcon == null && factionID > 0) {
factionTextIcon = new TextIcon(Images.getIcon(factionID, EveImageGetter.ImageCategory.CORPORATIONS), factionName);
}
return factionTextIcon;
}
public TextIcon getCorporationTextIcon() {
if (corporationTextIcon == null && corporationID > 0 && (getFromType() == FromType.AGENT || getFromType() == FromType.NPC_CORP)) {
corporationTextIcon = new TextIcon(Images.getIcon(corporationID, EveImageGetter.ImageCategory.CORPORATIONS), corporationName);
}
return corporationTextIcon;
}
public TextIcon getAgentTextIcon() {
if (agentTextIcon == null && getFromType() == FromType.AGENT) {
agentTextIcon = new TextIcon(Images.getIcon(this), getAgentName());
}
return agentTextIcon;
}
public void setFactionName(String factionName) {
this.factionName = factionName;
}
public void setCorporationName(String corporationName) {
this.corporationName = corporationName;
}
public void updateSkills() {
for (MySkill mySkill : owner.getSkills()) {
if (mySkill.getTypeID() == 3359) { //Connections
connectionsLevel = mySkill.getActiveSkillLevel();
}
if (mySkill.getTypeID() == 3357) { //Connections
diplomacyLevel = mySkill.getActiveSkillLevel();
}
if (mySkill.getTypeID() == 3361) { //Connections
criminalConnectionsLevel = mySkill.getActiveSkillLevel();
}
}
}
public Float getStandingEffective() {
Float standing = getStanding();
if (standing >= 0) {
if (connections && connectionsLevel > 0) {
standing = calc(standing, connectionsLevel);
}
if (criminalConnections && criminalConnectionsLevel > 0) {
standing = calc(standing, criminalConnectionsLevel);
}
} else {
standing = calc(standing, diplomacyLevel);
}
return standing;
}
public Float getStandingMaximum() {
return calc(getStanding(), 5);
}
private Float calc(Float standing, int modifier) {
return standing + (10 - standing) * 0.04F * modifier;
}
public String getLocation() {
if (!agent.isEmpty()) {
return agent.getLocation().getLocation();
} else {
return null;
}
}
public Security getSecurityObject() {
if (!agent.isEmpty()) {
return agent.getLocation().getSecurityObject();
} else {
return null;
}
}
public String getSystem() {
if (!agent.isEmpty()) {
return agent.getLocation().getSystem();
} else {
return null;
}
}
public String getConstellation() {
if (!agent.isEmpty()) {
return agent.getLocation().getConstellation();
} else {
return null;
}
}
public String getRegion() {
if (!agent.isEmpty()) {
return agent.getLocation().getRegion();
} else {
return null;
}
}
@Override
public int compareTo(MyNpcStanding o) {
int compare = MyNpcStanding.FROM_TYPE_COMPARATOR.compare(this.getFromType(), o.getFromType());
if (compare != 0) {
return compare;
}
return Float.compare(o.getStanding(), this.getStanding());
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyShip.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import java.util.Objects;
import net.nikr.eve.jeveasset.data.sde.MyLocation;
import net.nikr.eve.jeveasset.data.settings.Settings;
import net.nikr.eve.jeveasset.data.settings.types.LocationType;
import net.nikr.eve.jeveasset.io.shared.ApiIdConverter;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.CharacterLocationResponse;
import net.troja.eve.esi.model.CharacterShipResponse;
public class MyShip implements Comparable, LocationType {
//Static values (set by constructor)
private final Long itemID;
private final Integer typeID;
private final MyLocation location;
private final String name;
private final String typeName;
private final String eveName;
public MyShip(final CharacterShipResponse shipType, final CharacterLocationResponse response) {
this(shipType.getShipItemId(), SafeConverter.toInteger(shipType.getShipTypeId()), RawConverter.toLocationID(response));
}
public MyShip(final Long itemID, final Integer typeID, final Long locationID) {
this.itemID = itemID;
this.typeID = typeID;
this.location = ApiIdConverter.getLocation(locationID);
this.typeName = ApiIdConverter.getItemUpdate(typeID).getTypeName();
if (Settings.get().getEveNames().get(itemID) != null) {
this.eveName = Settings.get().getEveNames().get(itemID);
this.name = this.eveName + " (" + this.typeName + ")";
} else {
this.eveName = "";
this.name = this.typeName;
}
}
public Long getItemID() {
return itemID;
}
@Override
public MyLocation getLocation() {
return location;
}
public long getLocationID() {
return location.getLocationID();
}
public String getName() {
return name;
}
public String getEveName() {
return eveName;
}
public int getTypeID() {
return typeID;
}
public final String getTypeName() {
return typeName;
}
@Override
public String toString() {
return this.getName();
}
@Override
public int compareTo(final MyShip o) {
return this.getName().compareToIgnoreCase(o.getName());
}
@Override
public int hashCode() {
int hash = 5;
hash = 97 * hash + Objects.hashCode(this.itemID);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MyShip other = (MyShip) obj;
if (!Objects.equals(this.itemID, other.itemID)) {
return false;
}
return true;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MySkill.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import java.util.Objects;
import net.nikr.eve.jeveasset.data.api.raw.RawSkill;
import net.nikr.eve.jeveasset.data.sde.Item;
import net.nikr.eve.jeveasset.data.settings.types.ItemType;
public class MySkill extends RawSkill implements Comparable, ItemType {
private final Item item;
private final String owner;
public MySkill(RawSkill skill, Item item, String owner) {
super(skill);
this.item = item;
this.owner = owner;
}
public String getName() {
return item.getTypeName();
}
@Override
public Item getItem() {
return item;
}
@Override
public long getItemCount() {
return 1;
}
public String getOwnerName() {
return owner;
}
@Override
public int compareTo(MySkill o) {
int compared = this.getOwnerName().compareTo(o.getOwnerName());
if (compared != 0) {
return compared;
}
return this.getName().compareTo(o.getName());
}
@Override
public int hashCode() {
int hash = 3;
hash = 59 * hash + Objects.hashCode(this.item);
hash = 59 * hash + Objects.hashCode(this.owner);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MySkill other = (MySkill) obj;
if (!Objects.equals(this.owner, other.owner)) {
return false;
}
return Objects.equals(this.item, other.item);
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/my/MyTransaction.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.my;
import java.util.Date;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import net.nikr.eve.jeveasset.data.sde.Item;
import net.nikr.eve.jeveasset.data.sde.MyLocation;
import net.nikr.eve.jeveasset.data.api.accounts.OwnerType;
import net.nikr.eve.jeveasset.data.api.raw.RawTransaction;
import net.nikr.eve.jeveasset.data.settings.tag.TagID;
import net.nikr.eve.jeveasset.data.settings.tag.Tags;
import net.nikr.eve.jeveasset.data.settings.types.EditableLocationType;
import net.nikr.eve.jeveasset.data.settings.types.ItemType;
import net.nikr.eve.jeveasset.data.settings.types.LastTransactionType;
import net.nikr.eve.jeveasset.data.settings.types.OwnersType;
import net.nikr.eve.jeveasset.data.settings.types.TagsType;
import net.nikr.eve.jeveasset.gui.shared.table.containers.Percent;
import net.nikr.eve.jeveasset.gui.tabs.transaction.TransactionTab;
import net.nikr.eve.jeveasset.i18n.TabsTransaction;
public class MyTransaction extends RawTransaction implements EditableLocationType, ItemType, Comparable, OwnersType, LastTransactionType, TagsType {
private final Item item;
private final OwnerType owner;
private final Set owners = new HashSet<>();
private MyLocation location;
private String clientName;
private double transactionPrice;
private double transactionProfit;
private Percent transactionProfitPercent;
private Double tax;
private Date added;
private Tags tags;
public MyTransaction(final RawTransaction rawTransaction, final Item item, final OwnerType owner) {
super(rawTransaction);
this.item = item;
this.owner = owner;
owners.add(getClientID());
owners.add(owner.getOwnerID());
}
public int getAccountKeyFormatted() {
return getAccountKey() - 999;
}
public String getTransactionTypeFormatted() {
if (isSell()) {
return TabsTransaction.get().sell();
} else {
return TabsTransaction.get().buy();
}
}
public String getTransactionForFormatted() {
if (isPersonal()) {
return TabsTransaction.get().personal();
} else {
return TabsTransaction.get().corporation();
}
}
@Override
public MyLocation getLocation() {
return location;
}
@Override
public Set getOwners() {
return owners;
}
@Override
public void setLocation(MyLocation location) {
this.location = location;
}
@Override
public Item getItem() {
return item;
}
@Override
public long getItemCount() {
return getQuantity();
}
public String getOwnerName() {
return owner.getOwnerName();
}
public long getOwnerID() {
return owner.getOwnerID();
}
public String getClientName() {
return clientName;
}
public void setClientName(String clientName) {
this.clientName = clientName;
}
public double getValue() {
if (isSell()) {
return (getQuantity() * getPrice()) + getTaxNotNull(); //Adding tax, tax is a negative number
} else {
return getQuantity() * -getPrice();
}
}
public boolean isAfterAssets() {
Date date = owner.getAssetLastUpdate();
if (date != null) {
return getDate().after(date);
} else {
return false;
}
}
public boolean isSell() {
return !isBuy();
}
public boolean isCorporation() {
return !isPersonal();
}
public Double getTax() {
return tax;
}
public double getTaxNotNull() {
if (tax != null) {
return tax;
} else {
return 0.0;
}
}
public void setTax(Double tax) {
this.tax = tax;
}
public Date getAdded() {
return added;
}
public void setAdded(Date added) {
this.added = added;
}
@Override
public Tags getTags() {
return tags;
}
@Override
public TagID getTagID() {
return new TagID(TransactionTab.NAME, getTransactionID(), getPrice());
}
@Override
public void setTags(Tags tags) {
this.tags = tags;
}
@Override
public double getTransactionPrice() {
return transactionPrice;
}
@Override
public double getTransactionProfitDifference() {
return transactionProfit;
}
@Override
public Percent getTransactionProfitPercent() {
return transactionProfitPercent;
}
@Override
public void setTransactionPrice(double transactionPrice) {
this.transactionPrice = transactionPrice;
}
@Override
public void setTransactionProfit(double transactionProfit) {
this.transactionProfit = transactionProfit;
}
@Override
public void setTransactionProfitPercent(Percent transactionProfitPercent) {
this.transactionProfitPercent = transactionProfitPercent;
}
@Override
public int compareTo(final MyTransaction o) {
int compared = o.getDate().compareTo(this.getDate());
if (compared != 0) {
return compared;
} else {
return Double.compare(o.getPrice(), this.getPrice());
}
}
@Override
public int hashCode() {
int hash = 7;
hash = 67 * hash + Objects.hashCode(this.getTransactionID());
hash = 67 * hash + Objects.hashCode(this.getPrice());
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final RawTransaction other = (RawTransaction) obj;
if (!Objects.equals(this.getTransactionID(), other.getTransactionID())) {
return false;
}
if (!Objects.equals(this.getPrice(), other.getPrice())) {
return false;
}
return true;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawAccountBalance.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.CorporationWalletsResponse;
public class RawAccountBalance {
private Double balance;
private Integer accountKey;
/**
* New
*/
private RawAccountBalance() {
}
public static RawAccountBalance create() {
return new RawAccountBalance();
}
/**
* Raw
*
* @param balance
*/
protected RawAccountBalance(RawAccountBalance balance) {
this.balance = balance.balance;
this.accountKey = balance.accountKey;
}
/**
* ESI Character
*
* @param balance
* @param accountKey
*/
public RawAccountBalance(Double balance, Integer accountKey) {
this.balance = balance;
this.accountKey = accountKey;
}
/**
* ESI Corporation
*
* @param response
*/
public RawAccountBalance(CorporationWalletsResponse response) {
this.balance = response.getBalance();
this.accountKey = SafeConverter.toInteger(response.getDivision()) + 999;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
public Integer getAccountKey() {
return accountKey;
}
public void setAccountKey(Integer accountKey) {
this.accountKey = accountKey;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawAsset.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import java.util.Objects;
import net.nikr.eve.jeveasset.data.api.my.MyContractItem;
import net.nikr.eve.jeveasset.data.api.my.MyIndustryJob;
import net.nikr.eve.jeveasset.data.api.my.MyIndustryJob.IndustryActivity;
import net.nikr.eve.jeveasset.data.api.my.MyMarketOrder;
import net.nikr.eve.jeveasset.data.sde.ItemFlag;
import net.nikr.eve.jeveasset.i18n.General;
import net.nikr.eve.jeveasset.io.shared.ApiIdConverter;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.CharacterAssetsResponse;
import net.troja.eve.esi.model.CharacterLocationResponse;
import net.troja.eve.esi.model.PlanetPin;
import net.troja.eve.esi.model.CharacterPlanetsResponse;
import net.troja.eve.esi.model.CharacterShipResponse;
import net.troja.eve.esi.model.CorporationAssetsResponse;
import net.troja.eve.esi.model.PinContent;
public class RawAsset {
private static final ItemFlag MANUFACTURING_FLAG = new ItemFlag(0, IndustryActivity.ACTIVITY_MANUFACTURING.toString(), IndustryActivity.ACTIVITY_MANUFACTURING.toString());
private static final ItemFlag REACTIONS_FLAG = new ItemFlag(0, IndustryActivity.ACTIVITY_REACTIONS.toString(), IndustryActivity.ACTIVITY_REACTIONS.toString());
private static final ItemFlag COPYING_FLAG = new ItemFlag(0, IndustryActivity.ACTIVITY_COPYING.toString(), IndustryActivity.ACTIVITY_COPYING.toString());
private static final ItemFlag INDUSTRY_JOB_FLAG = new ItemFlag(0, General.get().industryJobFlag(), General.get().industryJobFlag());
private static final ItemFlag MARKET_ORDER_BUY_FLAG = new ItemFlag(0, General.get().marketOrderBuyFlag(), General.get().marketOrderBuyFlag());
private static final ItemFlag MARKET_ORDER_SELL_FLAG = new ItemFlag(0, General.get().marketOrderSellFlag(), General.get().marketOrderSellFlag());
private static final ItemFlag CONTRACT_INCLUDED_FLAG = new ItemFlag(0, General.get().contractIncluded(), General.get().contractIncluded());
private static final ItemFlag CONTRACT_EXCLUDED_FLAG = new ItemFlag(0, General.get().contractExcluded(), General.get().contractExcluded());
public static final ItemFlag JUMP_CLONE_FLAG = new ItemFlag(0, General.get().jumpClone(), General.get().jumpClone());
public static final ItemFlag ACTIVE_CLONE_FLAG = new ItemFlag(0, General.get().activeClone(), General.get().activeClone());
public static final ItemFlag IMPLANT_FLAG = ApiIdConverter.getFlag(89); //Implant;
private Boolean isSingleton = null;
private Long itemId = null;
private ItemFlag itemFlag = null;
private String locationFlag = null;
private Long locationId = null;
private Integer quantity = null;
private Integer typeId = null;
/**
* New
*/
private RawAsset() {
}
public static RawAsset create() {
return new RawAsset();
}
/**
* IndustryJob
*
* @param industryJob
* @param output
*/
public RawAsset(MyIndustryJob industryJob, boolean output) {
if (output && industryJob.isManufacturing()) {
isSingleton = false;
itemId = RawConverter.toLong(industryJob.getJobID()); //This item doesn't exist yet, need a new itemID
switch (industryJob.getActivity()) { //Can not be null
case ACTIVITY_MANUFACTURING: //Manufacturing
itemFlag = MANUFACTURING_FLAG;
break;
case ACTIVITY_REACTIONS: //Reactions
itemFlag = REACTIONS_FLAG;
break;
default:
itemFlag = ApiIdConverter.getFlag(0); //Should never happen, but, better safe than sorry...
}
locationId = industryJob.getLocationID();
quantity = industryJob.getOutputCount();
typeId = industryJob.getProductTypeID();
} else if (output && industryJob.isCopying()) {
isSingleton = true;
itemId = RawConverter.toLong(industryJob.getJobID()); //This item doesn't exist yet, need a new itemID
itemFlag = COPYING_FLAG;
locationId = industryJob.getLocationID();
quantity = -2; //BPC
typeId = industryJob.getBlueprintTypeID();
} else {
isSingleton = true;
itemId = industryJob.getBlueprintID(); //blueprint itemID
itemFlag = INDUSTRY_JOB_FLAG;
locationId = industryJob.getLocationID();
if (industryJob.isBPO()) {
quantity = -1;
} else {
quantity = -2;
}
typeId = industryJob.getBlueprintTypeID();
}
}
/**
* MarketOrder
*
* @param marketOrder
*/
public RawAsset(MyMarketOrder marketOrder) {
isSingleton = false;
itemId = marketOrder.getOrderID();
if (marketOrder.isBuyOrder()) { //Buy
itemFlag = MARKET_ORDER_BUY_FLAG;
} else { //Sell
itemFlag = MARKET_ORDER_SELL_FLAG;
}
locationId = marketOrder.getLocationID();
quantity = marketOrder.getVolumeRemain();
typeId = marketOrder.getTypeID();
}
/**
* ContractItem
*
* @param contractItem
*/
public RawAsset(MyContractItem contractItem) {
isSingleton = contractItem.isSingleton();
if (contractItem.getItemID() != null) {
itemId = contractItem.getItemID();
} else {
itemId = contractItem.getRecordID();
}
if (contractItem.isIncluded()) { //Sell
itemFlag = CONTRACT_INCLUDED_FLAG;
} else { //Buy
itemFlag = CONTRACT_EXCLUDED_FLAG;
}
if (contractItem.getContract().getStartLocationID() != null) {
locationId = contractItem.getContract().getStartLocationID();
} else {
locationId = 0L;
}
quantity = RawConverter.toAssetQuantity(contractItem.getQuantity(), contractItem.getRawQuantity());
typeId = contractItem.getTypeID();
}
/**
* Raw
*
* @param asset
*/
protected RawAsset(RawAsset asset) {
isSingleton = asset.isSingleton;
itemId = asset.itemId;
itemFlag = asset.itemFlag;
locationFlag = asset.locationFlag;
locationId = asset.locationId;
quantity = asset.quantity;
typeId = asset.typeId;
}
/**
* ESI Character
*
* @param asset
*/
public RawAsset(CharacterAssetsResponse asset) {
if (asset.getQuantity() != null && asset.getQuantity() < 0 && asset.getQuantity() == -2) { //rawQuantity: Quantity should tell us if it's a BPC or BPO
isSingleton = true;
} else {
isSingleton = asset.getIsSingleton();
}
itemId = asset.getItemId();
itemFlag = RawConverter.toFlag(asset.getLocationFlag());
locationFlag = asset.getLocationFlagString();
locationId = asset.getLocationId();
if (asset.getQuantity() == 1) {
if (asset.getIsBlueprintCopy() != null && asset.getIsBlueprintCopy()) {
quantity = -2;
} else {
quantity = -1;
}
} else {
quantity = SafeConverter.toInteger(asset.getQuantity());
}
typeId = SafeConverter.toInteger(asset.getTypeId());
}
/**
* ESI Corporation
*
* @param asset
*/
public RawAsset(CorporationAssetsResponse asset) {
if (asset.getQuantity() != null && asset.getQuantity() < 0 && asset.getQuantity() == -2) { //rawQuantity: Quantity should tell us if it's a BPC or BPO
isSingleton = true;
} else {
isSingleton = asset.getIsSingleton();
}
itemId = asset.getItemId();
itemFlag = RawConverter.toFlag(asset.getLocationFlag());
locationFlag = asset.getLocationFlagString();
locationId = asset.getLocationId();
if (asset.getQuantity() == 1) {
if (asset.getIsBlueprintCopy() != null && asset.getIsBlueprintCopy()) {
quantity = -2;
} else {
quantity = -1;
}
} else {
quantity = SafeConverter.toInteger(asset.getQuantity());
}
typeId = SafeConverter.toInteger(asset.getTypeId());
}
/**
* ESI Plugged in Implant
*
* @param clone
* @param impantTypeID
*/
public RawAsset(RawClone clone, Integer impantTypeID) {
isSingleton = true; //Unpacked
long combinedId = Long.parseLong(clone.getJumpCloneID() + "" + impantTypeID);
itemId = combinedId;
itemFlag = IMPLANT_FLAG;
locationId = clone.getLocationID();
quantity = 1; //Plugged in AKA always 1
typeId = impantTypeID;
}
/**
* ESI Jump Clone
*
* @param clone
*/
public RawAsset(RawClone clone) {
isSingleton = true; //Unpacked
itemId = clone.getJumpCloneID();
if (clone.isActive()) {
itemFlag = ACTIVE_CLONE_FLAG;
} else {
itemFlag = JUMP_CLONE_FLAG;
} //Implant
locationId = clone.getLocationID();
quantity = 1; //Plugged in AKA always 1
typeId = 0;
}
/**
* ESI Ship
*
* @param shipType
* @param shipLocation
*/
public RawAsset(CharacterShipResponse shipType, CharacterLocationResponse shipLocation) {
isSingleton = true; //Unpacked
itemId = shipType.getShipItemId();
itemFlag = ApiIdConverter.getFlag(0); //None
locationId = RawConverter.toLocationID(shipLocation);
quantity = 1; //Unpacked AKA always 1
typeId = SafeConverter.toInteger(shipType.getShipTypeId());
}
/**
* ESI Planetary Interaction Asset
*
* @param planet
* @param pin
* @param content
*/
public RawAsset(CharacterPlanetsResponse planet, PlanetPin pin, PinContent content) {
isSingleton = false; //Packed
itemId = Long.valueOf(pin.getPinId() + "" + content.getTypeId()); //Semi unique
itemFlag = ApiIdConverter.getFlag(0); //None
locationId = planet.getPlanetId(); //Planet
quantity = content.getAmount().intValue(); //Not perfect, but, will have to do
typeId = SafeConverter.toInteger(content.getTypeId());
}
/**
* ESI Planetary Interaction Facility
*
* @param planet
* @param pin
*/
public RawAsset(CharacterPlanetsResponse planet, PlanetPin pin) {
isSingleton = false; //Packed
itemId = pin.getPinId(); //Semi unique
itemFlag = ApiIdConverter.getFlag(0); //None
locationId = (long) planet.getPlanetId(); //Planet
quantity = 1;
typeId = SafeConverter.toInteger(pin.getTypeId());
}
/**
* Singleton: Unpackaged.
*
* @return true if unpackaged - false if packaged
*/
public final Boolean isSingleton() {
return isSingleton;
}
public void setSingleton(Boolean isSingleton) {
this.isSingleton = isSingleton;
}
public Long getItemID() {
return itemId;
}
public final void setItemID(Long itemId) {
this.itemId = itemId;
}
public ItemFlag getItemFlag() {
return itemFlag;
}
public final void setItemFlag(ItemFlag itemFlag) {
this.itemFlag = itemFlag;
}
public String getLocationFlagString() {
return locationFlag;
}
public void setLocationFlagString(String locationFlagString) {
this.locationFlag = locationFlagString;
}
public long getLocationID() {
return locationId;
}
public final void setLocationID(Long locationId) {
this.locationId = locationId;
}
public final Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Integer getTypeID() {
return typeId;
}
public void setTypeID(Integer typeId) {
this.typeId = typeId;
}
@Override
public int hashCode() {
int hash = 7;
hash = 37 * hash + Objects.hashCode(this.itemId);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final RawAsset other = (RawAsset) obj;
if (!Objects.equals(this.itemId, other.itemId)) {
return false;
}
return Objects.equals(this.typeId, other.typeId);
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawBlueprint.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import net.nikr.eve.jeveasset.data.sde.ItemFlag;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.CharacterBlueprintsResponse;
import net.troja.eve.esi.model.CorporationBlueprintsResponse;
public class RawBlueprint {
private Long itemId = null;
private ItemFlag itemFlag;
private String locationFlag = null;
private Long locationId = null;
private Integer materialEfficiency = null;
private Integer quantity = null;
private Integer runs = null;
private Integer timeEfficiency = null;
private Integer typeId = null;
/**
* New
*/
private RawBlueprint() {
}
public static RawBlueprint create() {
return new RawBlueprint();
}
/**
* Raw (Never used)
*
* @param blueprint
*/
private RawBlueprint(RawBlueprint blueprint) {
itemId = blueprint.itemId;
itemFlag = blueprint.itemFlag;
locationFlag = blueprint.locationFlag;
locationId = blueprint.locationId;
materialEfficiency = blueprint.materialEfficiency;
quantity = blueprint.quantity;
runs = blueprint.runs;
timeEfficiency = blueprint.timeEfficiency;
typeId = blueprint.typeId;
}
/**
* ESI Character
*
* @param blueprint
*/
public RawBlueprint(CharacterBlueprintsResponse blueprint) {
itemId = blueprint.getItemId();
itemFlag = RawConverter.toFlag(blueprint.getLocationFlag());
locationFlag = blueprint.getLocationFlagString();
locationId = blueprint.getLocationId();
materialEfficiency = SafeConverter.toInteger(blueprint.getMaterialEfficiency());
quantity = SafeConverter.toInteger(blueprint.getQuantity());
runs = SafeConverter.toInteger(blueprint.getRuns());
timeEfficiency = SafeConverter.toInteger(blueprint.getTimeEfficiency());
typeId = SafeConverter.toInteger(blueprint.getTypeId());
}
/**
* ESI Corporation
*
* @param blueprint
*/
public RawBlueprint(CorporationBlueprintsResponse blueprint) {
itemId = blueprint.getItemId();
itemFlag = RawConverter.toFlag(blueprint.getLocationFlag());
locationFlag = blueprint.getLocationFlagString();
locationId = blueprint.getLocationId();
materialEfficiency = SafeConverter.toInteger(blueprint.getMaterialEfficiency());
quantity = SafeConverter.toInteger(blueprint.getQuantity());
runs = SafeConverter.toInteger(blueprint.getRuns());
timeEfficiency = SafeConverter.toInteger(blueprint.getTimeEfficiency());
typeId = SafeConverter.toInteger(blueprint.getTypeId());
}
public Long getItemID() {
return itemId;
}
public void setItemID(Long itemId) {
this.itemId = itemId;
}
public void setItemFlag(ItemFlag itemFlag) {
this.itemFlag = itemFlag;
}
public int getFlagID() {
return itemFlag.getFlagID();
}
public String getFlagName() {
return itemFlag.getFlagName();
}
public String getLocationFlagString() {
return locationFlag;
}
public void setLocationFlagString(String locationFlagString) {
this.locationFlag = locationFlagString;
}
public Long getLocationID() {
return locationId;
}
public void setLocationID(Long locationId) {
this.locationId = locationId;
}
public Integer getMaterialEfficiency() {
return materialEfficiency;
}
public void setMaterialEfficiency(Integer materialEfficiency) {
this.materialEfficiency = materialEfficiency;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Integer getRuns() {
return runs;
}
public void setRuns(Integer runs) {
this.runs = runs;
}
public Integer getTimeEfficiency() {
return timeEfficiency;
}
public void setTimeEfficiency(Integer timeEfficiency) {
this.timeEfficiency = timeEfficiency;
}
public Integer getTypeID() {
return typeId;
}
public void setTypeID(Integer typeId) {
this.typeId = typeId;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawClone.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import java.util.ArrayList;
import java.util.List;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.JumpClone;
public class RawClone {
private List implants = new ArrayList<>();
private Long jumpCloneId;
private Long locationId;
private String name;
private boolean active;
public static RawClone create() {
return new RawClone();
}
private RawClone() { }
public RawClone(RawClone rawClone) {
this.implants = new ArrayList<>(rawClone.implants);
this.jumpCloneId = rawClone.jumpCloneId;
this.locationId = rawClone.locationId;
this.name = rawClone.name;
this.active = rawClone.active;
}
/**
* Jump Clone
* @param clone
*/
public RawClone(JumpClone clone) {
this.implants = SafeConverter.toInteger(clone.getImplants());
this.jumpCloneId = clone.getJumpCloneId();
this.locationId = clone.getLocationId();
this.name = clone.getName();
this.active = false;
}
/**
* Active Clone
* @param implants
* @param jumpCloneId
* @param locationId
*/
public RawClone(List implants, Long jumpCloneId, Long locationId) {
this.implants = SafeConverter.toInteger(implants);
this.jumpCloneId = jumpCloneId;
this.locationId = locationId;
this.name = null;
this.active = true;
}
public List getImplants() {
return implants;
}
public void setImplants(List implants) {
this.implants = implants;
}
public Long getJumpCloneID() {
return jumpCloneId;
}
public void setJumpCloneID(Long jumpCloneId) {
this.jumpCloneId = jumpCloneId;
}
public Long getLocationID() {
return locationId;
}
public void setLocationID(Long locationId) {
this.locationId = locationId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawContract.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import java.util.Date;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.CharacterContractsResponse;
import net.troja.eve.esi.model.CorporationContractsResponse;
public class RawContract {
public enum ContractAvailability {
PUBLIC("public"),
PERSONAL("personal"),
CORPORATION("corporation"),
ALLIANCE("alliance");
private final String value;
ContractAvailability(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
public enum ContractStatus {
OUTSTANDING("outstanding"),
IN_PROGRESS("in_progress"),
FINISHED_ISSUER("finished_issuer"),
FINISHED_CONTRACTOR("finished_contractor"),
FINISHED("finished"),
CANCELLED("cancelled"),
REJECTED("rejected"),
FAILED("failed"),
DELETED("deleted"),
REVERSED("reversed"),
ARCHIVED("archived");
private final String value;
ContractStatus(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
public enum ContractType {
UNKNOWN("unknown"),
ITEM_EXCHANGE("item_exchange"),
AUCTION("auction"),
COURIER("courier"),
LOAN("loan");
private final String value;
ContractType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
private Integer acceptorId = null;
private Integer assigneeId = null;
private String availability = null;
private ContractAvailability availabilityEnum = null;
private Double buyout = null;
private Double collateral = null;
private Integer contractId = null;
private Date dateAccepted = null;
private Date dateCompleted = null;
private Date dateExpired = null;
private Date dateIssued = null;
private Integer daysToComplete = null;
private Long endLocationId = null;
private Boolean forCorporation = null;
private Integer issuerCorporationId = null;
private Integer issuerId = null;
private Double price = null;
private Double reward = null;
private Long startLocationId = null;
private String status = null;
private ContractStatus statusEnum = null;
private String title = null;
private String type = null;
private ContractType typeEnum = null;
private Double volume = null;
/**
* New
*/
private RawContract() {
}
public static RawContract create() {
return new RawContract();
}
/**
* Raw
*
* @param contract
*/
protected RawContract(RawContract contract) {
acceptorId = contract.acceptorId;
assigneeId = contract.assigneeId;
availability = contract.availability;
availabilityEnum = contract.availabilityEnum;
buyout = contract.buyout;
collateral = contract.collateral;
contractId = contract.contractId;
dateAccepted = contract.dateAccepted;
dateCompleted = contract.dateCompleted;
dateExpired = contract.dateExpired;
dateIssued = contract.dateIssued;
daysToComplete = contract.daysToComplete;
endLocationId = contract.endLocationId;
forCorporation = contract.forCorporation;
issuerCorporationId = contract.issuerCorporationId;
issuerId = contract.issuerId;
price = contract.price;
reward = contract.reward;
startLocationId = contract.startLocationId;
status = contract.status;
statusEnum = contract.statusEnum;
title = contract.title;
type = contract.type;
typeEnum = contract.typeEnum;
volume = contract.volume;
}
/**
* ESI Character
*
* @param contract
*/
public RawContract(CharacterContractsResponse contract) {
acceptorId = SafeConverter.toInteger(contract.getAcceptorId());
assigneeId = SafeConverter.toInteger(contract.getAssigneeId());
availability = contract.getAvailabilityString();
availabilityEnum = RawConverter.toContractAvailability(contract.getAvailability());
buyout = contract.getBuyout();
collateral = contract.getCollateral();
contractId = SafeConverter.toInteger(contract.getContractId());
dateAccepted = RawConverter.toDate(contract.getDateAccepted());
dateCompleted = RawConverter.toDate(contract.getDateCompleted());
dateExpired = RawConverter.toDate(contract.getDateExpired());
dateIssued = RawConverter.toDate(contract.getDateIssued());
daysToComplete = SafeConverter.toInteger(contract.getDaysToComplete());
endLocationId = contract.getEndLocationId();
forCorporation = contract.getForCorporation();
issuerCorporationId = SafeConverter.toInteger(contract.getIssuerCorporationId());
issuerId = SafeConverter.toInteger(contract.getIssuerId());
price = contract.getPrice();
reward = contract.getReward();
startLocationId = contract.getStartLocationId();
status = contract.getStatusString();
statusEnum = RawConverter.toContractStatus(contract.getStatus());
title = contract.getTitle();
type = contract.getTypeString();
typeEnum = RawConverter.toContractType(contract.getType());
volume = contract.getVolume();
}
/**
* ESI Corporation
*
* @param contract
*/
public RawContract(CorporationContractsResponse contract) {
acceptorId = SafeConverter.toInteger(contract.getAcceptorId());
assigneeId = SafeConverter.toInteger(contract.getAssigneeId());
availability = contract.getAvailabilityString();
availabilityEnum = RawConverter.toContractAvailability(contract.getAvailability());
buyout = contract.getBuyout();
collateral = contract.getCollateral();
contractId = SafeConverter.toInteger(contract.getContractId());
dateAccepted = RawConverter.toDate(contract.getDateAccepted());
dateCompleted = RawConverter.toDate(contract.getDateCompleted());
dateExpired = RawConverter.toDate(contract.getDateExpired());
dateIssued = RawConverter.toDate(contract.getDateIssued());
daysToComplete = SafeConverter.toInteger(contract.getDaysToComplete());
endLocationId = contract.getEndLocationId();
forCorporation = contract.getForCorporation();
issuerCorporationId = SafeConverter.toInteger(contract.getIssuerCorporationId());
issuerId = SafeConverter.toInteger(contract.getIssuerId());
price = contract.getPrice();
reward = contract.getReward();
startLocationId = contract.getStartLocationId();
status = contract.getStatusString();
statusEnum = RawConverter.toContractStatus(contract.getStatus());
title = contract.getTitle();
type = contract.getTypeString();
typeEnum = RawConverter.toContractType(contract.getType());
volume = contract.getVolume();
}
public final long getAcceptorID() {
return acceptorId;
}
public void setAcceptorID(Integer acceptorId) {
this.acceptorId = acceptorId;
}
public final long getAssigneeID() {
return assigneeId;
}
public void setAssigneeID(Integer assigneeId) {
this.assigneeId = assigneeId;
}
public ContractAvailability getAvailability() {
return availabilityEnum;
}
public void setAvailability(ContractAvailability availability) {
this.availabilityEnum = availability;
}
public String getAvailabilityString() {
return availability;
}
public void setAvailabilityString(String availabilityString) {
this.availability = availabilityString;
}
public Double getBuyout() {
return buyout;
}
public void setBuyout(Double buyout) {
this.buyout = buyout;
}
public Double getCollateral() {
return collateral;
}
public void setCollateral(Double collateral) {
this.collateral = collateral;
}
public Integer getContractID() {
return contractId;
}
public void setContractID(Integer contractId) {
this.contractId = contractId;
}
public Date getDateAccepted() {
return dateAccepted;
}
public void setDateAccepted(Date dateAccepted) {
this.dateAccepted = dateAccepted;
}
public Date getDateCompleted() {
return dateCompleted;
}
public void setDateCompleted(Date dateCompleted) {
this.dateCompleted = dateCompleted;
}
public Date getDateExpired() {
return dateExpired;
}
public void setDateExpired(Date dateExpired) {
this.dateExpired = dateExpired;
}
public Date getDateIssued() {
return dateIssued;
}
public void setDateIssued(Date dateIssued) {
this.dateIssued = dateIssued;
}
public Integer getDaysToComplete() {
return daysToComplete;
}
public void setDaysToComplete(Integer daysToComplete) {
this.daysToComplete = daysToComplete;
}
public Long getEndLocationID() {
return endLocationId;
}
public void setEndLocationID(Long endLocationId) {
this.endLocationId = endLocationId;
}
public Boolean isForCorp() {
return forCorporation;
}
public void setForCorporation(Boolean forCorporation) {
this.forCorporation = forCorporation;
}
public final long getIssuerCorpID() {
return issuerCorporationId;
}
public void setIssuerCorporationID(Integer issuerCorporationId) {
this.issuerCorporationId = issuerCorporationId;
}
public final long getIssuerID() {
return issuerId;
}
public void setIssuerID(Integer issuerId) {
this.issuerId = issuerId;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Double getReward() {
return reward;
}
public void setReward(Double reward) {
this.reward = reward;
}
public Long getStartLocationID() {
return startLocationId;
}
public void setStartLocationID(Long startLocationId) {
this.startLocationId = startLocationId;
}
public ContractStatus getStatus() {
return statusEnum;
}
public void setStatus(ContractStatus status) {
this.statusEnum = status;
}
public String getStatusString() {
return status;
}
public void setStatusString(String statusString) {
this.status = statusString;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public ContractType getType() {
return typeEnum;
}
public void setType(ContractType type) {
this.typeEnum = type;
}
public String getTypeString() {
return type;
}
public void setTypeString(String typeString) {
this.type = typeString;
}
public Double getVolume() {
return volume;
}
public void setVolume(Double volume) {
this.volume = volume;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawContractItem.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import net.nikr.eve.jeveasset.data.api.my.MyBlueprint;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.ContractItemsResponse;
import net.troja.eve.esi.model.PublicContractsItemsResponse;
public class RawContractItem {
private Boolean isIncluded = null;
private Boolean isSingleton = null;
private Integer quantity = null;
private Integer rawQuantity = null;
private Long recordId = null;
private Integer typeId = null;
private Long itemId = null;
private Integer runs = null;
private Integer materialEfficiency = null;
private Integer timeEfficiency = null;
/**
* New
*/
private RawContractItem() { }
public static RawContractItem create() {
return new RawContractItem();
}
/**
* Raw
*
* @param contractItem
*/
protected RawContractItem(RawContractItem contractItem) {
isIncluded = contractItem.isIncluded;
isSingleton = contractItem.isSingleton;
quantity = contractItem.quantity;
rawQuantity = contractItem.rawQuantity;
recordId = contractItem.recordId;
typeId = contractItem.typeId;
itemId = contractItem.itemId;
runs = contractItem.runs;
materialEfficiency = contractItem.materialEfficiency;
timeEfficiency = contractItem.timeEfficiency;
}
/**
* ESI Character/Corporation
*
* @param contractItem
*/
public RawContractItem(ContractItemsResponse contractItem) {
isIncluded = contractItem.getIsIncluded();
isSingleton = contractItem.getIsSingleton();
quantity = SafeConverter.toInteger(contractItem.getQuantity());
rawQuantity = SafeConverter.toInteger(contractItem.getRawQuantity());
recordId = contractItem.getRecordId();
typeId = SafeConverter.toInteger(contractItem.getTypeId());
}
/**
* ESI Public
*
* @param contractItem
*/
public RawContractItem(PublicContractsItemsResponse contractItem) {
isIncluded = contractItem.getIsIncluded();
isSingleton = false;
quantity = SafeConverter.toInteger(contractItem.getQuantity());
if (RawConverter.toBoolean(contractItem.getIsBlueprintCopy())) {
rawQuantity = -2;
} else {
rawQuantity = SafeConverter.toInteger(contractItem.getQuantity());
}
recordId = contractItem.getRecordId();
typeId = SafeConverter.toInteger(contractItem.getTypeId());
itemId = contractItem.getItemId();
runs = SafeConverter.toInteger(contractItem.getRuns());
materialEfficiency = SafeConverter.toInteger(contractItem.getMaterialEfficiency());
timeEfficiency = SafeConverter.toInteger(contractItem.getTimeEfficiency());
}
public MyBlueprint getBlueprint() {
if (runs != null || materialEfficiency != null || timeEfficiency != null) {
return new MyBlueprint(this);
} else {
return null;
}
}
public Boolean isIncluded() {
return isIncluded;
}
public final void setIncluded(Boolean isIncluded) {
this.isIncluded = isIncluded;
}
public Boolean isSingleton() {
return isSingleton;
}
public final void setSingleton(Boolean isSingleton) {
this.isSingleton = isSingleton;
}
public Integer getQuantity() {
return quantity;
}
public final void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Integer getRawQuantity() {
return rawQuantity;
}
public final void setRawQuantity(Integer rawQuantity) {
this.rawQuantity = rawQuantity;
}
public Long getRecordID() {
return recordId;
}
public final void setRecordID(Long recordId) {
this.recordId = recordId;
}
public Integer getTypeID() {
return typeId;
}
public final void setTypeID(Integer typeId) {
this.typeId = typeId;
}
public Long getItemID() {
return itemId;
}
public void setItemID(Long itemId) {
this.itemId = itemId;
}
public Integer getLicensedRuns() {
return runs;
}
public void setLicensedRuns(Integer runs) {
this.runs = runs;
}
public Integer getME() {
return materialEfficiency;
}
public void setME(Integer materialEfficiency) {
this.materialEfficiency = materialEfficiency;
}
public Integer getTE() {
return timeEfficiency;
}
public void setTE(Integer timeEfficiency) {
this.timeEfficiency = timeEfficiency;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawExtraction.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import java.util.Date;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.CorporationMiningExtractionsResponse;
public class RawExtraction {
private Date chunkArrivalTime;
private Date extractionStartTime;
private Integer moonId;
private Date naturalDecayTime;
private Long structureId;
private RawExtraction() { }
public static RawExtraction create() {
return new RawExtraction();
}
public RawExtraction(RawExtraction extraction) {
this.chunkArrivalTime = extraction.chunkArrivalTime;
this.extractionStartTime = extraction.extractionStartTime;
this.moonId = extraction.moonId;
this.naturalDecayTime = extraction.naturalDecayTime;
this.structureId = extraction.structureId;
}
public RawExtraction(CorporationMiningExtractionsResponse response) {
this.chunkArrivalTime = RawConverter.toDate(response.getChunkArrivalTime());
this.extractionStartTime = RawConverter.toDate(response.getExtractionStartTime());
this.moonId = SafeConverter.toInteger(response.getMoonId());
this.naturalDecayTime = RawConverter.toDate(response.getNaturalDecayTime());
this.structureId = response.getStructureId();
}
public Date getChunkArrivalTime() {
return chunkArrivalTime;
}
public void setChunkArrivalTime(Date chunkArrivalTime) {
this.chunkArrivalTime = chunkArrivalTime;
}
public Date getExtractionStartTime() {
return extractionStartTime;
}
public void setExtractionStartTime(Date extractionStartTime) {
this.extractionStartTime = extractionStartTime;
}
public Integer getMoonID() {
return moonId;
}
public void setMoonID(Integer moonId) {
this.moonId = moonId;
}
public Date getNaturalDecayTime() {
return naturalDecayTime;
}
public void setNaturalDecayTime(Date naturalDecayTime) {
this.naturalDecayTime = naturalDecayTime;
}
public Long getStructureID() {
return structureId;
}
public void setStructureID(Long structureId) {
this.structureId = structureId;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawIndustryJob.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import java.util.Date;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.CharacterIndustryJobsResponse;
import net.troja.eve.esi.model.CorporationIndustryJobsResponse;
public class RawIndustryJob {
public enum IndustryJobStatus {
ACTIVE("active"),
CANCELLED("cancelled"),
DELIVERED("delivered"),
PAUSED("paused"),
READY("ready"),
REVERTED("reverted"),
ARCHIVED("archived");
private final String value;
IndustryJobStatus(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
private Integer activityId = null;
private Long blueprintId = null;
private Long blueprintLocationId = null;
private Integer blueprintTypeId = null;
private Integer completedCharacterId = null;
private Date completedDate = null;
private Double cost = null;
private Integer duration = null;
private Date endDate = null;
private Long facilityId = null;
private Integer installerId = null;
private Integer jobId = null;
private Integer licensedRuns = null;
private Long outputLocationId = null;
private Date pauseDate = null;
private Float probability = null;
private Integer productTypeId = null;
private Integer runs = null;
private Date startDate = null;
private Long stationId = null;
private String status = null;
private IndustryJobStatus statusEnum = null;
private Integer successfulRuns = null;
/**
* New
*/
private RawIndustryJob() {
}
public static RawIndustryJob create() {
return new RawIndustryJob();
}
/**
* Raw
*
* @param industryJob
*/
protected RawIndustryJob(RawIndustryJob industryJob) {
activityId = industryJob.activityId;
blueprintId = industryJob.blueprintId;
blueprintLocationId = industryJob.blueprintLocationId;
blueprintTypeId = industryJob.blueprintTypeId;
completedCharacterId = industryJob.completedCharacterId;
completedDate = industryJob.completedDate;
cost = industryJob.cost;
duration = industryJob.duration;
endDate = industryJob.endDate;
facilityId = industryJob.facilityId;
installerId = industryJob.installerId;
jobId = industryJob.jobId;
licensedRuns = industryJob.licensedRuns;
outputLocationId = industryJob.outputLocationId;
pauseDate = industryJob.pauseDate;
probability = industryJob.probability;
productTypeId = industryJob.productTypeId;
runs = industryJob.runs;
startDate = industryJob.startDate;
stationId = industryJob.stationId;
status = industryJob.status;
statusEnum = industryJob.statusEnum;
successfulRuns = industryJob.successfulRuns;
}
/**
* ESI Character
*
* @param industryJob
*/
public RawIndustryJob(CharacterIndustryJobsResponse industryJob) {
activityId = SafeConverter.toInteger(industryJob.getActivityId());
blueprintId = industryJob.getBlueprintId();
blueprintLocationId = industryJob.getBlueprintLocationId();
blueprintTypeId = SafeConverter.toInteger(industryJob.getBlueprintTypeId());
completedCharacterId = SafeConverter.toInteger(industryJob.getCompletedCharacterId());
completedDate = RawConverter.toDate(industryJob.getCompletedDate());
cost = industryJob.getCost();
duration = SafeConverter.toInteger(industryJob.getDuration());
endDate = RawConverter.toDate(industryJob.getEndDate());
facilityId = industryJob.getFacilityId();
installerId = SafeConverter.toInteger(industryJob.getInstallerId());
jobId = SafeConverter.toInteger(industryJob.getJobId());
licensedRuns = SafeConverter.toInteger(industryJob.getLicensedRuns());
outputLocationId = industryJob.getOutputLocationId();
pauseDate = RawConverter.toDate(industryJob.getPauseDate());
probability = SafeConverter.toFloat(industryJob.getProbability());
productTypeId = SafeConverter.toInteger(industryJob.getProductTypeId());
runs = SafeConverter.toInteger(industryJob.getRuns());
startDate = RawConverter.toDate(industryJob.getStartDate());
stationId = industryJob.getStationId();
status = industryJob.getStatusString();
statusEnum = RawConverter.toIndustryJobStatus(industryJob.getStatus());
successfulRuns = SafeConverter.toInteger(industryJob.getSuccessfulRuns());
}
/**
* ESI Corporation
*
* @param industryJob
*/
public RawIndustryJob(CorporationIndustryJobsResponse industryJob) {
activityId = SafeConverter.toInteger(industryJob.getActivityId());
blueprintId = industryJob.getBlueprintId();
blueprintLocationId = industryJob.getBlueprintLocationId();
blueprintTypeId = SafeConverter.toInteger(industryJob.getBlueprintTypeId());
completedCharacterId = SafeConverter.toInteger(industryJob.getCompletedCharacterId());
completedDate = RawConverter.toDate(industryJob.getCompletedDate());
cost = industryJob.getCost();
duration = SafeConverter.toInteger(industryJob.getDuration());
endDate = RawConverter.toDate(industryJob.getEndDate());
facilityId = industryJob.getFacilityId();
installerId = SafeConverter.toInteger(industryJob.getInstallerId());
jobId = SafeConverter.toInteger(industryJob.getJobId());
licensedRuns = SafeConverter.toInteger(industryJob.getLicensedRuns());
outputLocationId = industryJob.getOutputLocationId();
pauseDate = RawConverter.toDate(industryJob.getPauseDate());
probability = SafeConverter.toFloat(industryJob.getProbability());
productTypeId = SafeConverter.toInteger(industryJob.getProductTypeId());
runs = SafeConverter.toInteger(industryJob.getRuns());
startDate = RawConverter.toDate(industryJob.getStartDate());
stationId = industryJob.getLocationId();
status = industryJob.getStatusString();
statusEnum = RawConverter.toIndustryJobStatus(industryJob.getStatus());
successfulRuns = SafeConverter.toInteger(industryJob.getSuccessfulRuns());
}
public final Integer getActivityID() {
return activityId;
}
public void setActivityID(Integer activityId) {
this.activityId = activityId;
}
public Long getBlueprintID() {
return blueprintId;
}
public void setBlueprintID(Long blueprintId) {
this.blueprintId = blueprintId;
}
public Long getBlueprintLocationID() {
return blueprintLocationId;
}
public void setBlueprintLocationID(Long blueprintLocationId) {
this.blueprintLocationId = blueprintLocationId;
}
public Integer getBlueprintTypeID() {
return blueprintTypeId;
}
public void setBlueprintTypeID(Integer blueprintTypeId) {
this.blueprintTypeId = blueprintTypeId;
}
public Integer getCompletedCharacterID() {
return completedCharacterId;
}
public void setCompletedCharacterID(Integer completedCharacterId) {
this.completedCharacterId = completedCharacterId;
}
public Date getCompletedDate() {
return completedDate;
}
public void setCompletedDate(Date completedDate) {
this.completedDate = completedDate;
}
public Double getCost() {
return cost;
}
public void setCost(Double cost) {
this.cost = cost;
}
public Integer getDuration() {
return duration;
}
public void setDuration(Integer duration) {
this.duration = duration;
}
public final Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public Long getFacilityID() {
return facilityId;
}
public void setFacilityID(Long facilityId) {
this.facilityId = facilityId;
}
public final long getInstallerID() {
return installerId;
}
public void setInstallerID(Integer installerId) {
this.installerId = installerId;
}
public Integer getJobID() {
return jobId;
}
public void setJobID(Integer jobId) {
this.jobId = jobId;
}
public final Integer getLicensedRuns() {
return licensedRuns;
}
public void setLicensedRuns(Integer licensedRuns) {
this.licensedRuns = licensedRuns;
}
public Long getOutputLocationID() {
return outputLocationId;
}
public void setOutputLocationID(Long outputLocationId) {
this.outputLocationId = outputLocationId;
}
public Date getPauseDate() {
return pauseDate;
}
public void setPauseDate(Date pauseDate) {
this.pauseDate = pauseDate;
}
public Float getProbability() {
return probability;
}
public void setProbability(Float probability) {
this.probability = probability;
}
public Integer getProductTypeID() {
return productTypeId;
}
public void setProductTypeID(Integer productTypeId) {
this.productTypeId = productTypeId;
}
public final int getRuns() {
return runs;
}
public void setRuns(Integer runs) {
this.runs = runs;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Long getStationID() {
return stationId;
}
public void setStationID(Long stationId) {
this.stationId = stationId;
}
public IndustryJobStatus getStatus() {
return statusEnum;
}
public void setStatus(IndustryJobStatus status) {
this.statusEnum = status;
}
public String getStatusString() {
return status;
}
public void setStatusString(String statusString) {
this.status = statusString;
}
public Integer getSuccessfulRuns() {
return successfulRuns;
}
public void setSuccessfulRuns(Integer successfulRuns) {
this.successfulRuns = successfulRuns;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawJournal.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import java.util.Date;
import net.nikr.eve.jeveasset.i18n.TabsJournal;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.CharacterWalletJournalResponse;
import net.troja.eve.esi.model.CorporationWalletJournalResponse;
public class RawJournal {
public enum ArgName {
STATION_NAME,
NPC_NAME,
DESTROYED_SHIP_TYPE_ID,
PLAYER_NAME,
JOB_ID,
CONTRACT_ID,
TRANSACTION_ID,
CORPORATION_NAME,
ALLIANCE_NAME,
PLANET_NAME,
}
public enum ArgID {
STATION_ID,
NPC_ID,
PLAYER_ID,
SYSTEM_ID,
CORPORATION_ID,
ALLIANCE_ID,
PLANET_ID,
}
public enum ContextType {
STRUCTURE_ID("structure_id") {
@Override
protected String getI18N() {
return TabsJournal.get().contextStructureID();
}
},
STATION_ID("station_id") {
@Override
protected String getI18N() {
return TabsJournal.get().contextStationID();
}
},
MARKET_TRANSACTION_ID("market_transaction_id") {
@Override
protected String getI18N() {
return TabsJournal.get().contextTransactionID();
}
},
CHARACTER_ID("character_id") {
@Override
protected String getI18N() {
return TabsJournal.get().contextCharacterID();
}
},
CORPORATION_ID("corporation_id") {
@Override
protected String getI18N() {
return TabsJournal.get().contextCorporationID();
}
},
ALLIANCE_ID("alliance_id") {
@Override
protected String getI18N() {
return TabsJournal.get().contextAllianceID();
}
},
EVE_SYSTEM("eve_system") {
@Override
protected String getI18N() {
return TabsJournal.get().contextEveID();
}
},
INDUSTRY_JOB_ID("industry_job_id") {
@Override
protected String getI18N() {
return TabsJournal.get().contextIndustryJobID();
}
},
CONTRACT_ID("contract_id") {
@Override
protected String getI18N() {
return TabsJournal.get().contextContractID();
}
},
PLANET_ID("planet_id") {
@Override
protected String getI18N() {
return TabsJournal.get().contextPlanetID();
}
},
SYSTEM_ID("system_id") {
@Override
protected String getI18N() {
return TabsJournal.get().contextSystemID();
}
},
TYPE_ID("type_id") {
@Override
protected String getI18N() {
return TabsJournal.get().contextTypeID();
}
};
private final String value;
ContextType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return getI18N();
}
protected abstract String getI18N();
}
private Double amount = null;
private Double balance = null;
private Long contextId;
private String contextIdType;
private ContextType contextIdTypeEnum;
private Date date = null;
private String description;
private Integer firstPartyId = null;
private String reason = null;
private Long id = null;
private String refType = null;
private RawJournalRefType refTypeEnum = null;
private Integer secondPartyId = null;
private Double tax = null;
private Integer taxReceiverId = null;
private Integer accountKey = null;
/**
* New
*/
private RawJournal() {
}
public static RawJournal create() {
return new RawJournal();
}
/**
* Raw
*
* @param journal
*/
protected RawJournal(RawJournal journal) {
amount = journal.amount;
balance = journal.balance;
date = journal.date;
description = journal.description;
contextId = journal.contextId;
contextIdType = journal.contextIdType;
contextIdTypeEnum = journal.contextIdTypeEnum;
firstPartyId = journal.firstPartyId;
reason = journal.reason;
id = journal.id;
refType = journal.refType;
refTypeEnum = journal.refTypeEnum;
secondPartyId = journal.secondPartyId;
tax = journal.tax;
taxReceiverId = journal.taxReceiverId;
accountKey = journal.accountKey;
}
/**
* ESI Character
*
* @param journal
* @param accountKey
*/
public RawJournal(CharacterWalletJournalResponse journal, Integer accountKey) {
amount = journal.getAmount();
balance = journal.getBalance();
contextId = journal.getContextId();
contextIdType = journal.getContextIdTypeString();
contextIdTypeEnum = RawConverter.toJournalContextType(journal.getContextIdType());
date = RawConverter.toDate(journal.getDate());
description = journal.getDescription();
firstPartyId = SafeConverter.toInteger(journal.getFirstPartyId());
reason = journal.getReason();
id = journal.getId();
refType = journal.getRefTypeString();
refTypeEnum = RawConverter.toJournalRefType(journal.getRefType());
secondPartyId = SafeConverter.toInteger(journal.getSecondPartyId());
tax = journal.getTax();
taxReceiverId = SafeConverter.toInteger(journal.getTaxReceiverId());
this.accountKey = accountKey;
}
/**
* ESI Corporation
*
* @param journal
* @param accountKey
*/
public RawJournal(CorporationWalletJournalResponse journal, Integer accountKey) {
amount = journal.getAmount();
balance = journal.getBalance();
contextId = journal.getContextId();
contextIdType = journal.getContextIdTypeString();
contextIdTypeEnum = RawConverter.toJournalContextType(journal.getContextIdType());
date = RawConverter.toDate(journal.getDate());
description = journal.getDescription();
firstPartyId = SafeConverter.toInteger(journal.getFirstPartyId());
reason = journal.getReason();
id = journal.getId();
refType = journal.getRefTypeString();
refTypeEnum = RawConverter.toJournalRefType(journal.getRefType());
secondPartyId = SafeConverter.toInteger(journal.getSecondPartyId());
tax = journal.getTax();
taxReceiverId = SafeConverter.toInteger(journal.getTaxReceiverId());
this.accountKey = accountKey;
}
public Double getAmount() {
return amount;
}
public void setAmount(Double amount) {
this.amount = amount;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
public Long getContextID() {
return contextId;
}
public void setContextID(Long contextId) {
this.contextId = contextId;
}
public ContextType getContextType() {
return contextIdTypeEnum;
}
public String getContextTypeName() {
if (contextIdTypeEnum == null) {
return "";
} else {
return contextIdTypeEnum.toString();
}
}
public void setContextType(ContextType contextType) {
this.contextIdTypeEnum = contextType;
}
public String getContextTypeString() {
return contextIdType;
}
public void setContextTypeString(String contextIdTypeString) {
this.contextIdType = contextIdTypeString;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public final Integer getFirstPartyID() {
return firstPartyId;
}
public void setFirstPartyID(Integer firstPartyId) {
this.firstPartyId = firstPartyId;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public Long getRefID() {
return id;
}
public void setRefID(Long refId) {
this.id = refId;
}
public RawJournalRefType getRefType() {
return refTypeEnum;
}
public void setRefType(RawJournalRefType refType) {
this.refTypeEnum = refType;
}
public String getRefTypeString() {
return refType;
}
public void setRefTypeString(String refTypeString) {
this.refType = refTypeString;
}
public final Integer getSecondPartyID() {
return secondPartyId;
}
public void setSecondPartyID(Integer secondPartyId) {
this.secondPartyId = secondPartyId;
}
public Double getTaxAmount() {
return tax;
}
public void setTax(Double tax) {
this.tax = tax;
}
public Integer getTaxReceiverID() {
return taxReceiverId;
}
public void setTaxReceiverID(Integer taxRecieverId) {
this.taxReceiverId = taxRecieverId;
}
public Integer getAccountKey() {
return accountKey;
}
public void setAccountKey(Integer accountKey) {
this.accountKey = accountKey;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawJournalRefType.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
public enum RawJournalRefType {
UNDEFINED(0, "Undefined"),
PLAYER_TRADING(1, "Player Trading", RawJournal.ArgName.STATION_NAME, RawJournal.ArgID.STATION_ID),
MARKET_TRANSACTION(2, "Market Transaction", RawJournal.ArgName.TRANSACTION_ID, null),
GM_CASH_TRANSFER(3, "GM Cash Transfer"),
ATM_WITHDRAW(4, "ATM Withdraw"),
ATM_DEPOSIT(5, "ATM Deposit"),
BACKWARD_COMPATIBLE(6, "Backward Compatible"),
MISSION_REWARD(7, "Mission Reward", RawJournal.ArgName.PLAYER_NAME, RawJournal.ArgID.PLAYER_ID),
CLONE_ACTIVATION(8, "Clone Activation"),
INHERITANCE(9, "Inheritance"),
PLAYER_DONATION(10, "Player Donation"),
CORPORATION_PAYMENT(11, "Corporation Payment"),
DOCKING_FEE(12, "Docking Fee"),
OFFICE_RENTAL_FEE(13, "Office Rental Fee"),
FACTORY_SLOT_RENTAL_FEE(14, "Factory Slot Rental Fee"),
REPAIR_BILL(15, "Repair Bill"),
BOUNTY(16, "Bounty"),
BOUNTY_PRIZE(17, "Bounty Prize", RawJournal.ArgName.NPC_NAME, RawJournal.ArgID.NPC_ID),
AGENTS_TEMPORARY(18, "Agents_temporary"),
INSURANCE(19, "Insurance", RawJournal.ArgName.DESTROYED_SHIP_TYPE_ID, null),
MISSION_EXPIRATION(20, "Mission Expiration"),
MISSION_COMPLETION(21, "Mission Completion"),
SHARES(22, "Shares"),
COURIER_MISSION_ESCROW(23, "Courier Mission Escrow"),
MISSION_COST(24, "Mission Cost"),
AGENT_MISCELLANEOUS(25, "Agent Miscellaneous"),
LP_STORE(26, "LP Store"),
AGENT_LOCATION_SERVICES(27, "Agent Location Services"),
AGENT_DONATION(28, "Agent Donation"),
AGENT_SECURITY_SERVICES(29, "Agent Security Services"),
AGENT_MISSION_COLLATERAL_PAID(30, "Agent Mission Collateral Paid"),
AGENT_MISSION_COLLATERAL_REFUNDED(31, "Agent Mission Collateral Refunded"),
AGENTS_PREWARD(32, "Agents_preward"),
AGENT_MISSION_REWARD(33, "Agent Mission Reward", RawJournal.ArgName.PLAYER_NAME, RawJournal.ArgID.PLAYER_ID),
AGENT_MISSION_TIME_BONUS_REWARD(34, "Agent Mission Time Bonus Reward", RawJournal.ArgName.PLAYER_NAME, RawJournal.ArgID.PLAYER_ID),
CSPA(35, "CSPA", RawJournal.ArgName.PLAYER_NAME, RawJournal.ArgID.PLAYER_ID),
CSPAOFFLINEREFUND(36, "CSPAOfflineRefund"),
CORPORATION_ACCOUNT_WITHDRAWAL(37, "Corporation Account Withdrawal", RawJournal.ArgName.PLAYER_NAME, RawJournal.ArgID.PLAYER_ID),
CORPORATION_DIVIDEND_PAYMENT(38, "Corporation Dividend Payment"),
CORPORATION_REGISTRATION_FEE(39, "Corporation Registration Fee"),
CORPORATION_LOGO_CHANGE_COST(40, "Corporation Logo Change Cost", RawJournal.ArgName.CORPORATION_NAME, RawJournal.ArgID.CORPORATION_ID),
RELEASE_OF_IMPOUNDED_PROPERTY(41, "Release Of Impounded Property"),
MARKET_ESCROW(42, "Market Escrow"),
AGENT_SERVICES_RENDERED(43, "Agent Services Rendered"),
MARKET_FINE_PAID(44, "Market Fine Paid"),
CORPORATION_LIQUIDATION(45, "Corporation Liquidation"),
BROKERS_FEE(46, "Brokers Fee"),
CORPORATION_BULK_PAYMENT(47, "Corporation Bulk Payment"),
ALLIANCE_REGISTRATION_FEE(48, "Alliance Registration Fee"),
WAR_FEE(49, "War Fee"),
ALLIANCE_MAINTAINANCE_FEE(50, "Alliance Maintainance Fee", RawJournal.ArgName.ALLIANCE_NAME, RawJournal.ArgID.ALLIANCE_ID),
CONTRABAND_FINE(51, "Contraband Fine"),
CLONE_TRANSFER(52, "Clone Transfer"),
ACCELERATION_GATE_FEE(53, "Acceleration Gate Fee"),
TRANSACTION_TAX(54, "Transaction Tax"),
JUMP_CLONE_INSTALLATION_FEE(55, "Jump Clone Installation Fee"),
MANUFACTURING(56, "Manufacturing", RawJournal.ArgName.JOB_ID, null),
RESEARCHING_TECHNOLOGY(57, "Researching Technology"),
RESEARCHING_TIME_PRODUCTIVITY(58, "Researching Time Productivity"),
RESEARCHING_MATERIAL_PRODUCTIVITY(59, "Researching Material Productivity"),
COPYING(60, "Copying"),
DUPLICATING(61, "Duplicating"),
REVERSE_ENGINEERING(62, "Reverse Engineering"),
CONTRACT_AUCTION_BID(63, "Contract Auction Bid", RawJournal.ArgName.CONTRACT_ID, null),
CONTRACT_AUCTION_BID_REFUND(64, "Contract Auction Bid Refund", RawJournal.ArgName.CONTRACT_ID, null),
CONTRACT_COLLATERAL(65, "Contract Collateral", RawJournal.ArgName.CONTRACT_ID, null),
CONTRACT_REWARD_REFUND(66, "Contract Reward Refund", RawJournal.ArgName.CONTRACT_ID, null),
CONTRACT_AUCTION_SOLD(67, "Contract Auction Sold", RawJournal.ArgName.CONTRACT_ID, null),
CONTRACT_REWARD(68, "Contract Reward", RawJournal.ArgName.CONTRACT_ID, null),
CONTRACT_COLLATERAL_REFUND(69, "Contract Collateral Refund", RawJournal.ArgName.CONTRACT_ID, null),
CONTRACT_COLLATERAL_PAYOUT(70, "Contract Collateral Payout", RawJournal.ArgName.CONTRACT_ID, null),
CONTRACT_PRICE(71, "Contract Price", RawJournal.ArgName.CONTRACT_ID, null),
CONTRACT_BROKERS_FEE(72, "Contract Brokers Fee", RawJournal.ArgName.CONTRACT_ID, null),
CONTRACT_SALES_TAX(73, "Contract Sales Tax", RawJournal.ArgName.CONTRACT_ID, null),
CONTRACT_DEPOSIT(74, "Contract Deposit", RawJournal.ArgName.CONTRACT_ID, null),
CONTRACT_DEPOSIT_SALES_TAX(75, "Contract Deposit Sales Tax", RawJournal.ArgName.CONTRACT_ID, null),
SECURE_EVE_TIME_CODE_EXCHANGE(76, "Secure EVE Time Code Exchange"),
CONTRACT_AUCTION_BID_CORP(77, "Contract Auction Bid (corp)"),
CONTRACT_COLLATERAL_DEPOSITED_CORP(78, "Contract Collateral Deposited (corp)"),
CONTRACT_PRICE_PAYMENT_CORP(79, "Contract Price Payment (corp)"),
CONTRACT_BROKERS_FEE_CORP(80, "Contract Brokers Fee (corp)"),
CONTRACT_DEPOSIT_CORP(81, "Contract Deposit (corp)"),
CONTRACT_DEPOSIT_REFUND(82, "Contract Deposit Refund"),
CONTRACT_REWARD_DEPOSITED(83, "Contract Reward Deposited"),
CONTRACT_REWARD_DEPOSITED_CORP(84, "Contract Reward Deposited (corp)"),
BOUNTY_PRIZES(85, "Bounty Prizes", null, RawJournal.ArgID.SYSTEM_ID),
ADVERTISEMENT_LISTING_FEE(86, "Advertisement Listing Fee"),
MEDAL_CREATION(87, "Medal Creation", RawJournal.ArgName.PLAYER_NAME, RawJournal.ArgID.PLAYER_ID),
MEDAL_ISSUED(88, "Medal Issued", RawJournal.ArgName.PLAYER_NAME, RawJournal.ArgID.PLAYER_ID),
BETTING(89, "Betting"),
DNA_MODIFICATION_FEE(90, "DNA Modification Fee"),
SOVEREIGNITY_BILL(91, "Sovereignity bill"),
BOUNTY_PRIZE_CORPORATION_TAX(92, "Bounty Prize Corporation Tax"),
AGENT_MISSION_REWARD_CORPORATION_TAX(93, "Agent Mission Reward Corporation Tax"),
AGENT_MISSION_TIME_BONUS_REWARD_CORPORATION_TAX(94, "Agent Mission Time Bonus Reward Corporation Tax"),
UPKEEP_ADJUSTMENT_FEE(95, "Upkeep adjustment fee"),
PLANETARY_IMPORT_TAX(96, "Planetary Import Tax", RawJournal.ArgName.PLANET_NAME, RawJournal.ArgID.PLANET_ID),
PLANETARY_EXPORT_TAX(97, "Planetary Export Tax", RawJournal.ArgName.PLANET_NAME, RawJournal.ArgID.PLANET_ID),
PLANETARY_CONSTRUCTION(98, "Planetary Construction"),
CORPORATE_REWARD_PAYOUT(99, "Corporate Reward Payout"),
// MINIGAME_BETTING(100, "Minigame Betting"),
BOUNTY_SURCHARGE(101, "Bounty Surcharge"),
CONTRACT_REVERSAL(102, "Contract Reversal"),
CORPORATE_REWARD_TAX(103, "Corporate Reward Tax"),
STORE_PURCHASE(106, "Store Purchase"),
STORE_PURCHASE_REFUND(107, "Store Purchase Refund"),
PLEX_SOLD_FOR_AURUM(108, "PLEX sold for Aurum"),
LOTTERY_GIVE_AWAY(109, "Lottery Give Away"),
AURUM_TOKEN_EXCHANGED_FOR_AUR(111, "Aurum Token exchanged for Aur"),
DATACORE_FEE(112, "Datacore Fee"),
WAR_FEE_SURRENDER(113, "War fee surrender"),
WAR_ALLY_CONTRACT(114, "War ally contract"),
BOUNTY_REIMBURSEMENT(115, "Bounty Reimbursement"),
KILL_RIGHT(116, "Kill Right Fee"),
SECURITY_PROCESSING_FEE(117, "Security Processing Fee"),
ESCROW_FOR_INDUSTRY_TEAM_AUCTION(118, "Escrow for Industry Team Auction"),
REIMBURSEMENT_OF_ESCROW(119, "Reimbursement of escrow"),
INDUSTRY_JOB_TAX(120, "Industry Job Tax", null, RawJournal.ArgID.STATION_ID),
INFRASTRUCTURE_HUB_MAINTENANCE(122, "Infrastructure Hub maintenance"),
ASSET_SAFETY_RECOVERY_TAX(123, "Asset Safety recovery Tax"),
OPPORTUNITY_REWARD(124, "Opportunity reward"),
PROJECT_DISCOVERY_REWARD(125, "Project Discovery reward"),
PROJECT_DISCOVERY_TAX(126, "Project Discovery Tax"),
REPROCESSING_TAX(127, "Reprocessing Tax"),
JUMP_CLONE_ACTIVATION_FEE(128, "Jump Clone Activation Fee"),
OPERATION_BONUS(129, "Operation Bonus"),
RESOURCE_WARS_SITE_COMPLETION(131, "Resource Wars Site Completion"),
DUEL_WAGER_ESCROW(132, "Duel Wager Escrow"),
DUEL_WAGER_PAYMENT(133, "Duel Wager Payment"),
DUEL_WAGER_REFUND(134, "Duel Wager Refund"),
REACTIONS(135, "Reactions"),
EXTERNAL_TRADE_FREEZE(136, "External Trade Freeze"),
EXTERNAL_TRADE_THAW(137, "External Trade Thaw"),
EXTERNAL_TRADE_DELIVERY(138, "External Trade Delivery"),
SEASON_CHALLENGE_REWARD(139, "Season Challenge Reward"),
STRUCTURE_GATE_JUMP(140, "Structure Gate Jump"),
SKILL_PURCHASE(141, "Skill Purchase"),
ITEM_TRADER_PAYMENT(142, "Item Trader Payment"),
FLUX_TICKET_SALE(143, "Flux Ticket Sale"), //hypernet ref group
FLUX_PAYOUT(144, "Flux Payout"), //hypernet ref group
FLUX_TAX(145, "Flux Tax"), //hypernet ref group
FLUX_TICKET_REPAYMENT(146, "Flux Ticket Repayment"), //hypernet ref group
REDEEMED_ISK_TOKEN(147, "Redeemed Isk Token"),
DAILY_CHALLENGE_REWARD(148, "Daily Challenge Reward"),
MARKET_PROVIDER_TAX(149, "Market Provider Tax"),
ESS_ESCROW_TRANSFER(155, "ESS Escrow Transfer"),
MILESTONE_REWARD_PAYMENT(156, "Milestone Reward Payment"),
UNDER_CONSTRUCTION(166, "Under Construction"),
ALLIGNMENT_BASED_GATE_TOLL (168, "Allignment Based Gate Toll"),
PROJECT_PAYOUTS (170, "Project Payouts"),
INSURGENCY_CORRUPTION_CONTRIBUTION_REWARD (172, "Insurgency Corruption Contribution Reward"),
INSURGENCY_SUPPRESSION_CONTRIBUTION_REWARD (173, "Insurgency Suppression Contribution Reward"),
DAILY_GOAL_PAYOUTS (174, "Daily Goal Payouts"),
DAILY_GOAL_PAYOUTS_TAX (175, "Daily Goal Payouts Tax"),
COSMETIC_MARKET_COMPONENT_ITEM_PURCHASE (178, "Cosmetic Market Component Item Purchase"),
COSMETIC_MARKET_SKIN_SALE_BROKER_FEE (179, "Cosmetic Market Skin Sale Broker Fee"),
COSMETIC_MARKET_SKIN_PURCHASE (180, "Cosmetic Market Skin Purchase"),
COSMETIC_MARKET_SKIN_SALE (181, "Cosmetic Market Skin Sale"),
COSMETIC_MARKET_SKIN_SALE_TAX (182, "Cosmetic Market Skin Sale Tax"),
COSMETIC_MARKET_SKIN_TRANSACTION (183, "Cosmetic Market Skin Sale Transaction"),
SKYHOOK_CLAIM_FEE(184, "Skyhook Claim Fee"),
AIR_CAREER_PROGRAM_REWARD(185, "Air Ccareer Program Reward"),
FREELANCE_JOBS_DURATION_FEE(186, "Freelance Jobs Duration Fee"),
FREELANCE_JOBS_BROADCASTING_FEE(187, "Freelance Jobs Broadcasting Fee"),
FREELANCE_JOBS_REWARD_ESCROW(188, "Freelance Jobs Reward Escrow"),
FREELANCE_JOBS_REWARD(189, "Freelance Jobs Reward"),
FREELANCE_JOBS_ESCROW_REFUND(190, "Freelance Jobs Escrow Refund"),
FREELANCE_JOBS_REWARD_CORPORATION_TAX(191, "Freelance Jobs Reward Corporation Tax"),
GM_PLEX_FEE_REFUND(192, "GM PLEX Fee Refund"),
MODIFY_ISK(10001, "Modify ISK"),
PRIMARY_MARKETPLACE_PURCHASE(10002, "Primary Marketplace Purchase"),
BATTLE_REWARD(10003, "Battle Reward"),
NEW_CHARACTER_STARTING_FUNDS(10004, "New Character Starting Funds"),
CORPORATION_ACCOUNT_WITHDRAWAL_2(10005, "Corporation Account Withdrawal"),
CORPORATION_ACCOUNT_DEPOSIT(10006, "Corporation Account Deposit"),
BATTLE_WP_WIN_REWARD(10007, "Battle WP Win Reward"),
BATTLE_WP_LOSS_REWARD(10008, "Battle WP Loss Reward"),
BATTLE_WIN_REWARD(10009, "Battle Win Reward"),
BATTLE_LOSS_REWARD(10010, "Battle Loss Reward"),
RESET_ISK_FOR_CHARACTER_RESET(10011, "Reset ISK for Character Reset"),
DISTRICT_CONTRACT_DEPOSIT(10012, "District Contract Deposit"),
DISTRICT_CONTRACT_DEPOSIT_REFUND(10013, "District Contract Deposit Refund"),
DISTRICT_CONTRACT_COLLATERAL(10014, "District Contract Collateral"),
DISTRICT_CONTRACT_COLLATERAL_REFUND(10015, "District Contract Collateral Refund"),
DISTRICT_CONTRACT_REWARD(10016, "District Contract Reward"),
DISTRICT_CLONE_TRANSPORTATION(10017, "District Clone Transportation"),
DISTRICT_CLONE_TRANSPORTATION_REFUND(10018, "District Clone Transportation Refund"),
DISTRICT_INFRASTRUCTURE(10019, "District Infrastructure"),
DISTRICT_CLONE_SALES(10020, "District Clone Sales"),
DISTRICT_CLONE_PURCHASE(10021, "District Clone Purchase"),
BIOMASS_REWARD(10022, "Biomass Reward"),
ISK_SWAP_REWARD(10023, "ISK Swap Reward"),
MODIFY_UPLEX(11001, "Modify AUR"), RESPEC_PAYMENT(11002, "Respec payment"),
ENTITLEMENT(11003, "Entitlement"),
RESET_REIMBURSEMENT(11004, "Reset Reimbursement"),
RESET_AUR_FOR_CHARACTER_RESET(11005, "Reset AUR for Character Reset"),
DAILY_MISSION_CP(12001, "Daily mission CP"),
WARBARGE_CP(12002, "Warbarge CP"),
DONATE_CP(12003, "Donate CP"),
USE_CP_FOR_CLONE_PACKS(12004, "Use CP for clone packs"),
USE_CP_FOR_MOVING_CLONES(12005, "Use CP for moving clones"),
USE_CP_FOR_SELLING_CLONES(12006, "Use CP for selling clones"),
USE_CP_FOR_CHANGING_REINFORCEMENT(12007, "Use CP for changing reinforcement"),
USE_CP_FOR_CHANGING_SURFACE_INFRASTRUCTURE(12008, "Use CP for changing surface infrastructure"),
DAILY_MISSION_DK(13001, "Daily mission DK"),
PLANETARY_CONQUEST_DK(13002, "Planetary conquest DK"),
USE_DK_FOR_PURCHASING_ITEMS(13003, "Use DK for purchasing items"),
USE_DK_FOR_REROLLING_MARKET(13004, "Use DK for rerolling market"),
SELLING_CLONES_DK(13005, "Selling Clones DK"),
;
private final int id;
private final String value;
private final RawJournal.ArgName argName;
private final RawJournal.ArgID argID;
private RawJournalRefType(int id, String value) {
this.id = id;
this.value = value;
this.argName = null;
this.argID = null;
}
private RawJournalRefType(int id, String value, RawJournal.ArgName argName, RawJournal.ArgID argID) {
this.id = id;
this.value = value;
this.argName = argName;
this.argID = argID;
}
public int getID() {
return id;
}
public RawJournal.ArgName getArgName() {
return argName;
}
public RawJournal.ArgID getArgID() {
return argID;
}
@Override
public String toString() {
return value;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawLoyaltyPoints.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.CharacterLoyaltyPointsResponse;
public class RawLoyaltyPoints {
private Integer corporationId;
private Integer loyaltyPoints;
public static RawLoyaltyPoints create() {
return new RawLoyaltyPoints();
}
private RawLoyaltyPoints() { }
public RawLoyaltyPoints(CharacterLoyaltyPointsResponse response) {
corporationId = SafeConverter.toInteger(response.getCorporationId());
loyaltyPoints = SafeConverter.toInteger(response.getLoyaltyPoints());
}
public RawLoyaltyPoints(RawLoyaltyPoints response) {
corporationId = response.getCorporationID();
loyaltyPoints = response.getLoyaltyPoints();
}
public Integer getCorporationID() {
return corporationId;
}
public void setCorporationID(Integer corporationId) {
this.corporationId = corporationId;
}
public Integer getLoyaltyPoints() {
return loyaltyPoints;
}
public void setLoyaltyPoints(Integer loyaltyPoints) {
this.loyaltyPoints = loyaltyPoints;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawMarketOrder.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import java.util.Date;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
import net.nikr.eve.jeveasset.i18n.TabsOrders;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.CharacterOrdersHistoryResponse;
import net.troja.eve.esi.model.CharacterOrdersResponse;
import net.troja.eve.esi.model.CorporationOrdersHistoryResponse;
import net.troja.eve.esi.model.CorporationOrdersResponse;
public class RawMarketOrder {
public enum MarketOrderRange {
_1("1", TabsOrders.get().rangeJump()),
_10("10"),
_2("2"),
_20("20"),
_3("3"),
_30("30"),
_4("4"),
_40("40"),
_5("5"),
REGION("region", TabsOrders.get().rangeRegion()),
SOLARSYSTEM("solarsystem", TabsOrders.get().rangeSolarSystem()),
STATION("station", TabsOrders.get().rangeStation());
private static final MarketOrderRange[] SORTED = {
REGION, SOLARSYSTEM, STATION, _1, _2, _3, _4, _5, _10, _20, _30, _40
};
private final String value;
private final String text;
MarketOrderRange(String value) {
this(value, TabsOrders.get().rangeJumps(value));
}
MarketOrderRange(String value, String text) {
this.value = value;
this.text = text;
}
public static MarketOrderRange[] valuesSorted() {
return SORTED;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return text;
}
}
public enum MarketOrderState {
CANCELLED("cancelled"),
CHARACTER_DELETED("character_deleted"),
CLOSED("closed"),
EXPIRED("expired"),
OPEN("open"),
PENDING("pending"),
UNKNOWN("Unknown");
private final String value;
MarketOrderState(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
private Integer walletDivision = null;
private Integer duration = null;
private Double escrow = null;
private Boolean isBuyOrder = null;
private Boolean isCorp = null;
private Date issued = null;
private final Set changes = new TreeSet<>();
private Integer issuedBy = null;
private Long locationId = null;
private Integer minVolume = null;
private Long orderId = null;
private Double price = null;
private String range = null;
private MarketOrderRange rangeEnum = null;
private Integer regionId = null;
private String state = null;
private MarketOrderState stateEnum = null;
private Integer typeId = null;
private Integer volumeRemain = null;
private Integer volumeTotal = null;
private Date changed;
private boolean updateChanged = false;
/**
* New
*/
private RawMarketOrder() {
}
public static RawMarketOrder create() {
return new RawMarketOrder();
}
/**
* Raw
*
* @param marketOrder
*/
protected RawMarketOrder(RawMarketOrder marketOrder) {
walletDivision = marketOrder.walletDivision;
duration = marketOrder.duration;
escrow = marketOrder.escrow;
isBuyOrder = marketOrder.isBuyOrder;
isCorp = marketOrder.isCorp;
issued = marketOrder.issued;
changes.addAll(marketOrder.changes);
issuedBy = marketOrder.issuedBy;
locationId = marketOrder.locationId;
minVolume = marketOrder.minVolume;
orderId = marketOrder.orderId;
price = marketOrder.price;
range = marketOrder.range;
rangeEnum = marketOrder.rangeEnum;
regionId = marketOrder.regionId;
state = marketOrder.state;
stateEnum = marketOrder.stateEnum;
typeId = marketOrder.typeId;
volumeRemain = marketOrder.volumeRemain;
volumeTotal = marketOrder.volumeTotal;
}
/**
* ESI Character
*
* @param marketOrder
*/
public RawMarketOrder(CharacterOrdersResponse marketOrder) {
walletDivision = 1;
duration = SafeConverter.toInteger(marketOrder.getDuration());
escrow = RawConverter.toDouble(marketOrder.getEscrow(), 0);
isBuyOrder = RawConverter.toBoolean(marketOrder.getIsBuyOrder());
isCorp = marketOrder.getIsCorporation();
issued = RawConverter.toDate(marketOrder.getIssued());
issuedBy = null;
locationId = marketOrder.getLocationId();
minVolume = RawConverter.toInteger(marketOrder.getMinVolume(), 0);
orderId = marketOrder.getOrderId();
price = marketOrder.getPrice();
range = marketOrder.getRangeString();
rangeEnum = RawConverter.toMarketOrderRange(marketOrder.getRange());
regionId = SafeConverter.toInteger(marketOrder.getRegionId());
state = MarketOrderState.OPEN.getValue();
stateEnum = MarketOrderState.OPEN;
typeId = SafeConverter.toInteger(marketOrder.getTypeId());
volumeRemain = SafeConverter.toInteger(marketOrder.getVolumeRemain());
volumeTotal = SafeConverter.toInteger(marketOrder.getVolumeTotal());
changes.add(new Change(this));
}
/**
* ESI Character History
*
* @param marketOrder
*/
public RawMarketOrder(CharacterOrdersHistoryResponse marketOrder) {
walletDivision = 1;
duration = SafeConverter.toInteger(marketOrder.getDuration());
escrow = RawConverter.toDouble(marketOrder.getEscrow(), 0);
isBuyOrder = RawConverter.toBoolean(marketOrder.getIsBuyOrder());
isCorp = marketOrder.getIsCorporation();
issued = RawConverter.toDate(marketOrder.getIssued());
issuedBy = null;
locationId = marketOrder.getLocationId();
minVolume = RawConverter.toInteger(marketOrder.getMinVolume(), 0);
orderId = marketOrder.getOrderId();
price = marketOrder.getPrice();
range = marketOrder.getRangeString();
rangeEnum = RawConverter.toMarketOrderRange(marketOrder.getRange());
regionId = SafeConverter.toInteger(marketOrder.getRegionId());
state = marketOrder.getStateString();
stateEnum = RawConverter.toMarketOrderState(marketOrder.getState());
typeId = SafeConverter.toInteger(marketOrder.getTypeId());
volumeRemain = SafeConverter.toInteger(marketOrder.getVolumeRemain());
volumeTotal = SafeConverter.toInteger(marketOrder.getVolumeTotal());
changes.add(new Change(this));
}
/**
* ESI Corporation
*
* @param marketOrder
*/
public RawMarketOrder(CorporationOrdersResponse marketOrder) {
walletDivision = SafeConverter.toInteger(marketOrder.getWalletDivision());
duration = SafeConverter.toInteger(marketOrder.getDuration());
escrow = RawConverter.toDouble(marketOrder.getEscrow(), 0);
isBuyOrder = RawConverter.toBoolean(marketOrder.getIsBuyOrder());
isCorp = true;
issued = RawConverter.toDate(marketOrder.getIssued());
issuedBy = SafeConverter.toInteger(marketOrder.getIssuedBy());
locationId = marketOrder.getLocationId();
minVolume = RawConverter.toInteger(marketOrder.getMinVolume(), 0);
orderId = marketOrder.getOrderId();
price = marketOrder.getPrice();
range = marketOrder.getRangeString();
rangeEnum = RawConverter.toMarketOrderRange(marketOrder.getRange());
regionId = SafeConverter.toInteger(marketOrder.getRegionId());
state = MarketOrderState.OPEN.getValue();
stateEnum = MarketOrderState.OPEN;
typeId = SafeConverter.toInteger(marketOrder.getTypeId());
volumeRemain = SafeConverter.toInteger(marketOrder.getVolumeRemain());
volumeTotal = SafeConverter.toInteger(marketOrder.getVolumeTotal());
changes.add(new Change(this));
}
/**
* ESI Corporation History
*
* @param marketOrder
*/
public RawMarketOrder(CorporationOrdersHistoryResponse marketOrder) {
walletDivision = SafeConverter.toInteger(marketOrder.getWalletDivision());
duration = SafeConverter.toInteger(marketOrder.getDuration());
escrow = RawConverter.toDouble(marketOrder.getEscrow(), 0);
isBuyOrder = RawConverter.toBoolean(marketOrder.getIsBuyOrder());
isCorp = true;
issued = RawConverter.toDate(marketOrder.getIssued());
issuedBy = SafeConverter.toInteger(marketOrder.getIssuedBy());
locationId = marketOrder.getLocationId();
minVolume = RawConverter.toInteger(marketOrder.getMinVolume(), 0);
orderId = marketOrder.getOrderId();
price = marketOrder.getPrice();
range = marketOrder.getRangeString();
rangeEnum = RawConverter.toMarketOrderRange(marketOrder.getRange());
regionId = SafeConverter.toInteger(marketOrder.getRegionId());
state = marketOrder.getStateString();
stateEnum = RawConverter.toMarketOrderState(marketOrder.getState());
typeId = SafeConverter.toInteger(marketOrder.getTypeId());
volumeRemain = SafeConverter.toInteger(marketOrder.getVolumeRemain());
volumeTotal = SafeConverter.toInteger(marketOrder.getVolumeTotal());
changes.add(new Change(this));
}
public Integer getWalletDivision() {
return walletDivision;
}
public void setWalletDivision(Integer walletDivision) {
this.walletDivision = walletDivision;
}
public Integer getDuration() {
return duration;
}
public void setDuration(Integer duration) {
this.duration = duration;
}
public Double getEscrow() {
return escrow;
}
public void setEscrow(Double escrow) {
this.escrow = escrow;
}
public Boolean isBuyOrder() {
return isBuyOrder;
}
public void setBuyOrder(Boolean isBuyOrder) {
this.isBuyOrder = isBuyOrder;
}
public Boolean isCorp() {
return isCorp;
}
public void setCorp(Boolean isCorp) {
this.isCorp = isCorp;
}
public Date getIssued() {
return issued;
}
public void setIssued(Date issued) {
this.issued = issued;
}
public int getEdits() {
if (changes.isEmpty() || changes.size() == 1) { //0 or 1 = 0;
return 0;
} else {
return changes.size() - 1; // > 1
}
}
public Date getChanged() {
return changed;
}
public void setChanged(Date changed) {
this.changed = changed;
updateChanged = false;
}
public boolean isUpdateChanged() {
return updateChanged;
}
public Set getChanges() {
return changes;
}
public void addChangesLegacy(Date date) {
if (date != null) {
changes.add(new Change(date, null, null));
}
}
public void addChanges(Set change) {
if (change != null) {
Change current = new Change(this);
updateChanged = !change.contains(current);
changes.add(current); //Add current
changes.addAll(change); //Add old
}
}
public boolean addChanges(RawPublicMarketOrder response) {
if (response != null) {
//Set new data
setPrice(response.getPrice());
setVolumeRemain(response.getVolumeRemain());
setIssued(response.getIssued());
//Add change
return changes.add(new Change(response));
}
return false;
}
public Integer getIssuedBy() {
return issuedBy;
}
public void setIssuedBy(Integer issuedBy) {
this.issuedBy = issuedBy;
}
public long getLocationID() {
return locationId;
}
public void setLocationID(Long locationId) {
this.locationId = locationId;
}
public Integer getMinVolume() {
return minVolume;
}
public void setMinVolume(Integer minVolume) {
this.minVolume = minVolume;
}
public Long getOrderID() {
return orderId;
}
public void setOrderID(Long orderId) {
this.orderId = orderId;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public final MarketOrderRange getRange() {
return rangeEnum;
}
public void setRange(MarketOrderRange range) {
this.rangeEnum = range;
}
public String getRangeString() {
return range;
}
public void setRangeString(String rangeString) {
this.range = rangeString;
}
public Integer getRegionID() {
return regionId;
}
public void setRegionID(Integer regionId) {
this.regionId = regionId;
}
public final MarketOrderState getState() {
return stateEnum;
}
public void setState(MarketOrderState state) {
this.stateEnum = state;
}
public String getStateString() {
return state;
}
public void setStateString(String stateString) {
this.state = stateString;
}
public Integer getTypeID() {
return typeId;
}
public void setTypeID(Integer typeId) {
this.typeId = typeId;
}
public final Integer getVolumeRemain() {
return volumeRemain;
}
public void setVolumeRemain(Integer volumeRemain) {
this.volumeRemain = volumeRemain;
}
public final Integer getVolumeTotal() {
return volumeTotal;
}
public void setVolumeTotal(Integer volumeTotal) {
this.volumeTotal = volumeTotal;
}
public static class Change implements Comparable {
private final Date date;
private final Double price;
private final Integer volumeRemaining;
public Change(RawPublicMarketOrder response) {
this(response.getIssued(), response.getPrice(), response.getVolumeRemain());
}
public Change(RawMarketOrder response) {
this(response.getIssued(), response.getPrice(), response.getVolumeRemain());
}
public Change(Date date, Double price, Integer volumeRemaining) {
this.date = date;
this.price = price;
this.volumeRemaining = volumeRemaining;
}
public Date getDate() {
return date;
}
public Double getPrice() {
return price;
}
public Integer getVolumeRemaining() {
return volumeRemaining;
}
@Override
public int hashCode() {
int hash = 7;
hash = 53 * hash + Objects.hashCode(this.date);
hash = 53 * hash + Objects.hashCode(this.price);
hash = 53 * hash + Objects.hashCode(this.volumeRemaining);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Change other = (Change) obj;
if (!Objects.equals(this.date, other.date)) {
return false;
}
if (!Objects.equals(this.price, other.price)) {
return false;
}
if (!Objects.equals(this.volumeRemaining, other.volumeRemaining)) {
return false;
}
return true;
}
@Override
public int compareTo(Change change) {
return date.compareTo(change.date);
}
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawMining.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import java.util.Date;
import net.nikr.eve.jeveasset.data.api.accounts.OwnerType;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.CharacterMiningResponse;
import net.troja.eve.esi.model.CorporationMiningObserverResponse;
import net.troja.eve.esi.model.CorporationMiningObserversResponse;
public class RawMining {
private Date date;
private Long count;
private Long locationID;
private Integer typeID;
private long characterID;
private Long corporationID = null;
private String corporationName;
private boolean forCorporation;
private RawMining() { }
public static RawMining create() {
return new RawMining();
}
public RawMining(RawMining mining) {
this.date = mining.date;
this.count = mining.count;
this.locationID = mining.locationID;
this.typeID = mining.typeID;
this.characterID = mining.characterID;
this.corporationID = mining.corporationID;
this.corporationName = mining.corporationName;
this.forCorporation = mining.forCorporation;
}
/**
* ESI Character
*
* @param mining
* @param owner
*/
public RawMining(CharacterMiningResponse mining, OwnerType owner) {
this.date = RawConverter.toDate(mining.getDate());
this.count = mining.getQuantity();
this.locationID = mining.getSolarSystemId();
this.typeID = SafeConverter.toInteger(mining.getTypeId());
this.characterID = owner.getOwnerID();
this.corporationID = null;
this.corporationName = owner.getCorporationName();
this.forCorporation = false;
}
/**
* ESI Corporation
*
* @param observers
* @param mining
* @param owner
*/
public RawMining(CorporationMiningObserversResponse observers, CorporationMiningObserverResponse mining, OwnerType owner) {
this.date = RawConverter.toDate(mining.getLastUpdated());
this.count = mining.getQuantity();
this.locationID = observers.getObserverId();
this.typeID = SafeConverter.toInteger(mining.getTypeId());
this.characterID = mining.getCharacterId();
this.corporationName = null;
this.corporationID = mining.getRecordedCorporationId();
this.forCorporation = true;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public long getCount() {
return count;
}
public void setCount(Long count) {
this.count = count;
}
public long getLocationID() {
return locationID;
}
public void setLocationID(Long locationID) {
this.locationID = locationID;
}
public Integer getTypeID() {
return typeID;
}
public void setTypeID(Integer typeID) {
this.typeID = typeID;
}
public long getCharacterID() {
return characterID;
}
public void setCharacterID(long characterID) {
this.characterID = characterID;
}
public Long getCorporationID() {
return corporationID;
}
public void setCorporationID(Long corporationID) {
this.corporationID = corporationID;
}
public boolean isForCorporation() {
return forCorporation;
}
public void setForCorporation(boolean forCorporation) {
this.forCorporation = forCorporation;
}
public String getCorporationName() {
return corporationName;
}
public void setCorporationName(String corporationName) {
this.corporationName = corporationName;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawNpcStanding.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import java.util.Comparator;
import net.nikr.eve.jeveasset.i18n.TabsNpcStanding;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.StandingsResponse;
public class RawNpcStanding {
public static final TypeComparator FROM_TYPE_COMPARATOR = new TypeComparator();
public enum FromType {
FACTION("faction"){
@Override
String getI18N() {
return TabsNpcStanding.get().typeFaction();
}
},
NPC_CORP("npc_corp"){
@Override
String getI18N() {
return TabsNpcStanding.get().typeCorporation();
}
},
AGENT("agent"){
@Override
String getI18N() {
return TabsNpcStanding.get().typeAgent();
}
};
private final String value;
FromType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
abstract String getI18N();
@Override
public String toString() {
return getI18N();
}
}
private String fromType;
private FromType fromTypeEnum;
private Integer fromId;
private Float standing;
public static RawNpcStanding create() {
return new RawNpcStanding();
}
private RawNpcStanding() { }
/**
* ESI Character/Corporation
* @param response
*/
public RawNpcStanding(StandingsResponse response) {
fromType = response.getFromTypeString();
fromTypeEnum = RawConverter.toNpcStandingFromType(response.getFromType());
fromId = SafeConverter.toInteger(response.getFromId());
standing = SafeConverter.toFloat(response.getStanding());
}
public RawNpcStanding(RawNpcStanding response) {
fromType = response.getFromTypeString();
fromTypeEnum = response.getFromType();
fromId = response.getFromID();
standing = response.getStanding();
}
public String getFromTypeString() {
return fromType;
}
public void setFromTypeString(String fromType) {
this.fromType = fromType;
}
public FromType getFromType() {
return fromTypeEnum;
}
public void setFromType(FromType fromTypeEnum) {
this.fromTypeEnum = fromTypeEnum;
}
public Integer getFromID() {
return fromId;
}
public void setFromID(Integer fromId) {
this.fromId = fromId;
}
public Float getStanding() {
return standing;
}
public void setStanding(Float standing) {
this.standing = standing;
}
public static class TypeComparator implements Comparator {
@Override
public int compare(FromType o1, FromType o2) {
return Integer.compare(o1.ordinal(), o2.ordinal());
}
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawPublicMarketOrder.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import java.util.Date;
import java.util.Objects;
import net.nikr.eve.jeveasset.data.api.raw.RawMarketOrder.MarketOrderRange;
import net.nikr.eve.jeveasset.gui.tabs.orders.MarketLog;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.MarketRegionOrdersResponse;
import net.troja.eve.esi.model.MarketStructureResponse;
public class RawPublicMarketOrder {
private final Integer duration;
private final Integer minVolume;
private final Boolean isBuyOrder;
private final Double price;
private final Integer systemId;
private final Integer typeId;
private final String range;
private final MarketOrderRange rangeEnum;
private final Integer volumeTotal;
private final Date issued;
private final Long orderId;
private final Integer volumeRemain;
private final Long locationId;
public RawPublicMarketOrder(MarketRegionOrdersResponse marketOrder) {
this.duration = SafeConverter.toInteger(marketOrder.getDuration());
this.minVolume = SafeConverter.toInteger(marketOrder.getMinVolume());
this.isBuyOrder = marketOrder.getIsBuyOrder();
this.price = marketOrder.getPrice();
this.systemId = SafeConverter.toInteger(marketOrder.getSystemId());
this.typeId = SafeConverter.toInteger(marketOrder.getTypeId());
this.range = marketOrder.getRangeString();
this.rangeEnum = RawConverter.toMarketOrderRange(marketOrder.getRange());
this.volumeTotal = SafeConverter.toInteger(marketOrder.getVolumeTotal());
this.issued = RawConverter.toDate(marketOrder.getIssued());
this.orderId = marketOrder.getOrderId();
this.volumeRemain = SafeConverter.toInteger(marketOrder.getVolumeRemain());
this.locationId = marketOrder.getLocationId();
}
public RawPublicMarketOrder(MarketStructureResponse marketOrder, final Long systemId) {
this.duration = SafeConverter.toInteger(marketOrder.getDuration());
this.minVolume = SafeConverter.toInteger(marketOrder.getMinVolume());
this.isBuyOrder = marketOrder.getIsBuyOrder();
this.price = marketOrder.getPrice();
this.systemId = SafeConverter.toInteger(systemId);
this.typeId = SafeConverter.toInteger(marketOrder.getTypeId());
this.range = marketOrder.getRangeString();
this.rangeEnum = RawConverter.toMarketOrderRange(marketOrder.getRange());
this.volumeTotal = SafeConverter.toInteger(marketOrder.getVolumeTotal());
this.issued = RawConverter.toDate(marketOrder.getIssued());
this.orderId = marketOrder.getOrderId();
this.volumeRemain = SafeConverter.toInteger(marketOrder.getVolumeRemain());
this.locationId = marketOrder.getLocationId();
}
public RawPublicMarketOrder(MarketLog marketLog) {
this.duration = marketLog.getDuration();
this.minVolume = marketLog.getMinVolume();
this.isBuyOrder = marketLog.getBid();
this.price = marketLog.getPrice();
this.systemId = SafeConverter.toInteger(marketLog.getSolarSystemID());
this.typeId = marketLog.getTypeID();
this.range = null;
this.rangeEnum = RawConverter.toMarketOrderRange(marketLog.getRange(), null, null);
this.volumeTotal = marketLog.getVolEntered();
this.issued = marketLog.getIssueDate();
this.orderId = marketLog.getOrderID();
this.volumeRemain = RawConverter.toInteger(marketLog.getVolRemaining());
this.locationId = marketLog.getStationID();
}
public Integer getDuration() {
return duration;
}
public Integer getMinVolume() {
return minVolume;
}
public Boolean isBuyOrder() {
return isBuyOrder;
}
public Double getPrice() {
return price;
}
public Integer getSystemID() {
return systemId;
}
public Integer getTypeID() {
return typeId;
}
public MarketOrderRange getRange() {
return rangeEnum;
}
public String getRangeString() {
return range;
}
public Integer getVolumeTotal() {
return volumeTotal;
}
public Date getIssued() {
return issued;
}
public Long getOrderID() {
return orderId;
}
public Integer getVolumeRemain() {
return volumeRemain;
}
public Long getLocationID() {
return locationId;
}
@Override
public int hashCode() {
int hash = 7;
hash = 37 * hash + Objects.hashCode(this.orderId);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final RawPublicMarketOrder other = (RawPublicMarketOrder) obj;
if (!Objects.equals(this.orderId, other.orderId)) {
return false;
}
return true;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawSkill.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.Skill;
public class RawSkill {
private Integer activeSkillLevel;
private Integer skillId;
private Long skillpointsInSkill;
private Integer trainedSkillLevel;
/**
* New
*/
private RawSkill() { }
public static RawSkill create() {
return new RawSkill();
}
public RawSkill(RawSkill skill) {
this.activeSkillLevel = skill.getActiveSkillLevel();
this.skillId = skill.getTypeID();
this.skillpointsInSkill = skill.getSkillpoints();
this.trainedSkillLevel = skill.getTrainedSkillLevel();
}
public RawSkill(Skill skill) {
this.activeSkillLevel = SafeConverter.toInteger(skill.getActiveSkillLevel());
this.skillId = SafeConverter.toInteger(skill.getSkillId());
this.skillpointsInSkill = skill.getSkillpointsInSkill();
this.trainedSkillLevel = SafeConverter.toInteger(skill.getTrainedSkillLevel());
}
public Integer getActiveSkillLevel() {
return activeSkillLevel;
}
public Integer getTypeID() {
return skillId;
}
public Long getSkillpoints() {
return skillpointsInSkill;
}
public Integer getTrainedSkillLevel() {
return trainedSkillLevel;
}
public void setActiveSkillLevel(Integer activeSkillLevel) {
this.activeSkillLevel = activeSkillLevel;
}
public void setTypeID(Integer typeID) {
this.skillId = typeID;
}
public void setSkillpoints(Long skillpoints) {
this.skillpointsInSkill = skillpoints;
}
public void setTrainedSkillLevel(Integer trainedSkillLevel) {
this.trainedSkillLevel = trainedSkillLevel;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/api/raw/RawTransaction.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.api.raw;
import java.util.Date;
import net.nikr.eve.jeveasset.io.shared.RawConverter;
import net.nikr.eve.jeveasset.io.shared.SafeConverter;
import net.troja.eve.esi.model.CharacterWalletTransactionsResponse;
import net.troja.eve.esi.model.CorporationWalletTransactionsResponse;
public class RawTransaction {
private Integer clientId = null;
private Date date = null;
private Boolean isBuy = null;
private Boolean isPersonal = null;
private Long journalRefId = null;
private Long locationId = null;
private Integer quantity = null;
private Long transactionId = null;
private Integer typeId = null;
private Double unitPrice = null;
private Integer accountKey = null;
/**
* New
*/
private RawTransaction() {
}
public static RawTransaction create() {
return new RawTransaction();
}
/**
* Raw
*
* @param transaction
*/
protected RawTransaction(RawTransaction transaction) {
clientId = transaction.clientId;
date = transaction.date;
isBuy = transaction.isBuy;
isPersonal = transaction.isPersonal;
journalRefId = transaction.journalRefId;
locationId = transaction.locationId;
quantity = transaction.quantity;
transactionId = transaction.transactionId;
typeId = transaction.typeId;
unitPrice = transaction.unitPrice;
accountKey = transaction.accountKey;
}
/**
* ESI Character
*
* @param transaction
* @param accountKey
*/
public RawTransaction(CharacterWalletTransactionsResponse transaction, Integer accountKey) {
clientId = SafeConverter.toInteger(transaction.getClientId());
date = RawConverter.toDate(transaction.getDate());
isBuy = transaction.getIsBuy();
isPersonal = transaction.getIsPersonal();
journalRefId = transaction.getJournalRefId();
locationId = transaction.getLocationId();
quantity = SafeConverter.toInteger(transaction.getQuantity());
transactionId = transaction.getTransactionId();
typeId = SafeConverter.toInteger(transaction.getTypeId());
unitPrice = transaction.getUnitPrice();
this.accountKey = accountKey;
}
/**
* ESI Corporation
*
* @param transaction
* @param accountKey
*/
public RawTransaction(CorporationWalletTransactionsResponse transaction, Integer accountKey) {
clientId = SafeConverter.toInteger(transaction.getClientId());
date = RawConverter.toDate(transaction.getDate());
isBuy = transaction.getIsBuy();
isPersonal = false;
journalRefId = transaction.getJournalRefId();
locationId = transaction.getLocationId();
quantity = SafeConverter.toInteger(transaction.getQuantity());
transactionId = transaction.getTransactionId();
typeId = SafeConverter.toInteger(transaction.getTypeId());
unitPrice = transaction.getUnitPrice();
this.accountKey = accountKey;
}
public final long getClientID() {
return clientId;
}
public void setClientID(Integer clientId) {
this.clientId = clientId;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Boolean isBuy() {
return isBuy;
}
public void setBuy(Boolean isBuy) {
this.isBuy = isBuy;
}
public Boolean isPersonal() {
return isPersonal;
}
public void setPersonal(Boolean isPersonal) {
this.isPersonal = isPersonal;
}
public Long getJournalRefID() {
return journalRefId;
}
public void setJournalRefID(Long journalRefId) {
this.journalRefId = journalRefId;
}
public long getLocationID() {
return locationId;
}
public void setLocationID(Long locationId) {
this.locationId = locationId;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Long getTransactionID() {
return transactionId;
}
public void setTransactionID(Long transactionId) {
this.transactionId = transactionId;
}
public Integer getTypeID() {
return typeId;
}
public void setTypeID(Integer typeId) {
this.typeId = typeId;
}
public Double getPrice() {
return unitPrice;
}
public void setUnitPrice(Double unitPrice) {
this.unitPrice = unitPrice;
}
public Integer getAccountKey() {
return accountKey;
}
public void setAccountKey(Integer accountKey) {
this.accountKey = accountKey;
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/profile/Profile.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.profile;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import net.nikr.eve.jeveasset.Program;
import net.nikr.eve.jeveasset.data.api.accounts.EsiOwner;
import net.nikr.eve.jeveasset.io.local.profile.ProfileDatabase;
import net.nikr.eve.jeveasset.io.local.ProfileReader;
import net.nikr.eve.jeveasset.io.local.profile.ProfileDatabase.Table;
import net.nikr.eve.jeveasset.io.shared.FileUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Profile implements Comparable {
private static final Logger LOG = LoggerFactory.getLogger(Profile.class);
private static final String XML = "xml";
private static final String XML_BAC = "bac";
private static final String XML_BACKUP = "xmlbackup";
private static final String SQLITE = "db";
private static final String SQLITE_BACKUP = "zip";
public static enum ProfileType {
XML, SQLITE
}
private String name;
private boolean defaultProfile;
private boolean activeProfile;
private ProfileType type;
private final StockpileIDs stockpileIDs;
private final List esiOwners = new ArrayList<>();
public Profile() {
this("Default", true, true, ProfileType.SQLITE);
}
public Profile(final String name, final boolean defaultProfile, final boolean activeProfile, final ProfileType type) {
this.name = name;
this.defaultProfile = defaultProfile;
this.activeProfile = activeProfile;
this.stockpileIDs = new StockpileIDs(name);
this.type = type;
}
public boolean load() {
clear(); //Clear the profile before loading
stockpileIDs.load(); //Load stockpileIDs
if (type == ProfileType.XML) {
return ProfileReader.load(this); //Assets (Must be loaded before the price data)
} else if (type == ProfileType.SQLITE) {
return ProfileDatabase.load(this);
} else {
return false;
}
}
public void saveTable(Table table) {
if (type == ProfileType.XML) {
save(); //Full save
} else {
ProfileDatabase.save(this, table);
}
}
public void save() {
boolean save = ProfileDatabase.save(this);
if (save && type == ProfileType.XML) {
type = ProfileType.SQLITE; //Migrated to SQLite
File file = new File(getXmlFilename());
File backup = new File(getBackupXmlFilename());
file.renameTo(backup);
}
}
public boolean isDefaultProfile() {
return defaultProfile;
}
public boolean isActiveProfile() {
return activeProfile;
}
public void setActiveProfile(final boolean activeProfile) {
this.activeProfile = activeProfile;
}
public StockpileIDs getStockpileIDs() {
return stockpileIDs;
}
public List getEsiOwners() {
return esiOwners;
}
public void clear() {
esiOwners.clear();
}
public String getXmlFilename() {
return getFilenameExtension(XML);
}
public String getBackupXmlFilename() {
return getFilenameExtension(XML_BACKUP);
}
public String getSQLiteFilename() {
return getFilenameExtension(SQLITE);
}
public String getBackupSQLiteFilename() {
String filename = getName() + "_" + Program.PROGRAM_VERSION + "_dbbackup";
filename = filename.replace(" ", "_"); //Remove spaces
filename = filename + "." + SQLITE_BACKUP; //Add extension
if (defaultProfile) {
filename = "#" + filename; //Mark active profile
}
filename = FileUtil.getPathProfile(filename);
return filename;
}
private File getBackupFile() {
switch (type) {
case XML: return new File(getFilenameExtension(XML_BAC));
case SQLITE: return null;
default: return null;
}
}
private File getFile() {
switch (type) {
case XML: return new File(getFilenameExtension(XML));
case SQLITE: return new File(getFilenameExtension(SQLITE));
default: return null;
}
}
private String getFilenameExtension(String extension) {
String filename = getName();
filename = filename.replace(" ", "_"); //Remove spaces
filename = filename + "." + extension; //Add extension
if (defaultProfile) {
filename = "#" + filename; //Mark active profile
}
filename = FileUtil.getPathProfile(filename);
return filename;
}
public String getName() {
return name;
}
public void setDefaultProfile(final boolean defaultProfile) {
if (this.defaultProfile != defaultProfile) {
File from = getFile();
File backFrom = getBackupFile();
this.defaultProfile = defaultProfile;
File to = getFile();
File backTo = getBackupFile();
if (from != null && to != null && !from.equals(to) && !from.renameTo(to)) {
LOG.warn("Failed to rename profile: {}", getName());
}
if (backFrom != null && backTo != null && !backFrom.equals(backTo) && !backFrom.renameTo(backTo)) {
LOG.warn("Failed to rename profile backup: {}", getName());
}
}
}
public void setName(final String name) {
File from = getFile();
File backFrom = getBackupFile();
this.name = name;
File to = getFile();
File backTo = getBackupFile();
if (from != null && to != null && !from.equals(to) && !from.renameTo(to)) {
LOG.warn("Failed to rename profile: {}", getName());
}
if (backFrom != null && backTo != null && !backFrom.equals(backTo) && !backFrom.renameTo(backTo)) {
LOG.warn("Failed to rename profile backup: {}", getName());
}
stockpileIDs.renameTable(name);
}
public void delete() {
File file = getFile();
if (file != null && !file.delete()) {
LOG.warn("Failed to delete profile: {}", getName());
}
File backupFile = getBackupFile();
if (backupFile != null && !backupFile.delete()) {
LOG.warn("Failed to delete profile backup: {}", getName());
}
stockpileIDs.removeTable();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Profile other = (Profile) obj;
if (this.name == null && other.name == null) {
return true; //Both null
} else if (this.name == null || other.name == null) {
return false; //One null
} else {
return this.name.equalsIgnoreCase(other.name);
}
}
@Override
public int hashCode() {
int hash = 3;
hash = 97 * hash + (this.name != null ? this.name.toLowerCase().hashCode() : 0);
return hash;
}
@Override
public String toString() {
String temp = name;
if (defaultProfile) {
temp = temp + " (default)";
}
//if (activeProfile) temp = temp+" (active)";
return temp;
}
@Override
public int compareTo(final Profile o) {
return this.getName().compareToIgnoreCase(o.getName());
}
}
================================================
FILE: src/main/java/net/nikr/eve/jeveasset/data/profile/ProfileData.java
================================================
/*
* Copyright 2009-2026 Contributors (see credits.txt)
*
* This file is part of jEveAssets.
*
* jEveAssets 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 2
* of the License, or (at your option) any later version.
*
* jEveAssets 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 jEveAssets; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package net.nikr.eve.jeveasset.data.profile;
import ca.odell.glazedlists.EventList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import net.nikr.eve.jeveasset.Program;
import net.nikr.eve.jeveasset.SplashUpdater;
import net.nikr.eve.jeveasset.data.api.accounts.OwnerType;
import net.nikr.eve.jeveasset.data.api.my.MyAccountBalance;
import net.nikr.eve.jeveasset.data.api.my.MyAsset;
import net.nikr.eve.jeveasset.data.api.my.MyBlueprint;
import net.nikr.eve.jeveasset.data.api.my.MyContract;
import net.nikr.eve.jeveasset.data.api.my.MyContractItem;
import net.nikr.eve.jeveasset.data.api.my.MyExtraction;
import net.nikr.eve.jeveasset.data.api.my.MyIndustryJob;
import net.nikr.eve.jeveasset.data.api.my.MyJournal;
import net.nikr.eve.jeveasset.data.api.my.MyLoyaltyPoints;
import net.nikr.eve.jeveasset.data.api.my.MyMarketOrder;
import net.nikr.eve.jeveasset.data.api.my.MyMining;
import net.nikr.eve.jeveasset.data.api.my.MyNpcStanding;
import net.nikr.eve.jeveasset.data.api.my.MySkill;
import net.nikr.eve.jeveasset.data.api.my.MyTransaction;
import net.nikr.eve.jeveasset.data.api.raw.RawAsset;
import net.nikr.eve.jeveasset.data.api.raw.RawBlueprint;
import net.nikr.eve.jeveasset.data.api.raw.RawClone;
import net.nikr.eve.jeveasset.data.api.raw.RawIndustryJob.IndustryJobStatus;
import net.nikr.eve.jeveasset.data.api.raw.RawJournalRefType;
import net.nikr.eve.jeveasset.data.api.raw.RawMarketOrder.Change;
import net.nikr.eve.jeveasset.data.sde.IndustryMaterial;
import net.nikr.eve.jeveasset.data.sde.Item;
import net.nikr.eve.jeveasset.data.sde.MyLocation;
import net.nikr.eve.jeveasset.data.sde.ReprocessedMaterial;
import net.nikr.eve.jeveasset.data.sde.RouteFinder;
import net.nikr.eve.jeveasset.data.sde.StaticData;
import net.nikr.eve.jeveasset.data.settings.AddedData;
import net.nikr.eve.jeveasset.data.settings.MarketPriceData;
import net.nikr.eve.jeveasset.data.settings.Settings;
import net.nikr.eve.jeveasset.data.settings.tag.Tags;
import net.nikr.eve.jeveasset.data.settings.types.EditableLocationType;
import net.nikr.eve.jeveasset.data.settings.types.EditablePriceType;
import net.nikr.eve.jeveasset.data.settings.types.ItemType;
import net.nikr.eve.jeveasset.data.settings.types.LastTransactionType;
import net.nikr.eve.jeveasset.data.settings.types.LocationsType;
import net.nikr.eve.jeveasset.gui.dialogs.settings.SoundsSettingsPanel.SoundOption;
import net.nikr.eve.jeveasset.gui.shared.StringComparators;
import net.nikr.eve.jeveasset.gui.shared.table.EventListManager;
import net.nikr.eve.jeveasset.gui.shared.table.containers.Percent;
import net.nikr.eve.jeveasset.gui.sounds.SoundPlayer;
import net.nikr.eve.jeveasset.gui.tabs.loyalty.TotalLoyaltyPoints;
import net.nikr.eve.jeveasset.gui.tabs.orders.OutbidProcesser.OutbidProcesserOutput;
import net.nikr.eve.jeveasset.gui.tabs.stockpile.Stockpile;
import net.nikr.eve.jeveasset.gui.tabs.stockpile.Stockpile.StockpileItem;
import net.nikr.eve.jeveasset.i18n.General;
import net.nikr.eve.jeveasset.io.shared.ApiIdConverter;
import net.nikr.eve.jeveasset.io.shared.DataConverter;
public class ProfileData {
private final ProfileManager profileManager;
private final EventList contractItemEventList = EventListManager.create();
private final EventList industryJobsEventList = EventListManager.create();
private final EventList marketOrdersEventList = EventListManager.create();
private final EventList journalEventList = EventListManager.create();
private final EventList transactionsEventList = EventListManager.create();
private final EventList assetsEventList = EventListManager.create();
private final EventList accountBalanceEventList = EventListManager.create();
private final EventList contractEventList = EventListManager.create();
private final EventList skillsEventList = EventListManager.create();
private final EventList loyaltyPointsEventList = EventListManager.create();
private final EventList npcStandingsEventList = EventListManager.create();
private final EventList miningEventList = EventListManager.create();
private final EventList extractionsEventList = EventListManager.create();
private final List contractItemList = new ArrayList<>();
private final List industryJobsList = new ArrayList<>();
private final List marketOrdersList = new ArrayList<>();
private final List journalList = new ArrayList<>();
private final List transactionsList = new ArrayList<>();
private final List assetsList = new ArrayList<>();
private final Map> clonesList = new HashMap<>();
private final List accountBalanceList = new ArrayList<>();
private final List contractList = new ArrayList<>();
private final Map skillPointsTotal = new HashMap<>();
private Map> uniqueAssetsDuplicates = null; //TypeID : int
private Map transactionSellPriceData; //TypeID : int
private Map transactionBuyPriceData; //TypeID : int
private Map transactionBuyTax; //TypeID : int
private Map transactionSellTax; //TransactionID : long
private Map marketOrdersBrokersFee; //OrderID : long
private final List ownerNames = new ArrayList<>();
private final Map owners = new HashMap<>();
private Set staticTypeIDs = null;
public ProfileData(ProfileManager profileManager) {
this.profileManager = profileManager;
RouteFinder.load();
SplashUpdater.setSubProgress(100);
}
public Set getPriceTypeIDs() {
return createPriceTypeIDs(); //always needs to be fresh :)
}
public EventList getAccountBalanceEventList() {
return accountBalanceEventList;
}
public EventList getAssetsEventList() {
return assetsEventList;
}
public EventList getIndustryJobsEventList() {
return industryJobsEventList;
}
public EventList getMarketOrdersEventList() {
return marketOrdersEventList;
}
public EventList getJournalEventList() {
return journalEventList;
}
public EventList getTransactionsEventList() {
return transactionsEventList;
}
public EventList getContractEventList() {
return contractEventList;
}
public EventList getContractItemEventList() {
return contractItemEventList;
}
public EventList getSkillsEventList() {
return skillsEventList;
}
public EventList