1. Project

1.1. Building

The Codion framework is built with Gradle and includes the Gradle Wrapper with a toolchain defined, so assuming you have cloned the repository and worked your way into the project directory you can build the framework by running the following command.

gradlew build
Note
This may take a few minutes, depending on the machine.

To install the Codion framework into your local Maven repository run the following command.

gradlew publishToMavenLocal

1.2. Running the demos

Note
The demos use an embedded in-memory database, so changes to data do not persist.

1.2.1. Local database connection

You can start by running a client from one of the demo projects (employees, chinook, petstore or world) with a local database connection.

gradlew codion-demos-chinook:runClientLocal

1.2.2. Remote database connection

In order to run a client with a remote or http connection the remote server must be started first.

gradlew codion-framework-server:runServer

To run a demo client with a remote connection use the following command.

gradlew codion-demos-chinook:runClientRMI

You can run the Server Monitor application to see how the server is behaving, with the following command.

gradlew codion-swing-framework-server-monitor:runServerMonitor
Note
The client handles server restarts gracefully, you can try shutting down the server via the Server Monitor, play around in the client until you get a 'Connection refused' exception. After you restart the server the client simply reconnects and behaves as if nothing happened.

1.3. Code style

After having wrestled with many code formatters and never being fully satisfied with the result, I’ve wound up relying on IntelliJ for code formatting. The project has a defined code style which can be found in the .idea/codeStyles folder.

1.4. Code quality

2. Architecture

The Codion framework is based on a three tiered architecture.

  • Database layer

  • Model layer

  • UI layer

2.1. Database layer

The EntityConnection class defines the database layer. See Manual:EntityConnection

2.2. Model layer

The EntityModel class defines the model layer. See Manual:EntityModel.

2.3. UI layer

The EntityPanel class defines the UI layer. See Manual:EntityPanel.

3. Client

3.1. Features

  • Lightweight client with a simple synchronous event model

  • Provides a practically mouse free user experience

  • Graceful handling of network outages and server restarts

  • Clear separation between model and UI

  • Easy to use load testing harness provided for application models

  • UI data bindings for most common components provided by the framework

  • Implementing data bindings for new components is made simple with building blocks provided by the framework.

  • The default UI layout is a simple and intuitive “waterfall” master-detail view

  • Extensive searching and filtering capabilities

  • Flexible keyboard-centric UI based on tab and split panes, detachable panels and toolbars

  • Detailed logging of client actions

3.2. Default client layout

The default master/detail panel layout.

Client UI

3.3. Architecture

3.3.1. UI

ui architecture

3.3.2. Model

model architecture

3.3.3. Assembly

EntityModel
  /**
   * Creates a SwingEntityModel based on the {@link Artist#TYPE} entity
   * with a detail model based on {@link Album#TYPE}
   * @param connectionProvider the connection provider
   */
  static SwingEntityModel artistModel(EntityConnectionProvider connectionProvider) {
    // create a default edit model
    SwingEntityEditModel artistEditModel =
            new SwingEntityEditModel(Artist.TYPE, connectionProvider);

    // create a default table model, wrapping the edit model
    SwingEntityTableModel artistTableModel =
            new SwingEntityTableModel(artistEditModel);

    // create a default model wrapping the table model
    SwingEntityModel artistModel =
            new SwingEntityModel(artistTableModel);

    // Note that this does the same as the above, that is, creates
    // a SwingEntityModel with a default edit and table model
    SwingEntityModel albumModel =
            new SwingEntityModel(Album.TYPE, connectionProvider);

    artistModel.addDetailModel(albumModel);

    return artistModel;
  }
EntityPanel
  /**
   * Creates a EntityPanel based on the {@link Artist#TYPE} entity
   * with a detail panel based on {@link Album#TYPE}
   * @param connectionProvider the connection provider
   */
  static EntityPanel artistPanel(EntityConnectionProvider connectionProvider) {
    // create the EntityModel to base the panel on (calling the above method)
    SwingEntityModel artistModel = artistModel(connectionProvider);

    // the edit model
    SwingEntityEditModel artistEditModel = artistModel.editModel();

    // the table model
    SwingEntityTableModel artistTableModel = artistModel.tableModel();

    // the album detail model
    SwingEntityModel albumModel = artistModel.detailModel(Album.TYPE);

    // create a EntityEditPanel instance, based on the artist edit model
    EntityEditPanel artistEditPanel = new EntityEditPanel(artistEditModel) {
      @Override
      protected void initializeUI() {
        createTextField(Artist.NAME).columns(15);
        addInputPanel(Artist.NAME);
      }
    };
    // create a EntityTablePanel instance, based on the artist table model
    EntityTablePanel artistTablePanel = new EntityTablePanel(artistTableModel);

    // create a EntityPanel instance, based on the artist model and
    // the edit and table panels from above
    EntityPanel artistPanel = new EntityPanel(artistModel, artistEditPanel, artistTablePanel);

    // create a new EntityPanel, without an edit panel and
    // with a default EntityTablePanel
    EntityPanel albumPanel = new EntityPanel(albumModel);

    artistPanel.addDetailPanel(albumPanel);

    return artistPanel;
  }

3.3.4. Full Example

Show code
package is.codion.framework.demos.chinook.tutorial;

import is.codion.common.db.database.Database;
import is.codion.common.user.User;
import is.codion.framework.db.EntityConnectionProvider;
import is.codion.framework.db.local.LocalEntityConnectionProvider;
import is.codion.framework.demos.chinook.domain.Chinook.Album;
import is.codion.framework.demos.chinook.domain.Chinook.Artist;
import is.codion.framework.demos.chinook.domain.impl.ChinookImpl;
import is.codion.swing.framework.model.SwingEntityEditModel;
import is.codion.swing.framework.model.SwingEntityModel;
import is.codion.swing.framework.model.SwingEntityTableModel;
import is.codion.swing.framework.ui.EntityEditPanel;
import is.codion.swing.framework.ui.EntityPanel;
import is.codion.swing.framework.ui.EntityTablePanel;

/**
 * When running this make sure the chinook demo module directory is the
 * working directory, due to a relative path to a db init script
 */
public final class ClientArchitecture {

  // tag::entityModel[]

  /**
   * Creates a SwingEntityModel based on the {@link Artist#TYPE} entity
   * with a detail model based on {@link Album#TYPE}
   * @param connectionProvider the connection provider
   */
  static SwingEntityModel artistModel(EntityConnectionProvider connectionProvider) {
    // create a default edit model
    SwingEntityEditModel artistEditModel =
            new SwingEntityEditModel(Artist.TYPE, connectionProvider);

    // create a default table model, wrapping the edit model
    SwingEntityTableModel artistTableModel =
            new SwingEntityTableModel(artistEditModel);

    // create a default model wrapping the table model
    SwingEntityModel artistModel =
            new SwingEntityModel(artistTableModel);

    // Note that this does the same as the above, that is, creates
    // a SwingEntityModel with a default edit and table model
    SwingEntityModel albumModel =
            new SwingEntityModel(Album.TYPE, connectionProvider);

    artistModel.addDetailModel(albumModel);

    return artistModel;
  }
  // end::entityModel[]
  // tag::entityPanel[]

  /**
   * Creates a EntityPanel based on the {@link Artist#TYPE} entity
   * with a detail panel based on {@link Album#TYPE}
   * @param connectionProvider the connection provider
   */
  static EntityPanel artistPanel(EntityConnectionProvider connectionProvider) {
    // create the EntityModel to base the panel on (calling the above method)
    SwingEntityModel artistModel = artistModel(connectionProvider);

    // the edit model
    SwingEntityEditModel artistEditModel = artistModel.editModel();

    // the table model
    SwingEntityTableModel artistTableModel = artistModel.tableModel();

    // the album detail model
    SwingEntityModel albumModel = artistModel.detailModel(Album.TYPE);

    // create a EntityEditPanel instance, based on the artist edit model
    EntityEditPanel artistEditPanel = new EntityEditPanel(artistEditModel) {
      @Override
      protected void initializeUI() {
        createTextField(Artist.NAME).columns(15);
        addInputPanel(Artist.NAME);
      }
    };
    // create a EntityTablePanel instance, based on the artist table model
    EntityTablePanel artistTablePanel = new EntityTablePanel(artistTableModel);

    // create a EntityPanel instance, based on the artist model and
    // the edit and table panels from above
    EntityPanel artistPanel = new EntityPanel(artistModel, artistEditPanel, artistTablePanel);

    // create a new EntityPanel, without an edit panel and
    // with a default EntityTablePanel
    EntityPanel albumPanel = new EntityPanel(albumModel);

    artistPanel.addDetailPanel(albumPanel);

    return artistPanel;
  }
  // end::entityPanel[]

  public static void main(String[] args) {
    // Configure the database
    Database.DATABASE_URL.set("jdbc:h2:mem:h2db");
    Database.DATABASE_INIT_SCRIPTS.set("src/main/sql/create_schema.sql");

    // initialize a connection provider, this class is responsible
    // for supplying a valid connection or throwing an exception
    // in case a connection can not be established
    EntityConnectionProvider connectionProvider =
            LocalEntityConnectionProvider.builder()
                    .domain(new ChinookImpl())
                    .user(User.parse("scott:tiger"))
                    .build();

    EntityPanel artistPanel = artistPanel(connectionProvider);

    // lazy initialization
    artistPanel.initialize();

    // fetch data from the database
    artistPanel.model().tableModel().refresh();

    // uncomment the below line to display the panel
//    displayInDialog(null, artistPanel, "Artists");

    connectionProvider.close();
  }
}

3.4. Configuration

3.4.1. Example configuration file

codion.client.connectionType=local
codion.db.url=jdbc:h2:mem:h2db
codion.db.initScripts=classpath:create_schema.sql

3.5. Usage

4. Server

The Codion server provides RMI and HTTP connection options to clients.

4.1. Features

  • Firewall friendly RMI; uses one way communications without callbacks and can be configured to serve on a single fixed port

  • Integrated web server for serving HTTP client connections, based on Javalin and Jetty

  • All user authentication left to the database by default

  • Comprehensive administration and monitoring facilities via the ServerMonitor

  • Featherweight server with moderate memory and CPU usage

4.2. Security

Here’s a great overview of RMI security risks and mitigations.

4.2.1. Authentication

The Codion server does not perform any user authentication by default, it leaves that up the underlying database. An authentication layer can be added by implementing a Authenticator and registering it with the ServiceLoader.

Authenticator examples

4.2.2. RMI SSL encryption

To enable SSL encryption between client and server, create a keystore and truststore pair and set the following system properties.

Server side
codion.server.connection.sslEnabled=true # (1)
javax.net.ssl.keyStore=keystore.jks
javax.net.ssl.keyStorePassword=password
  1. This property is 'true' by default, included here for completeness' sake

Client side
codion.client.trustStore=truststore.jks
codion.client.trustStorePassword=password

4.2.3. Class loading

No dynamic class loading is required.

4.2.4. Serialization filtering

The framework provides a way to configure a ObjectInputFilter for deserialization, by specifying a ObjectInputFilterFactory implementation class with the following system property.

codion.server.objectInputFilterFactoryClassName=\
    my.serialization.filter.MyObjectInputFilterFactory
Serialization whitelist

To use the serialization whitelist filter provided by the framework, set the following system property.

codion.server.objectInputFilterFactoryClassName=\
    is.codion.common.rmi.server.WhitelistInputFilterFactory

The whitelist is configured via the following system property.

codion.server.serializationFilterWhitelist=config/whitelist.txt
codion.server.serializationFilterWhitelist=classpath:whitelist.txt

A whitelist can be created during a server dry-run by adding the following system property. The whitelist containing all classes deserialized during the run is written to disk on server shutdown.

codion.server.serializationFilterDryRun=true
Example whitelist
ch.qos.logback.classic.Level
com.sun.proxy.$Proxy*
java.lang.Boolean
java.lang.Character
java.lang.Double
java.lang.Enum
java.lang.Float
java.lang.Integer
java.lang.Long
java.lang.Number
java.lang.Object
java.lang.String
java.lang.reflect.Proxy
java.math.BigDecimal
java.math.BigInteger
java.time.LocalDate
java.time.LocalDateTime
java.time.LocalTime
java.time.Ser
java.time.ZoneId
java.time.ZoneRegion
java.util.ArrayList
java.util.Arrays$ArrayList
java.util.Collections$EmptyList
java.util.Collections$EmptyMap
java.util.Collections$SingletonList
java.util.Collections$SingletonMap
java.util.Collections$SingletonSet
java.util.Collections$UnmodifiableCollection
java.util.Collections$UnmodifiableList
java.util.Collections$UnmodifiableMap
java.util.Collections$UnmodifiableSet
java.util.Collections$UnmodifiableRandomAccessList
java.util.Date
java.util.HashMap
java.util.HashSet
java.util.LinkedHashMap
java.util.LinkedHashSet
java.util.Locale
java.util.Map$Entry
java.util.UUID
net.sf.jasperreports.compilers.ConstantExpressionEvaluation
net.sf.jasperreports.compilers.FieldEvaluation
net.sf.jasperreports.compilers.ReportExpressionEvaluationData
net.sf.jasperreports.engine.JRPropertiesMap
net.sf.jasperreports.engine.JasperReport
net.sf.jasperreports.engine.JRBand
net.sf.jasperreports.engine.JRExpressionChunk
net.sf.jasperreports.engine.JRField
net.sf.jasperreports.engine.JRParameter
net.sf.jasperreports.engine.JRQueryChunk
net.sf.jasperreports.engine.JRVariable
net.sf.jasperreports.engine.base.JRBaseBand
net.sf.jasperreports.engine.base.JRBaseBoxBottomPen
net.sf.jasperreports.engine.base.JRBaseBoxLeftPen
net.sf.jasperreports.engine.base.JRBaseBoxPen
net.sf.jasperreports.engine.base.JRBaseBoxRightPen
net.sf.jasperreports.engine.base.JRBaseBoxTopPen
net.sf.jasperreports.engine.base.JRBaseDataset
net.sf.jasperreports.engine.base.JRBaseElement
net.sf.jasperreports.engine.base.JRBaseElementGroup
net.sf.jasperreports.engine.base.JRBaseExpression
net.sf.jasperreports.engine.base.JRBaseExpressionChunk
net.sf.jasperreports.engine.base.JRBaseField
net.sf.jasperreports.engine.base.JRBaseLineBox
net.sf.jasperreports.engine.base.JRBaseParagraph
net.sf.jasperreports.engine.base.JRBaseParameter
net.sf.jasperreports.engine.base.JRBasePen
net.sf.jasperreports.engine.base.JRBaseQuery
net.sf.jasperreports.engine.base.JRBaseQueryChunk
net.sf.jasperreports.engine.base.JRBaseReport
net.sf.jasperreports.engine.base.JRBaseSection
net.sf.jasperreports.engine.base.JRBaseStaticText
net.sf.jasperreports.engine.base.JRBaseTextElement
net.sf.jasperreports.engine.base.JRBaseTextField
net.sf.jasperreports.engine.base.JRBaseVariable
net.sf.jasperreports.engine.design.JRReportCompileData
net.sf.jasperreports.engine.type.CalculationEnum
net.sf.jasperreports.engine.type.EvaluationTimeEnum
net.sf.jasperreports.engine.type.HorizontalTextAlignEnum
net.sf.jasperreports.engine.type.IncrementTypeEnum
net.sf.jasperreports.engine.type.OrientationEnum
net.sf.jasperreports.engine.type.PositionTypeEnum
net.sf.jasperreports.engine.type.PrintOrderEnum
net.sf.jasperreports.engine.type.ResetTypeEnum
net.sf.jasperreports.engine.type.RunDirectionEnum
net.sf.jasperreports.engine.type.SectionTypeEnum
net.sf.jasperreports.engine.type.SplitTypeEnum
net.sf.jasperreports.engine.type.StretchTypeEnum
net.sf.jasperreports.engine.type.TextAdjustEnum
net.sf.jasperreports.engine.type.WhenResourceMissingTypeEnum
is.codion.common.Conjunction
is.codion.common.Operator
is.codion.common.db.operation.DefaultFunctionType
is.codion.common.db.operation.DefaultProcedureType
is.codion.common.db.report.AbstractReport
is.codion.common.db.report.DefaultReportType
is.codion.common.rmi.client.DefaultConnectionRequest
is.codion.common.user.DefaultUser
is.codion.common.version.DefaultVersion
is.codion.framework.db.DefaultSelect
is.codion.framework.db.DefaultUpdate
is.codion.framework.domain.DefaultDomainType
is.codion.framework.domain.entity.attribute.DefaultAttribute
is.codion.framework.domain.entity.attribute.DefaultAttribute$DefaultType
is.codion.framework.domain.entity.attribute.DefaultColumn
is.codion.framework.domain.entity.attribute.DefaultForeignKey
is.codion.framework.domain.entity.attribute.DefaultForeignKey$DefaultReference
is.codion.framework.domain.entity.condition.AbstractCondition
is.codion.framework.domain.entity.condition.AbstractColumnCondition
is.codion.framework.domain.entity.condition.DefaultAllCondition
is.codion.framework.domain.entity.condition.DefaultConditionCombination
is.codion.framework.domain.entity.condition.DefaultCustomCondition
is.codion.framework.domain.entity.condition.AbstractColumnCondition
is.codion.framework.domain.entity.condition.DualValueColumnCondition
is.codion.framework.domain.entity.condition.MultiValueColumnCondition
is.codion.framework.domain.entity.condition.SingleValueColumnCondition
is.codion.framework.domain.entity.condition.DefaultConditionType
is.codion.framework.domain.entity.DefaultEntity
is.codion.framework.domain.entity.DefaultEntity$EntityInvoker
is.codion.framework.domain.entity.DefaultEntityType
is.codion.framework.domain.entity.DefaultForeignKey
is.codion.framework.domain.entity.DefaultForeignKey$DefaultReference
is.codion.framework.domain.entity.DefaultKey
is.codion.framework.domain.entity.DefaultOrderBy
is.codion.framework.domain.entity.DefaultOrderBy$DefaultOrderByColumn
is.codion.framework.domain.entity.Entity
is.codion.framework.domain.entity.ImmutableEntity
is.codion.framework.domain.entity.OrderBy$NullOrder
is.codion.framework.demos.chinook.domain.Chinook
is.codion.framework.demos.chinook.domain.Chinook$Invoice
is.codion.framework.demos.chinook.domain.Chinook$Playlist$RandomPlaylistParameters
is.codion.framework.demos.chinook.domain.Chinook$Track
is.codion.framework.demos.chinook.domain.Chinook$Track$RaisePriceParameters
is.codion.framework.demos.employees.domain.*
is.codion.framework.demos.world.domain.api.*
is.codion.framework.demos.petclinic.domain.*
is.codion.plugin.jasperreports.DefaultJRReportType

4.3. Configuration

4.3.1. Example configuration file

# Database configuration
codion.db.url=jdbc:h2:mem:h2db
codion.db.useOptimisticLocking=true
codion.db.countQueries=true
codion.db.initScripts=\
    ../config/employees/create_schema.sql,\
    ../config/chinook/create_schema.sql,\
    ../config/petstore/create_schema.sql,\
    ../config/world/create_schema.sql

# The admin user credentials, used by the server monitor application
codion.server.admin.user=scott:tiger

# Client logging disabled by default
codion.server.clientLogging=false

# A connection pool based on this user is created on startup
codion.server.connectionPoolUsers=scott:tiger

# The port used by clients
codion.server.port=2222

# The port for the admin interface, used by the server monitor
codion.server.admin.port=4444

# RMI Registry port
codion.server.registryPort=1099

# Any auxiliary servers to run alongside this server
codion.server.auxiliaryServerFactoryClassNames=\
    is.codion.framework.servlet.EntityServletServerFactory

# The http port
codion.server.http.port=8080

# Specifies whether or not to use https
codion.server.http.secure=false

# The ObjectInputFilterFactory class to use
codion.server.objectInputFilterFactoryClassName=\
    is.codion.common.rmi.server.WhitelistInputFilterFactory

# The serialization whitelist to use for RMI deserialization
codion.server.serializationFilterWhitelist=\
    ../config/serialization-whitelist.txt

# RMI configuration
java.rmi.server.hostname=localhost
java.rmi.server.randomIDs=true

# SSL configuration
javax.net.ssl.keyStore=../config/keystore.jks
javax.net.ssl.keyStorePassword=crappypass

# Used to connect to the server to shut it down
#codion.client.trustStore=../config/truststore.jks

4.4. Code examples

Absolute bare-bones examples of how to run the EntityServer and connect to it.

4.4.1. RMI

    Database database = H2DatabaseFactory
            .createDatabase("jdbc:h2:mem:testdb",
                    "src/main/sql/create_schema.sql");

    EntityServerConfiguration configuration = EntityServerConfiguration.builder(SERVER_PORT, REGISTRY_PORT)
            .domainClassNames(List.of(Store.class.getName()))
            .database(database)
            .sslEnabled(false)
            .build();

    EntityServer server = EntityServer.startServer(configuration);

    RemoteEntityConnectionProvider connectionProvider =
            RemoteEntityConnectionProvider.builder()
                    .port(SERVER_PORT)
                    .registryPort(REGISTRY_PORT)
                    .domainType(Store.DOMAIN)
                    .user(parse("scott:tiger"))
                    .clientTypeId("ClientServer")
                    .build();

    EntityConnection connection = connectionProvider.connection();

    List<Entity> customers = connection.select(all(Customer.TYPE));
    customers.forEach(System.out::println);

    connection.close();

    server.shutdown();

4.4.2. HTTP

    Database database = H2DatabaseFactory
            .createDatabase("jdbc:h2:mem:testdb",
                    "src/main/sql/create_schema.sql");

    EntityService.HTTP_SERVER_PORT.set(HTTP_PORT);

    EntityServerConfiguration configuration = EntityServerConfiguration.builder(SERVER_PORT, REGISTRY_PORT)
            .domainClassNames(List.of(Store.class.getName()))
            .database(database)
            .sslEnabled(false)
            .auxiliaryServerFactoryClassNames(List.of(EntityServiceFactory.class.getName()))
            .build();

    EntityServer server = EntityServer.startServer(configuration);

    HttpEntityConnectionProvider connectionProvider =
            HttpEntityConnectionProvider.builder()
                    .port(HTTP_PORT)
                    .https(false)
                    .domainType(Store.DOMAIN)
                    .user(parse("scott:tiger"))
                    .clientTypeId("ClientServer")
                    .build();

    EntityConnection connection = connectionProvider.connection();

    List<Entity> customers = connection.select(all(Customer.TYPE));
    customers.forEach(System.out::println);

    connection.close();

    server.shutdown();

5. Server Monitor

The Codion Server Monitor provides a way to monitor the Codion server.

Below are screenshots of the different server monitor tabs, after ~1 1/2 hours of running the Chinook load test, with ~10 minutes of ramping up to 100 client instances. The server is running on a Raspberry Pi 4, Ubuntu Server 20.10, JDK 19, -Xmx256m, using a HikariCP connection pool on top of an H2 in-memory database.

5.1. Server performance

Server performance

5.2. Connection pools

Connection pool

5.3. Database performance

Database performance

5.4. Clients & users

Clients users

5.5. Environment

5.5.1. System

System

5.5.2. Entities

Domain

5.5.3. Operations

Domain

6. Code style and design

6.1. Factories and builders

Most concrete framework classes, which implement a public interface, are final, package private, and are instantiated with the help of static methods in the interface they implement.

6.1.1. Factories

Static factory methods are provided for classes with a simple state. These are usually named after the interface, which makes using static imports quite convenient.

Event<String> event = event(); // Event.event()

Value<Integer> value = Value.value();

State state = State.state(true);

EntityConditionModel conditionModel =
        EntityConditionModel.entityConditionModel(Customer.TYPE, connectionProvider);

6.1.2. Builders

For classes with a more complex state, a builder method is provided in the interface.

TaskScheduler scheduler =
        TaskScheduler.builder(() -> {})
                .interval(5, TimeUnit.SECONDS)
                .initialDelay(15)
                .build();

TemporalField<LocalDate> field =
        TemporalField.builder(LocalDate.class)
                .dateTimePattern("dd.MM.yyyy")
                .columns(12)
                .border(createTitledBorder("Date"))
                .build();

6.2. Accessors

Immutable fields are accessed using methods named after the field, without a get/is prefix.

Observer<String> observer = event.observer();

LocalEntityConnection connection = connectionProvider.connection();

boolean modified = entity.modified();

Entity.Key primaryKey = entity.primaryKey();

A get/is prefix implies that the field is mutable and that a corresponding setter method exists, with a set prefix.

boolean optimisticLocking = connection.isOptimisticLocking();

connection.setOptimisticLocking(false);

6.2.1. Observables

Many classes expose their internal state via the Mutable or Value classes, which can be used to mutate the associated state or observe it by adding listeners or consumers.

TableSelection<List<String>> selection = tableModel.selection();

List<Integer> selectedIndexes = selection.indexes().get();

selection.indexes().set(asList(0, 1, 2));

selection.items().addListener(() -> System.out.println("Selected items changed"));

table.sortingEnabled().set(false);

6.3. Exceptions

There are of course some exceptions to these rules, such as a get prefix on an accessor for a functionally immutable field or a is prefix on an immutable boolean field, but these exceptions are usually to keep the style of a class being extended, such as Swing components and should be few and far between.

7. Modules

7.1. Common

Common classes used throughout the framework.

codion-common-core

Dependency graph
dependency graph

codion-common-db

JDBC related classes.

Dependency graph
dependency graph

codion-common-model

Common model classes.

Dependency graph
dependency graph

codion-common-i18n

Dependency graph
dependency graph

codion-common-rmi

RMI related classes.

Dependency graph
dependency graph

7.2. DBMS

Database specific implementation classes.

codion-dbms-db2

Dependency graph
dependency graph

codion-dbms-derby

Dependency graph
dependency graph

codion-dbms-h2

Dependency graph
dependency graph

codion-dbms-hsqldb

Dependency graph
dependency graph

codion-dbms-mariadb

Dependency graph
dependency graph

codion-dbms-mysql

Dependency graph
dependency graph

codion-dbms-oracle

Dependency graph
dependency graph

codion-dbms-postgresql

Dependency graph
dependency graph

codion-dbms-sqlite

Dependency graph
dependency graph

codion-dbms-sqlserver

Dependency graph
dependency graph

7.3. Framework

The framework itself.

codion-framework-domain

Domain model related classes.

Dependency graph
dependency graph

codion-framework-domain-db

Domain model generation from a database schema.

Dependency graph
dependency graph

codion-framework-domain-test

Domain model unit test related classes.

Dependency graph
dependency graph

codion-framework-db-core

Core database connection related classes.

Dependency graph
dependency graph

codion-framework-db-local

Local JDBC connection related classes.

Dependency graph
dependency graph

codion-framework-db-rmi

RMI connection related classes.

Dependency graph
dependency graph

codion-framework-db-http

HTTP connection related classes.

Dependency graph
dependency graph

codion-framework-i18n

Internationalization strings.

Dependency graph
dependency graph

codion-framework-json-domain

Dependency graph
dependency graph

codion-framework-json-db

Dependency graph
dependency graph

codion-framework-model

Common framework model classes.

Dependency graph
dependency graph

codion-framework-model-test

General application model unit test related classes.

Dependency graph
dependency graph

codion-framework-server

Framework server classes.

Dependency graph
dependency graph

codion-framework-servlet

HTTP servlet server classes.

Dependency graph
dependency graph

7.5. Tools

codion-tools-server-monitor-model

Dependency graph
dependency graph

codion-tools-server-monitor-ui

Dependency graph
dependency graph

7.5.1. Generator

codion-tools-generator-domain

Dependency graph
dependency graph

codion-tools-generator-model

Dependency graph
dependency graph

codion-tools-generator-ui

Dependency graph
dependency graph

7.5.2. Load Test

codion-tools-loadtest-core

Dependency graph
dependency graph

codion-tools-loadtest-model

Dependency graph
dependency graph

codion-tools-loadtest-ui

Dependency graph
dependency graph

7.6. Plugins

7.6.1. Logging

codion-plugin-jul-proxy
Dependency graph
dependency graph
codion-plugin-log4j-proxy
Dependency graph
dependency graph
codion-plugin-logback-proxy
Dependency graph
dependency graph

7.6.2. Connection pools

codion-plugin-hikari-pool
Dependency graph
dependency graph
codion-plugin-tomcat-pool
Dependency graph
dependency graph

7.6.3. Reporting

codion-plugin-jasperreports
Dependency graph
dependency graph

7.6.4. Other

codion-plugin-imagepanel
Dependency graph
dependency graph

8. Utilities

8.1. IntelliJ IDEA

8.1.1. Live templates

Here are a few live templates for IntelliJ, reducing the typing required when defining a domain model.

Add this file to the templates directory in the IntelliJ IDEA configuration directory.

View template file
<templateSet group="codion">
  <template name="cod" value="Column&lt;Double&gt; $ATTRIBUTE_NAME$ = TYPE.doubleColumn(&quot;$COLUMN_NAME$&quot;);$END$" description="Column&lt;Double&gt;" toReformat="false" toShortenFQNames="true">
    <variable name="COLUMN_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <variable name="ATTRIBUTE_NAME" expression="groovyScript(&quot;_1.toUpperCase()&quot;, COLUMN_NAME)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="coi" value="Column&lt;Integer&gt; $ATTRIBUTE_NAME$ = TYPE.integerColumn(&quot;$COLUMN_NAME$&quot;);$END$" description="Column&lt;Integer&gt;" toReformat="false" toShortenFQNames="true">
    <variable name="COLUMN_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <variable name="ATTRIBUTE_NAME" expression="groovyScript(&quot;_1.toUpperCase()&quot;, COLUMN_NAME)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="col" value="Column&lt;Long&gt; $ATTRIBUTE_NAME$ = TYPE.longColumn(&quot;$COLUMN_NAME$&quot;);$END$" description="Column&lt;Long&gt;" toReformat="false" toShortenFQNames="true">
    <variable name="COLUMN_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <variable name="ATTRIBUTE_NAME" expression="groovyScript(&quot;_1.toUpperCase()&quot;, COLUMN_NAME)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="cos" value="Column&lt;String&gt; $ATTRIBUTE_NAME$ = TYPE.stringColumn(&quot;$COLUMN_NAME$&quot;);$END$" description="Column&lt;String&gt;" toReformat="false" toShortenFQNames="true">
    <variable name="COLUMN_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <variable name="ATTRIBUTE_NAME" expression="groovyScript(&quot;_1.toUpperCase()&quot;, COLUMN_NAME)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="fk" value="ForeignKey $ATTRIBUTE_NAME$ = TYPE.foreignKey(&quot;$FK_NAME$&quot;, $END$);" description="ForeignKey" toReformat="false" toShortenFQNames="true">
    <variable name="FK_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <variable name="ATTRIBUTE_NAME" expression="groovyScript(&quot;_1.toUpperCase()&quot;, FK_NAME)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="cold" value="Column&lt;LocalDate&gt; $ATTRIBUTE_NAME$ = TYPE.localDateColumn(&quot;$COLUMN_NAME$&quot;);$END$" description="Column&lt;LocalDate&gt;" toReformat="false" toShortenFQNames="true">
    <variable name="COLUMN_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <variable name="ATTRIBUTE_NAME" expression="groovyScript(&quot;_1.toUpperCase()&quot;, COLUMN_NAME)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="coldt" value="Column&lt;LocalDateTime&gt; $ATTRIBUTE_NAME$ = TYPE.localDateTimeColumn(&quot;$COLUMN_NAME$&quot;);$END$" description="Column&lt;LocalDateTime&gt;" toReformat="false" toShortenFQNames="true">
    <variable name="COLUMN_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <variable name="ATTRIBUTE_NAME" expression="groovyScript(&quot;_1.toUpperCase()&quot;, COLUMN_NAME)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="et" value="EntityType TYPE = DOMAIN.entityType(&quot;$TABLE_NAME$&quot;);$END$" description="EntityType" toReformat="false" toShortenFQNames="true">
    <variable name="TABLE_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="cob" value="Column&lt;Boolean&gt; $ATTRIBUTE_NAME$ = TYPE.booleanColumn(&quot;$COLUMN_NAME$&quot;);$END$" description="Column&lt;Boolean&gt;" toReformat="false" toShortenFQNames="true">
    <variable name="COLUMN_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <variable name="ATTRIBUTE_NAME" expression="groovyScript(&quot;_1.toUpperCase()&quot;, COLUMN_NAME)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="cosh" value="Column&lt;Short&gt; $ATTRIBUTE_NAME$ = TYPE.shortColumn(&quot;$COLUMN_NAME$&quot;);$END$" description="Column&lt;Short&gt;" toReformat="false" toShortenFQNames="true">
    <variable name="COLUMN_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <variable name="ATTRIBUTE_NAME" expression="groovyScript(&quot;_1.toUpperCase()&quot;, COLUMN_NAME)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="coc" value="Column&lt;Character&gt; $ATTRIBUTE_NAME$ = TYPE.characterColumn(&quot;$COLUMN_NAME$&quot;);$END$" description="Column&lt;Character&gt;" toReformat="false" toShortenFQNames="true">
    <variable name="COLUMN_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <variable name="ATTRIBUTE_NAME" expression="groovyScript(&quot;_1.toUpperCase()&quot;, COLUMN_NAME)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="coodt" value="Column&lt;OffsetDateTime&gt; $ATTRIBUTE_NAME$ = TYPE.offsetDateTimeColumn(&quot;$COLUMN_NAME$&quot;);$END$" description="Column&lt;OffsetDateTime&gt;" toReformat="false" toShortenFQNames="true">
    <variable name="COLUMN_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <variable name="ATTRIBUTE_NAME" expression="groovyScript(&quot;_1.toUpperCase()&quot;, COLUMN_NAME)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="coby" value="Column&lt;byte[]&gt; $ATTRIBUTE_NAME$ = TYPE.byteArrayColumn(&quot;$COLUMN_NAME$&quot;);$END$" description="Column&lt;byte[]&gt;" toReformat="false" toShortenFQNames="true">
    <variable name="COLUMN_NAME" expression="" defaultValue="" alwaysStopAt="true" />
    <variable name="ATTRIBUTE_NAME" expression="groovyScript(&quot;_1.toUpperCase()&quot;, COLUMN_NAME)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
</templateSet>
Available templates

Name

Template

et

EntityType TYPE = DOMAIN.entityType("table_name");

fk

ForeignKey FK_KEY = TYPE.foreignKey("fk_key");

cosh

Column<Short> COLUMN = TYPE.shortColumn("column");

coi

Column<Integer> COLUMN = TYPE.integerColumn("column");

col

Column<Long> COLUMN = TYPE.longColumn("column");

cod

Column<Double> COLUMN = TYPE.doubleColumn("column");

cos

Column<String> COLUMN = TYPE.stringColumn("column");

cold

Column<LocalDate> COLUMN = TYPE.localDateColumn("column");

coldt

Column<LocalDateTime> COLUMN = TYPE.localDateTimeColumn("column");

coodt

Column<OffsetDateTime> COLUMN = TYPE.offsetDateTimeColumn("column");

cob

Column<Boolean> COLUMN = TYPE.booleanColumn("column");

coc

Column<Character> COLUMN = TYPE.characterColumn("column");

coby

Column<byte[]> COLUMN = TYPE.byteArrayColumn("column");

9. Internationalization (i18n)

9.1. Overriding

The default i18n strings can be overridden by implementing Resources and registering the implementation with the ServiceLoader.

package is.codion.framework.demos.chinook.domain.impl;

import is.codion.common.resource.Resources;
import is.codion.framework.i18n.FrameworkMessages;

import java.util.Locale;

/**
 * Replace the english insert caption/mnemonic Add/A with Insert/I.
 */
public final class ChinookResources implements Resources {

  private static final String FRAMEWORK_MESSAGES =
          FrameworkMessages.class.getName();

  private final boolean english = Locale.getDefault()
          .equals(new Locale("en", "EN"));

  @Override
  public String getString(String baseBundleName, String key, String defaultString) {
    if (english && baseBundleName.equals(FRAMEWORK_MESSAGES)) {
      return switch (key) {
        case "insert" -> "Insert";
        case "insert_mnemonic" -> "I";
        default -> defaultString;
      };
    }

    return defaultString;
  }
}
module is.codion.framework.demos.chinook {

  ...

  provides is.codion.common.resource.Resources
            with is.codion.framework.demos.chinook.domain.impl.ChinookResources;
}

9.2. Values

Overview of the available i18n properties files and their keys and values.

9.2.1. codion-common-core

is/codion/common/Operator.java
is/codion/common/Operator.properties
is/codion/common/Operator_is_IS.properties
key default is_IS

between

Between

Innan bils eða jafnt og

between_exclusive

Between (exclusive)

Innan bils

equal

Equal

Jafnt og

greater_than

Greater than

Stærra en

greater_than_or_equal

Greater than or equal

Stærra eða jafnt og

in

In

Í mengi

less_than

Less than

Minna en

less_than_or_equal

Less than or equal

Minna eða jafnt og

not_between

Not between

Utan bils eða jafnt og

not_between_exclusive

Not between (exclusive)

Utan bils

not_equal

Not equal

Ekki jafnt og

not_in

Not in

Ekki í mengi

9.2.2. codion-common-i18n

is/codion/common/i18n/Messages.java
is/codion/common/i18n/Messages.properties
is/codion/common/i18n/Messages_is_IS.properties
key default is_IS

cancel

Cancel

Hætta við

cancel_mnemonic

C

H

clear

Clear

Hreinsa

clear_mnemonic

C

R

clear_tip

Clear all fields

Hreinsa alla reiti

copy

Copy

Afrita

error

Error

Villa

find

Find

Finna

login

Login

Innskrá

no

No

Nei

ok

OK

Í lagi

ok_mnemonic

O

L

password

Password

Lykilorð

print

Print

Prenta

print_mnemonic

P

P

refresh

Refresh

Endurhlaða

refresh_mnemonic

R

E

refresh_tip

Refresh data

Endurhlaða gögnum

search

Search

Leita

username

Username

Notendanafn

yes

Yes

9.2.3. codion-common-model

is/codion/common/model/condition/ConditionModel$Wildcard.java
is/codion/common/model/condition/ConditionModel$Wildcard.properties
is/codion/common/model/condition/ConditionModel$Wildcard_is_IS.properties
key default is_IS

NONE

None

Ekkert

POSTFIX

Postfix

Að aftan

PREFIX

Prefix

Að framan

PREFIX_AND_POSTFIX

Prefix and postfix

Að framan og aftan

is/codion/common/model/summary/ColumnSummary.java
is/codion/common/model/summary/ColumnSummary.properties
is/codion/common/model/summary/ColumnSummary_is_IS.properties
key default is_IS

average

Average

Meðaltal

maximum

Maximum

Hæsta gildi

minimum

Minimum

Lægsta gildi

minimum_and_maximum

Min/max

Lægsta/hæsta

none

None

Ekkert

sum

Sum

Summa

9.2.4. codion-common-rmi

is/codion/common/rmi/server/exception/ConnectionNotAvailableException.java
is/codion/common/rmi/server/exception/ConnectionNotAvailableException.properties
is/codion/common/rmi/server/exception/ConnectionNotAvailableException_is_IS.properties
key default is_IS

connection_not_available

This server is not accepting more connections

Þessi þjónn tekur ekki við fleiri tengingum

9.2.5. codion-dbms-h2

is/codion/dbms/h2/H2Database.java
is/codion/dbms/h2/H2Database.properties
is/codion/dbms/h2/H2Database_is_IS.properties
key default is_IS

check_constraint_invalid

The value or values attempted to be entered in a field or fields violate a defined check constraint

Óleyfilegt gildi

child_record_error

This record is referenced by records in other tables, delete those first

Vísað er í þessa færslu úr öðrum töflum, eyddu þeim færslum fyrst

integrity_constraint_error

A foreign key value has no matching primary key value

Reynt var að vísa í færslu sem ekki er til

unique_key_error

This combination of values already exists

Þessi samsetning gilda er nú þegar til í töflunni

value_missing

Value missing

Gildi vantar

wrong_user_or_password

Wrong username or password

Rangt notendanafn eða lykilorð

9.2.6. codion-dbms-oracle

is/codion/dbms/oracle/OracleDatabase.java
is/codion/dbms/oracle/OracleDatabase.properties
is/codion/dbms/oracle/OracleDatabase_is_IS.properties
key default is_IS

check_constraint_error

The value or values attempted to be entered in a field or fields violate a defined check constraint

Óleyfilegt gildi

child_record_error

This record is referenced by records in other tables, delete those first

Vísað er í þessa færslu úr öðrum töflum, eyddu þeim færslum fyrst

integrity_constraint_error

A foreign key value has no matching primary key value

Reynt var að vísa í færslu sem ekki er til

login_credentials_error

Invalid username or password

Rangt notendanafn eða lykilorð

missing_privileges_error

You are not authorized to perform this action

Þig vantar réttindi til að framkvæma umbeðna aðgerð

null_value_error

An attempt was made to insert or update a required column to NULL

Ekki er hægt að vista færslu með tómum gildum, tiltaktu öll gildi fyrst

table_not_found_error

Table or view does not exist

Tafla eða view finnst ekki

unique_key_error

This combination of values already exists

Þessi samsetning gilda er nú þegar til í töflunni

user_cannot_connect

User does not have session privileges

Notandi hefur ekki réttindi til að tengjast

value_missing

Value missing

Gildi vantar

value_too_large_for_column_error

The value entered is larger than the maximum width defined for the column

Gildi er of stórt fyrir dálk

view_has_errors_error

View has errors

Villur eru í undirliggjandi sýn (view)

9.2.7. codion-dbms-postgresql

is/codion/dbms/postgresql/PostgreSQLDatabase.java
is/codion/dbms/postgresql/PostgreSQLDatabase.properties
is/codion/dbms/postgresql/PostgreSQLDatabase_is_IS.properties
key default is_IS

check_constraint_error

The value or values attempted to be entered in a field or fields violate a defined check constraint

Óleyfilegt gildi

foreign_key_violation

A foreign key value has no matching primary key value

Reynt var að vísa í færslu sem ekki er til

foreign_key_violation_delete

This record is referenced by records in other tables, delete those first

Vísað er í þessa færslu úr öðrum töflum, eyddu þeim færslum fyrst

missing_privileges_error

You are not authorized to perform this action

Þig vantar réttindi til að framkvæma umbeðna aðgerð

null_value_error

An attempt was made to insert or update a required column to NULL

Ekki er hægt að vista færslu með tómum gildum, tiltaktu öll gildi fyrst

unique_key_error

This combination of values already exists

Þessi samsetning gilda er nú þegar til í töflunni

value_missing

Value missing

Gildi vantar

value_too_large_for_column_error

The value entered is larger than the maximum defined for the column

Gildi er of stórt fyrir dálk

9.2.8. codion-framework-db-http

is/codion/framework/db/http/HttpEntityConnection.java
is/codion/framework/db/http/HttpEntityConnection.properties
is/codion/framework/db/http/HttpEntityConnection_is_IS.properties
key default is_IS

many_records_found

Many records found when one was expected

Margar færslur fundust þegar einungis var gert ráð fyrir einni

record_not_found

Record not found

Engin færsla fannst

9.2.9. codion-framework-db-local

is/codion/framework/db/local/LocalEntityConnection.java
is/codion/framework/db/local/LocalEntityConnection.properties
is/codion/framework/db/local/LocalEntityConnection_is_IS.properties
key default is_IS

has_been_deleted

has been deleted

hefur verið eytt

multiple_records_found

Multiple records found when one was expected

Margar færslur fundust þegar einungis var gert ráð fyrir einni

record_modified

This record has been modified

Þessari færslu hefur verið breytt

record_not_found

Record not found

Engin færsla fannst

9.2.10. codion-framework-domain

is/codion/framework/domain/entity/DefaultEntityValidator.java
is/codion/framework/domain/entity/DefaultEntityValidator.properties
is/codion/framework/domain/entity/DefaultEntityValidator_is_IS.properties
key default is_IS

invalid_item_value

Invalid value

Ógilt gildi

value_is_required

Value for ''{0}'' is required

Gildi fyrir ''{0}'' vantar

value_too_large

value must be equal to or less than

gildi verður að vera minna eða jafnt og

value_too_long

value exceeds allowed length

gildi má ekki vera lengra en

value_too_small

value must be equal to or greater than

gildi verður að vera stærra eða jafnt og

is/codion/framework/domain/entity/attribute/AbstractAttributeDefinition.java
is/codion/framework/domain/entity/attribute/AbstractAttributeDefinition.properties
is/codion/framework/domain/entity/attribute/AbstractAttributeDefinition_is_IS.properties
key default is_IS

invalid_item_suffix

INVALID

ÓGILT

9.2.11. codion-framework-i18n

is/codion/framework/i18n/FrameworkMessages.java
is/codion/framework/i18n/FrameworkMessages.properties
is/codion/framework/i18n/FrameworkMessages_is_IS.properties
key default is_IS

add

Add

Ný færsla

add_mnemonic

A

N

add_tip

Add a new record

Útbúa nýja færslu

confirm_delete

Delete {0, choice, 1#record|1<{0, number, integer} records}?

Eyða {0, choice, 1#færslu|1<{0, number, integer} færslum}?

confirm_exit

Are you sure you want to close the application?

Ertu viss um að þú viljir hætta?

confirm_exit_title

Exit?

Hætta?

confirm_insert

Insert record?

Vista færslu?

confirm_update

Update record?

Uppfæra færslu?

copy_table_with_header

Copy Table With Header

Afrita Töflu Með Dálkaheitum

delete

Delete

Eyða

delete_current_tip

Delete current record

Eyða færslu

delete_mnemonic

D

A

delete_selected_tip

Delete selected records

Eyða völdum færslum

dependencies

Dependencies

Tengdar Færslur

dependencies_tip

View records depending on the selected record

Skoða færslur sem byggja á völdu færslunni

edit

Edit

Breyta

edit_mnemonic

E

B

edit_selected_tip

Edit selected records

Breyta völdum færslum

exit

Exit

Hætta

exit_mnemonic

X

Æ

exit_tip

Exit the application

Hætta í forritinu

file

File

Skrá

file_mnemonic

F

K

filter_noun

Filter

Sýjun

filter_verb

Filter

Sýja

insert

Add

Vista

insert_mnemonic

A

V

insert_tip

Add a new record based on the given values

Vista nýja færslu byggða á innslegnum gildum

modified_warning

Unsaved modifications will be lost, continue?

Óvistaðar breytingar munu tapast, viltu halda áfram?

modified_warning_title

Unsaved modifications

Óvistaðar breytingar

no_search_results

Search did not return any results

Leit skilaði engum niðurstöðum

save

Save

Vista

save_mnemonic

S

V

search_mnemonic

S

T

search_noun

Search

Leit

search_verb

Search

Leita

select_input_field

Select input field

Veldu innsláttarreit

settings

Settings

Stillingar

support_tables

Support Tables

Stoðtöflur

support_tables_mnemonic

O

O

update

Update

Uppfæra

update_mnemonic

U

U

update_tip

Update the current record based on the given values

Uppfæra færslu út frá innslegnum gildum

view

View

Sýn

view_mnemonic

V

N

9.2.12. codion-plugin-imagepanel

is/codion/plugin/imagepanel/NavigableImagePanel.java
is/codion/plugin/imagepanel/NavigableImagePanel.properties
is/codion/plugin/imagepanel/NavigableImagePanel_is_IS.properties
key default is_IS

file_not_found

File not found

Skrá fannst ekki

9.2.13. codion-swing-common-ui

is/codion/swing/common/ui/SwingMessages.java
is/codion/swing/common/ui/SwingMessages.properties
is/codion/swing/common/ui/SwingMessages_is_IS.properties
key default is_IS

FileChooser.acceptAllFileFilterText

All Files

Allar Skrár

FileChooser.byDateText

Date Modified

Dagsetningu

FileChooser.byNameText

Name

Nafn

FileChooser.cancelButtonMnemonic

0

0

FileChooser.cancelButtonText

Cancel

Hætta við

FileChooser.cancelButtonToolTipText

Abort file chooser dialog

Hætta við að velja skrá

FileChooser.chooseButtonText

Choose

Velja

FileChooser.createButtonText

Create

Búa til

FileChooser.desktopName

Desktop

Skjáborð

FileChooser.detailsViewButtonToolTipText

Details

Ýtarlegt

FileChooser.directoryDescriptionText

Directory

Mappa

FileChooser.directoryOpenButtonMnemonic

0

0

FileChooser.directoryOpenButtonText

Open

Opna

FileChooser.directoryOpenButtonToolTipText

Open selected directory

Opna valda möppu

FileChooser.fileDescriptionText

Generic File

Almenn Skrá

FileChooser.fileNameLabelMnemonic

0

0

FileChooser.fileNameLabelText

File:

Skrá:

FileChooser.filesOfTypeLabelMnemonic

0

0

FileChooser.filesOfTypeLabelText

File Format:

Skráarsnið:

FileChooser.helpButtonMnemonic

72

0

FileChooser.helpButtonText

Help

Hjálp

FileChooser.helpButtonToolTipText

FileChooser help

Birta hjálp

FileChooser.homeFolderToolTipText

Home

Heim

FileChooser.listViewButtonToolTipText

List

Listi

FileChooser.lookInLabelMnemonic

0

0

FileChooser.lookInLabelText

Look in

Leita í

FileChooser.newFolderButtonText

New Folder

Ný Mappa

FileChooser.newFolderErrorSeparator

:

:

FileChooser.newFolderErrorText

Error creating new folder

Villa við að búa til nýja möppu

FileChooser.newFolderExistsErrorText

That name is already taken

Nafnið er þegar í notkun

FileChooser.newFolderParentDoesntExistText

Unable to create the folder.

The system cannot find the path specified.

Tókst ekki að búa til möppuna.

Slóðin fannst ekki.

FileChooser.newFolderParentDoesntExistTitleText

Unable to create folder

Tókst ekki að búa til nýa möppu

FileChooser.newFolderPromptText

Name of new folder:

Nafn nýrrar möppu:

FileChooser.newFolderTitleText

New Folder

Ný mappa

FileChooser.newFolderToolTipText

Create New Folder

Búa til nýja möppu

FileChooser.openButtonMnemonic

0

0

FileChooser.openButtonText

Open

Opna

FileChooser.openButtonToolTipText

Open selected file

Opna valda skrá

FileChooser.openDialogTitleText

Open

Opna

FileChooser.openTitleText

Open

Opna

FileChooser.saveButtonMnemonic

0

0

FileChooser.saveButtonText

Save

Vista

FileChooser.saveButtonToolTipText

Save selected file

Vista valda skrá

FileChooser.saveDialogTitleText

Save

Vista

FileChooser.saveTitleText

Save

Vista

FileChooser.upFolderToolTipText

Up One Level

Upp um eitt stig

FileChooser.updateButtonMnemonic

85

0

FileChooser.updateButtonText

Update

Uppfæra

FileChooser.updateButtonToolTipText

Update directory listing

Uppfæra skráalista

OptionPane.inputDialogTitle

Input

Inntak

OptionPane.messageDialogTitle

Message

Skilaboð

is/codion/swing/common/ui/component/calendar/CalendarPanel.java
is/codion/swing/common/ui/component/calendar/CalendarPanel.properties
is/codion/swing/common/ui/component/calendar/CalendarPanel_is_IS.properties
key default is_IS

today

Today

Í dag

today_mnemonic

T

D

is/codion/swing/common/ui/component/table/ColumnConditionPanel.java
is/codion/swing/common/ui/component/table/ColumnConditionPanel.properties
is/codion/swing/common/ui/component/table/ColumnConditionPanel_is_IS.properties
key default is_IS

auto_enable

Auto-enable

Virkja sjálfkrafa

case_sensitive

Case-sensitive

Hástafanæmni

wildcard

Wildcard

Algildi

is/codion/swing/common/ui/component/table/ColumnSelectionPanel.java
is/codion/swing/common/ui/component/table/ColumnSelectionPanel.properties
is/codion/swing/common/ui/component/table/ColumnSelectionPanel_is_IS.properties
key default is_IS

select_all

All

Alla

select_all_mnemonic

A

A

select_none

None

Engan

select_none_mnemonic

N

E

is/codion/swing/common/ui/component/table/FilterTable.java
is/codion/swing/common/ui/component/table/FilterTable.properties
is/codion/swing/common/ui/component/table/FilterTable_is_IS.properties
key default is_IS

auto_resize

Auto-resize

Stærðarjafna

case_sensitive_search

Case-sensitive

Hástafanæmni

copy_cell

Copy Cell

Afrita Reit

regular_expression_search

Regular expression search

Leita með reglulegum segðum

reset

Reset

Frumstilla

reset_columns_description

Reset columns to their original location

Frumstilla dálka í upphaflega stöðu

resize_all_columns

All columns

Alla dálka

resize_last_column

Last column

Aftasta dálk

resize_next_column

Next column

Næsta dálk

resize_off

Off

Slökkt

resize_subsequent_columns

Subsequent columns

Aftari dálka

select

Select

Velja

select_columns

Select columns

Velja dálka

single_selection_mode

Single selection

Einnar línu val

is/codion/swing/common/ui/component/table/TableConditionPanel.java
is/codion/swing/common/ui/component/table/TableConditionPanel.properties
is/codion/swing/common/ui/component/table/TableConditionPanel_is_IS.properties
key default is_IS

advanced

Advanced

Nákvæm

hidden

Hidden

Falin

select_condition

Select condition

Veldu leitarreit

simple

Simple

Einföld

is/codion/swing/common/ui/component/text/NumberDocument$NumberParsingDocumentFilter.java
is/codion/swing/common/ui/component/text/NumberDocument$NumberParsingDocumentFilter.properties
is/codion/swing/common/ui/component/text/NumberDocument$NumberParsingDocumentFilter_is_IS.properties
key default is_IS

value_outside_range

Value outside allowed range

Gildi utan leyfilegs bils

is/codion/swing/common/ui/component/text/SearchHighlighter.java
is/codion/swing/common/ui/component/text/SearchHighlighter.properties
is/codion/swing/common/ui/component/text/SearchHighlighter_is_IS.properties
key default is_IS

case_sensitive

Case-sensitive

Hástafanæmni

is/codion/swing/common/ui/component/text/StringLengthValidator.java
is/codion/swing/common/ui/component/text/StringLengthValidator.properties
is/codion/swing/common/ui/component/text/StringLengthValidator_is_IS.properties
key default is_IS

length_exceeds_maximum

Text length may not exceed

Texti má ekki vera lengri en

is/codion/swing/common/ui/component/text/TemporalField.java
is/codion/swing/common/ui/component/text/TemporalField.properties
is/codion/swing/common/ui/component/text/TemporalField_is_IS.properties
key default is_IS

display_calendar

Display calendar

Birta dagatal

is/codion/swing/common/ui/component/text/TextFieldPanel.java
is/codion/swing/common/ui/component/text/TextFieldPanel.properties
is/codion/swing/common/ui/component/text/TextFieldPanel_is_IS.properties
key default is_IS

show_input_dialog

Show larger input field

Sýna stærri innsláttarreit

is/codion/swing/common/ui/dialog/DefaultCalendarDialogBuilder.java
is/codion/swing/common/ui/dialog/DefaultCalendarDialogBuilder.properties
is/codion/swing/common/ui/dialog/DefaultCalendarDialogBuilder_is_IS.properties
key default is_IS

select_date

Select a date

Veldu dagsetningu

select_date_time

Select a date and time

Veldu dagsetningu og tíma

is/codion/swing/common/ui/dialog/DefaultExceptionDialogBuilder.java
is/codion/swing/common/ui/dialog/DefaultExceptionDialogBuilder.properties
is/codion/swing/common/ui/dialog/DefaultExceptionDialogBuilder_is_IS.properties
key default is_IS

file_not_found

File not found

Skrá fannst ekki

is/codion/swing/common/ui/dialog/DefaultFileSelectionDialogBuilder.java
is/codion/swing/common/ui/dialog/DefaultFileSelectionDialogBuilder.properties
is/codion/swing/common/ui/dialog/DefaultFileSelectionDialogBuilder_is_IS.properties
key default is_IS

file_exists

File with the same name exists

Skrá er til

overwrite_file

Overwrite file?

Yfirskrifa skrá?

select_directories

Select directories

Veldu möppur

select_directory

Select directory

Veldu möppu

select_file

Select file

Veldu skrá

select_file_or_directory

Select file or directory

Veldu skrá eða möppu

select_files

Select files

Veldu skrár

select_files_or_directories

Select files or directories

Veldu skrár eða möppur

is/codion/swing/common/ui/dialog/DefaultFontSizeSelectionDialogBuilder.java
is/codion/swing/common/ui/dialog/DefaultFontSizeSelectionDialogBuilder.properties
is/codion/swing/common/ui/dialog/DefaultFontSizeSelectionDialogBuilder_is_IS.properties
key default is_IS

select_font_size

Select Font Size

Velja Leturstærð

is/codion/swing/common/ui/dialog/DefaultSelectionDialogBuilder.java
is/codion/swing/common/ui/dialog/DefaultSelectionDialogBuilder.properties
is/codion/swing/common/ui/dialog/DefaultSelectionDialogBuilder_is_IS.properties
key default is_IS

select_value

Select value

Veldu gildi

select_values

Select values

Veldu gildi

is/codion/swing/common/ui/dialog/ExceptionPanel.java
is/codion/swing/common/ui/dialog/ExceptionPanel.properties
is/codion/swing/common/ui/dialog/ExceptionPanel_is_IS.properties
key default is_IS

close

Close

Loka

close_dialog

Close this dialog

Loka glugga

close_mnemonic

C

L

copy_mnemonic

C

A

copy_to_clipboard

Copy text to clipboard

Afrita texta á klippiborð

details

Details

Meira

print_error_report

Print an error report

Prenta upplýsingar um villu

print_error_report_mnemonic

P

P

save

Save

Vista

save_error_log

Save error log

Vista upplýsingar um villu

save_mnemonic

S

S

show_details

Show details

Sýna meira

is/codion/swing/common/ui/laf/LookAndFeelProvider.java
is/codion/swing/common/ui/laf/LookAndFeelProvider.properties
is/codion/swing/common/ui/laf/LookAndFeelProvider_is_IS.properties
key default is_IS

select_look_and_feel

Select Look & Feel

Velja Útlit

9.2.14. codion-swing-framework-ui

is/codion/swing/framework/ui/DefaultEntityApplicationPanelBuilder.java
is/codion/swing/framework/ui/DefaultEntityApplicationPanelBuilder.properties
is/codion/swing/framework/ui/DefaultEntityApplicationPanelBuilder_is_IS.properties
key default is_IS

initializing

Initializing

Frumstilli

is/codion/swing/framework/ui/EntityApplicationPanel.java
is/codion/swing/framework/ui/EntityApplicationPanel.properties
is/codion/swing/framework/ui/EntityApplicationPanel_is_IS.properties
key default is_IS

about

About

Um Forritið

always_on_top

Always on Top

Alltaf Ofan á

application_version

Application Version

Kerfisútgáfa

codion_version

Codion Version

Codion Útgáfa

font_size_selected_message

The selected font size will be activated on next application start

Valin leturstærð virkjast við næstu ræsingu

help

Help

Hjálp

help_mnemonic

H

H

keyboard_shortcuts

Keyboard shortcuts

Flýtilyklar

log

Log

Loggur

log_level

Level

Nákvæmni

log_level_desc

Set the logging level for the application

Stilla nákvæmni logs

log_mnemonic

L

L

memory_usage

Memory Usage

Minnisnotkun

open_log

Open Log

Opna Log

open_log_file

File

Skrá

open_log_folder

Folder

Möppu

tools

Tools

Tól

tools_mnemonic

T

T

view_application_tree

Application Tree

Yfirlitsmynd

is/codion/swing/framework/ui/EntityEditPanel.java
is/codion/swing/framework/ui/EntityEditPanel.properties
is/codion/swing/framework/ui/EntityEditPanel_is_IS.properties
key default is_IS

deleting

Deleting

Eyði

inserting

Inserting

Vista

no_dependencies

This record has no dependent records

Færslan á sér engar tengdar færslur

no_dependencies_title

No dependencies

Engar tengdar færslur

unknown_dependent_records

This record has unknown dependencies

Færslan á sér óþekktar tengdar færslur

updating

Updating

Uppfæri

is/codion/swing/framework/ui/EntityPanel.java
is/codion/swing/framework/ui/EntityPanel.properties
is/codion/swing/framework/ui/EntityPanel_is_IS.properties
key default is_IS

toggle_edit

Toggle between edit views

Skipta á milli sýna á innsláttarsvæði

is/codion/swing/framework/ui/EntityTablePanel.java
is/codion/swing/framework/ui/EntityTablePanel.properties
is/codion/swing/framework/ui/EntityTablePanel_is_IS.properties
key default is_IS

clear_selection_tip

Clear selection

Hreinsa val

columns

Columns

Dálkar

delete_dependent_records

Delete these dependent records first

Eyddu þessum tengdu færslum fyrst

filtered

filtered

sýjaðar

limited_to

Limited to

Takmarkað við

refreshing

Refreshing

Endurhleð

require_query_condition

Search Condition Required

Krefjast Leitarskilyrðis

require_query_condition_description

One or more active search conditions required for displaying data

Eins eða fleiri leitarskilyrða krafist til að sækja gögn

row_limit

Row limit

Fjöldatakmörkun

selected

selected

valdar

selection_down_tip

Move selection down

Færa val niður

selection_up_tip

Move selection up

Færa val upp

show_condition_panel

Show Condition Panel

Sýna Leitarflöt

show_filter_panel

Show Filter Panel

Sýna Sýjunarflöt

toggle_summary_tip

Toggle Summary View

Sýna/fela samantekt

is/codion/swing/framework/ui/KeyboardShortcutsPanel.java
is/codion/swing/framework/ui/KeyboardShortcutsPanel.properties
is/codion/swing/framework/ui/KeyboardShortcutsPanel_is_IS.properties
key default is_IS

add

Add

Ný færsla

add_new_item

Add new item

Bæta við nýrri færslu

calendar

Calendar

Dagatal

condition_panel

Table condition panel

Leitarflötur

copy_selected_cell

Copy selected cell to clipboard

Afrita valinn reit á klippiborð

copy_selected_rows

Copy selected rows to clipboard

Afrita valdar línur á klippiborð

date_time_field

Date/time field

Dagsetning/tíma reitur

delete

Delete

Eyða

delete_selected

Delete selected

Eyða völdum

display_calendar

Display calendar

Birta dagatal

display_input_dialog

Display multi-line input dialog

Birta innsláttarreit með fleiri línum

edit_panel

Edit panel

Innsláttarflötur

edit_selected_item

Edit selected item

Breyta valinni færslu

edit_value

Edit value

Breyta gildi

enable_disable_condition

Enable/disable column condition

Virkja/afvirkja leitarreit dálks

entity_field

Entity field (combo box or search field) with a new item or edit item control

Færslureitur (flettilisti eða leitarreitur) með aðgerð til að búa til nýja eða breyta færslu

expand_collapse

Expand/collapse

Stækka/minnka alveg

find_and_select_next

Find and select next

Finna og velja næstu

find_and_select_previous

Find and select previous

Finna og velja síðustu

find_next

Find next

Finna næstu

find_previous

Find previous

Finna síðustu

increment_decrement

Increment/decrement based to cursor position

Hækka/læækka út frá staðsetningu bendils

move_focus_to_table

Move focus to table

Færa fókus í töflu

move_selected_column

Move selected column

Færa valinn dálk

move_selection

Move selection

Færa val

navigate_left_right

Navigate left/right

Flakka hægri/vinstri

navigate_up_down

Navigate up/down

Flakka upp/niður

navigation

Navigation

Flakk

previous_next_day

Previous/next day

Fyrri/næsti dagur

previous_next_hour

Previous/next hour

Fyrri/næsta klukkustund

previous_next_minute

Previous/next minute

Fyrri/næsta mínúta

previous_next_month

Previous/next month

Fyrri/næsti mánuður

previous_next_operator

Previous/next search operator

Fyrri/næsta leitartýpa

previous_next_week

Previous/next week

Fyrri/næsta vika

previous_next_year

Previous/next year

Fyrra/næsta ár

print

Print (if printing is available)

Prenta (ef prentun er til staðar)

refresh

Refresh

Endurhlaða

refresh_button

Refresh, when condition panel is visible and button enabled

Endurhlaða, þegar leitarflötur er sýnilegur og hnappur virkur

refresh_table_data

Refresh table data

Endurhlaða gögnum

resize_left_right

Resize left/right

Stækka/minnka

resize_selected_column

Resize selected column

Breyta stærð á völdum dálk

resizing

Resizing

Stærð

save

Save

Vista

select_condition_panel

Select a condition panel

Velja leitarflöt

select_filter_panel

Select a filter panel

Velja sýjunarflöt

show_popup_menu

Show popup menu

Birta valmynd

table_panel

Table panel

Tafla

table_search_field

Table search field

Töfluleitarreitur

text_field_panel

Text field panel

Textainnsláttarflötur

toggle_column_sort

Toggle sorting by selected column

Raða út frá völdum dálk

toggle_column_sort_add

Toggle and add sorting by selected column

Bæta við röðun út frá völdum dálk

toggle_condition_panel

Toggle condition panel view, between hidden, visible and advanced

Skipta á milli sýna á leitarfleti, falinn, sjáanlegur og nákvæmur

toggle_edit_panel

Toggle edit panel

Fela/birta innsláttarflöt

toggle_filter_panel

Toggle filter panel view, between hidden, visible and advanced

Skipta á milli sýna á sýjunarfleti, falinn, sjáanlegur og nákvæmur

transfer_focus

Transfer focus

Færa fókus

transfer_focus_edit_panel

Edit panel

Innsláttarflötur

transfer_focus_find_in_table

Find in table field

Leita í töflu

transfer_focus_input_field

Input field

Innsláttarreitur

transfer_focus_search_field

Search field

Leitarreitur

transfer_focus_table

Table

Tafla

transfer_focus_to_next_input_field

Transfer focus to next input field

Færa fókus í næsta innsláttarreit

transfer_focus_to_previous_input_field

Transfer focus to previous input field

Færa fókus í síðasta innsláttarreit

update

Update

Uppfæra

is/codion/swing/framework/ui/TabbedDetailLayout.java
is/codion/swing/framework/ui/TabbedDetailLayout.properties
is/codion/swing/framework/ui/TabbedDetailLayout_is_IS.properties
key default is_IS

detail_tables

Detail Tables

Undirtöflur

toggle_detail

Toggle between detail views

Skipta á milli sýna á undirtöflur

is/codion/swing/framework/ui/component/EntityControls.java
is/codion/swing/framework/ui/component/EntityControls.properties
is/codion/swing/framework/ui/component/EntityControls_is_IS.properties
key default is_IS

add_new

Add new item

Skrá nýja færslu

edit_selected

Edit selected item

Breyta valinni færslu

is/codion/swing/framework/ui/component/EntitySearchField.java
is/codion/swing/framework/ui/component/EntitySearchField.properties
is/codion/swing/framework/ui/component/EntitySearchField_is_IS.properties
key default is_IS

case_sensitive

Case-sensitive

Hástafanæmni

multiple_item_separator

Multiple item separator

Tákn sem aðgreinir færslur

postfix_wildcard

Auto-postfix wildcard

Sjálfkrafa algildi fyrir aftan

prefix_wildcard

Auto-prefix wildcard

Sjálfkrafa algildi fyrir framan

result_limit

Result limit

Fjöldatakmörkun

result_limited

Result limited to {0, choice, 1#record|1<{0, number, integer} records}

Niðurstöður takmarkaðar við {0, choice, 1#færslu|1<{0, number, integer} færslur}

search_columns

Search columns

Leitardálkar

searching

Searching

Leita

select_entity

Select record

Veldu færslu

space_as_wildcard

Space as wildcard

Stafabil sem algildi