[Project] Initial Commit

This commit is contained in:
Robert von Burg 2017-05-21 14:04:57 +02:00
commit e2af6a41aa
16 changed files with 861 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
/target/
/.settings/
/.classpath
/.project

215
pom.xml Normal file
View File

@ -0,0 +1,215 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>li.strolch</groupId>
<artifactId>strolch-bookshop</artifactId>
<version>0.1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>strolch-bookshop</name>
<description>Bookshop built on Strolch</description>
<inceptionYear>2017</inceptionYear>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
<buildTimestamp>${maven.build.timestamp}</buildTimestamp>
<java-version>1.8</java-version>
<strolch.version>1.5.0-SNAPSHOT</strolch.version>
<jersey.version>2.11</jersey.version>
<jaxrs.api.version>2.0</jaxrs.api.version>
<warFinalName>bookshop</warFinalName>
<m2eclipse.wtp.contextRoot>${warFinalName}</m2eclipse.wtp.contextRoot>
</properties>
<dependencies>
<!-- base -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
<!-- strolch -->
<dependency>
<groupId>li.strolch</groupId>
<artifactId>li.strolch.utils</artifactId>
<version>${strolch.version}</version>
</dependency>
<dependency>
<groupId>li.strolch</groupId>
<artifactId>li.strolch.privilege</artifactId>
<version>${strolch.version}</version>
</dependency>
<dependency>
<groupId>li.strolch</groupId>
<artifactId>li.strolch.model</artifactId>
<version>${strolch.version}</version>
</dependency>
<dependency>
<groupId>li.strolch</groupId>
<artifactId>li.strolch.agent</artifactId>
<version>${strolch.version}</version>
</dependency>
<dependency>
<groupId>li.strolch</groupId>
<artifactId>li.strolch.rest</artifactId>
<version>${strolch.version}</version>
</dependency>
<dependency>
<groupId>li.strolch</groupId>
<artifactId>li.strolch.service</artifactId>
<version>${strolch.version}</version>
</dependency>
<dependency>
<groupId>li.strolch</groupId>
<artifactId>li.strolch.testbase</artifactId>
<version>${strolch.version}</version>
<scope>test</scope>
</dependency>
<!-- utils -->
<dependency>
<groupId>com.github.petitparser.java-petitparser</groupId>
<artifactId>petitparser-core</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
<!-- web -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>${jaxrs.api.version}</version>
</dependency>
<!-- testing -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<!-- filter properties files, and copy the rest -->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${warFinalName}</warName>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<!-- used by petit-parser -->
<repository>
<id>jitpack.io</id>
<name>snapshots</name>
<url>https://jitpack.io</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<profiles>
<!-- active when building on eitch's machines -->
<profile>
<id>m2e.eitchpc</id>
<activation>
<property>
<name>user.name</name>
<value>eitch</value>
</property>
<os>
<family>unix</family>
</os>
</activation>
<properties>
<strolch.env>dev.eitchpc</strolch.env>
</properties>
</profile>
<profile>
<id>m2e.eitchmac</id>
<activation>
<property>
<name>user.name</name>
<value>eitch</value>
</property>
<os>
<family>mac</family>
</os>
</activation>
<properties>
<strolch.env>dev.eitchmac</strolch.env>
</properties>
</profile>
</profiles>
</project>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<Privilege>
<Container>
<Parameters>
<!-- parameters for the container itself -->
<Parameter name="secretKey" value="45f251ce-d51f-4624-990a-8dcd5b181f0e"/>
<Parameter name="secretSalt" value="4770a32d-1512-4891-9a63-362504932500"/>
<Parameter name="persistSessions" value="true"/>
<Parameter name="autoPersistOnUserChangesData" value="false"/>
<Parameter name="privilegeConflictResolution" value="MERGE"/>
</Parameters>
<EncryptionHandler class="li.strolch.privilege.handler.DefaultEncryptionHandler">
<Parameters>
<Parameter name="hashAlgorithm" value="SHA-256"/>
</Parameters>
</EncryptionHandler>
<PersistenceHandler class="li.strolch.privilege.handler.XmlPersistenceHandler">
<Parameters>
<Parameter name="usersXmlFile" value="PrivilegeUsers.xml"/>
<Parameter name="rolesXmlFile" value="PrivilegeRoles.xml"/>
</Parameters>
</PersistenceHandler>
<UserChallengeHandler class="li.strolch.privilege.handler.MailUserChallengeHandler">
</UserChallengeHandler>
</Container>
<Policies>
<Policy name="DefaultPrivilege" class="li.strolch.privilege.policy.DefaultPrivilege"/>
<Policy name="RoleAccessPrivilege" class="li.strolch.privilege.policy.RoleAccessPrivilege"/>
<Policy name="UserAccessPrivilege" class="li.strolch.privilege.policy.UserAccessPrivilege"/>
<Policy name="UserSessionAccessPrivilege" class="li.strolch.privilege.policy.UsernameFromCertificatePrivilege"/>
</Policies>
</Privilege>

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<Roles>
<Role name="User">
<Privilege name="li.strolch.service.api.Service" policy="DefaultPrivilege">
</Privilege>
<Privilege name="li.strolch.model.query.StrolchQuery" policy="DefaultPrivilege">
<Allow>internal</Allow>
</Privilege>
</Role>
<Role name="UserPrivileges">
<Privilege name="PrivilegeSetUserLocale" policy="UserAccessPrivilege" />
<Privilege name="PrivilegeSetUserPassword" policy="UserAccessPrivilege" />
</Role>
<!--
Internal
-->
<Role name="StrolchAdmin">
<Privilege name="li.strolch.service.api.Service" policy="DefaultPrivilege">
<AllAllowed>true</AllAllowed>
</Privilege>
<Privilege name="li.strolch.model.query.StrolchQuery" policy="DefaultPrivilege">
<AllAllowed>true</AllAllowed>
</Privilege>
<Privilege name="PrivilegeAddUser" policy="UserAccessPrivilege">
<AllAllowed>true</AllAllowed>
</Privilege>
<Privilege name="PrivilegeSetUserPassword" policy="UserAccessPrivilege">
<AllAllowed>true</AllAllowed>
</Privilege>
</Role>
<Role name="agent">
<Privilege name="li.strolch.privilege.handler.SystemAction" policy="DefaultPrivilege">
<Allow>li.strolch.runtime.privilege.StrolchSystemAction</Allow>
<Allow>li.strolch.runtime.privilege.StrolchSystemActionWithResult</Allow>
<Allow>li.strolch.persistence.postgresql.PostgreSqlSchemaInitializer</Allow>
</Privilege>
<Privilege name="li.strolch.service.api.Service" policy="DefaultPrivilege">
<AllAllowed>true</AllAllowed>
</Privilege>
<Privilege name="li.strolch.model.query.StrolchQuery" policy="DefaultPrivilege">
<AllAllowed>true</AllAllowed>
</Privilege>
<Privilege name="PrivilegeAction" policy="DefaultPrivilege">
<Allow>Persist</Allow>
<Allow>PersistSessions</Allow>
<Allow>GetCertificates</Allow>
</Privilege>
<Privilege name="PrivilegeAddUser" policy="UserAccessPrivilege">
<AllAllowed>true</AllAllowed>
</Privilege>
<Privilege name="PrivilegeModifyUser" policy="UserAccessPrivilege">
<AllAllowed>true</AllAllowed>
</Privilege>
<Privilege name="PrivilegeGetUser" policy="UserAccessPrivilege">
<AllAllowed>true</AllAllowed>
</Privilege>
</Role>
</Roles>

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<Users>
<User userId="U10" username="jill" password="8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918">
<Firstname>Jill</Firstname>
<Lastname>Someone</Lastname>
<State>ENABLED</State>
<Locale>en_GB</Locale>
<Roles>
<Role>User</Role>
<Role>UserPrivileges</Role>
</Roles>
<Properties>
<Property name="email" value="eitch+jill@eitchnet.ch" />
</Properties>
</User>
<User userId="U01" username="admin" password="8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918">
<Firstname>Jill</Firstname>
<Lastname>Someone</Lastname>
<State>ENABLED</State>
<Locale>en_GB</Locale>
<Roles>
<Role>StrolchAdmin</Role>
<Role>UserPrivileges</Role>
</Roles>
<Properties>
<Property name="email" value="eitch+admin@eitchnet.ch" />
</Properties>
</User>
<!--
Internal
-->
<User userId="S01" username="agent">
<State>SYSTEM</State>
<Roles>
<Role>agent</Role>
</Roles>
</User>
</Users>

View File

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8"?>
<StrolchConfiguration>
<env id="global">
<Runtime>
<applicationName>Bookshop</applicationName>
<Properties>
<locale>en</locale>
<verbose>true</verbose>
</Properties>
</Runtime>
<Component>
<name>PrivilegeHandler</name>
<api>li.strolch.runtime.privilege.PrivilegeHandler</api>
<impl>li.strolch.runtime.privilege.DefaultStrolchPrivilegeHandler</impl>
<Properties>
<privilegeConfigFile>PrivilegeConfig.xml</privilegeConfigFile>
</Properties>
</Component>
<Component>
<name>RealmHandler</name>
<api>li.strolch.agent.api.RealmHandler</api>
<impl>li.strolch.agent.impl.DefaultRealmHandler</impl>
<depends>PrivilegeHandler</depends>
<Properties>
<realms>defaultRealm</realms>
<dataStoreMode>TRANSIENT</dataStoreMode>
<dataStoreFile>defaultModel.xml</dataStoreFile>
<enableObserverUpdates>true</enableObserverUpdates>
</Properties>
</Component>
<Component>
<name>ServiceHandler</name>
<api>li.strolch.service.api.ServiceHandler</api>
<impl>li.strolch.service.api.DefaultServiceHandler</impl>
<depends>RealmHandler</depends>
<depends>PrivilegeHandler</depends>
<Properties>
<verbose>true</verbose>
</Properties>
</Component>
<Component>
<name>PolicyHandler</name>
<api>li.strolch.policy.PolicyHandler</api>
<impl>li.strolch.policy.DefaultPolicyHandler</impl>
<Properties>
<readPolicyFile>true</readPolicyFile>
</Properties>
</Component>
<Component>
<name>ExecutionHandler</name>
<api>li.strolch.execution.ExecutionHandler</api>
<impl>li.strolch.execution.EventBasedExecutionHandler</impl>
<depends>RealmHandler</depends>
<depends>PrivilegeHandler</depends>
</Component>
<Component>
<name>RestfulHandler</name>
<api>li.strolch.rest.RestfulStrolchComponent</api>
<impl>li.strolch.rest.RestfulStrolchComponent</impl>
<depends>SessionHandler</depends>
<Properties>
<secureCookie>false</secureCookie>
<restLogging>false</restLogging>
<restLoggingEntity>false</restLoggingEntity>
<restTracing>ALL</restTracing>
</Properties>
</Component>
<Component>
<name>SessionHandler</name>
<api>li.strolch.rest.StrolchSessionHandler</api>
<impl>li.strolch.rest.DefaultStrolchSessionHandler</impl>
<depends>PrivilegeHandler</depends>
<Properties>
<session.ttl.minutes>30</session.ttl.minutes>
<session.reload>true</session.reload>
</Properties>
</Component>
<Component>
<name>MailHandler</name>
<api>li.strolch.handler.mail.MailHandler</api>
<impl>li.strolch.handler.mail.SmtpMailHandler</impl>
<Properties>
<fromAddr>relayer@eitchnet.ch</fromAddr>
<fromName>Susi</fromName>
<overrideRecipients>IPSC Test &lt;eitch@eitchnet.ch&gt;</overrideRecipients>
<recipientWhitelist>eitch@eitchnet.ch</recipientWhitelist>
<username>test</username>
<password>test</password>
<auth>true</auth>
<startTls>true</startTls>
<host>smtp.gmail.com</host>
<port>587</port>
</Properties>
</Component>
</env>
<env id="dev">
<!-- overrides go here -->
</env>
</StrolchConfiguration>

View File

@ -0,0 +1,16 @@
<StrolchPolicies>
<PolicyType Type="ExecutionPolicy" Api="li.strolch.execution.policy.ExecutionPolicy">
<Policy Key="DurationExecution" Class="li.strolch.execution.policy.DurationExecution" />
<Policy Key="ReservationExection" Class="li.strolch.execution.policy.ReservationExection" />
</PolicyType>
<PolicyType Type="ConfirmationPolicy" Api="li.strolch.execution.policy.ConfirmationPolicy">
<Policy Key="DefaultConfirmation" Class="li.strolch.execution.policy.ConfirmationPolicy" />
</PolicyType>
<PolicyType Type="ActivityArchivalPolicy" Api="li.strolch.execution.policy.ActivityArchivalPolicy">
<Policy Key="DefaultActivityArchival" Class="li.strolch.execution.policy.ActivityArchivalPolicy" />
</PolicyType>
</StrolchPolicies>

View File

@ -0,0 +1,190 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="https://strolch.li/xsd/StrolchModel-1.4.xsd" xmlns="https://strolch.li/xsd/StrolchModel-1.4.xsd"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:annotation>
<xs:documentation>This is Version 1.4.x of the StrolchModel XSD.</xs:documentation>
</xs:annotation>
<xs:element name="StrolchModel" type="StrolchModelType" />
<xs:complexType name="StrolchModelType">
<xs:sequence maxOccurs="unbounded" minOccurs="0">
<xs:choice>
<xs:element type="IncludeFileType" name="IncludeFile" maxOccurs="unbounded" minOccurs="0" />
<xs:element type="OrderType" name="Order" maxOccurs="unbounded" minOccurs="0" />
<xs:element type="ResourceType" name="Resource" maxOccurs="unbounded" minOccurs="0" />
<xs:element type="ActivityType" name="Activity" maxOccurs="unbounded" minOccurs="0" />
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:complexType name="IncludeFileType">
<xs:attribute type="xs:string" name="file" />
</xs:complexType>
<xs:complexType name="VersionType">
<xs:attribute type="xs:int" name="Version" use="required" />
<xs:attribute type="xs:string" name="CreatedBy" use="required" />
<xs:attribute type="xs:dateTime" name="CreatedAt" use="required" />
<xs:attribute type="xs:string" name="Deleted" use="required" />
</xs:complexType>
<xs:complexType name="OrderType">
<xs:sequence>
<xs:element type="VersionType" name="Version" maxOccurs="1" minOccurs="0" />
<xs:element type="ParameterBagType" name="ParameterBag" maxOccurs="unbounded" minOccurs="0" />
<xs:element type="PoliciesType" name="Policies" maxOccurs="1" minOccurs="0" />
</xs:sequence>
<xs:attribute type="xs:string" name="Id" use="required" />
<xs:attribute type="xs:string" name="Name" use="required" />
<xs:attribute type="xs:string" name="Type" use="required" />
<xs:attribute type="StateType" name="State" use="optional" />
</xs:complexType>
<xs:complexType name="ResourceType">
<xs:sequence>
<xs:element type="VersionType" name="Version" maxOccurs="1" minOccurs="0" />
<xs:element type="ParameterBagType" name="ParameterBag" maxOccurs="unbounded" minOccurs="0" />
<xs:element type="TimedStateType" name="TimedState" maxOccurs="unbounded" minOccurs="0" />
<xs:element type="PoliciesType" name="Policies" maxOccurs="1" minOccurs="0" />
</xs:sequence>
<xs:attribute type="xs:string" name="Id" use="required" />
<xs:attribute type="xs:string" name="Name" use="required" />
<xs:attribute type="xs:string" name="Type" use="required" />
</xs:complexType>
<xs:complexType name="ActivityType">
<xs:sequence>
<xs:element type="VersionType" name="Version" maxOccurs="1" minOccurs="0" />
<xs:element type="ParameterBagType" name="ParameterBag" maxOccurs="unbounded" minOccurs="0" />
<xs:element type="PoliciesType" name="Policies" maxOccurs="1" minOccurs="0" />
<xs:sequence maxOccurs="unbounded" minOccurs="0">
<xs:choice>
<xs:element type="ActionType" name="Action" maxOccurs="unbounded" minOccurs="0" />
<xs:element type="ActivityType" name="Activity" maxOccurs="unbounded" minOccurs="0" />
</xs:choice>
</xs:sequence>
</xs:sequence>
<xs:attribute type="xs:string" name="Id" use="required" />
<xs:attribute type="xs:string" name="Name" use="required" />
<xs:attribute type="xs:string" name="Type" use="required" />
<xs:attribute type="TimeOrderingType" name="TimeOrdering" use="required" />
</xs:complexType>
<xs:complexType name="ActionType">
<xs:sequence>
<xs:element type="ParameterBagType" name="ParameterBag" maxOccurs="unbounded" minOccurs="0" />
<xs:element type="PoliciesType" name="Policies" maxOccurs="1" minOccurs="0" />
<xs:element type="ValueChangeType" name="ValueChange" maxOccurs="unbounded" minOccurs="0" />
</xs:sequence>
<xs:attribute type="xs:string" name="Id" use="required" />
<xs:attribute type="xs:string" name="Name" use="required" />
<xs:attribute type="xs:string" name="ResourceId" use="optional" />
<xs:attribute type="xs:string" name="ResourceType" use="optional" />
<xs:attribute type="StateType" name="State" use="optional" />
<xs:attribute type="xs:string" name="Type" use="required" />
</xs:complexType>
<xs:complexType name="ParameterBagType">
<xs:sequence>
<xs:element type="ParameterType" name="Parameter" maxOccurs="unbounded" minOccurs="0" />
</xs:sequence>
<xs:attribute type="xs:string" name="Id" use="required" />
<xs:attribute type="xs:string" name="Name" use="required" />
<xs:attribute type="xs:string" name="Type" use="required" />
</xs:complexType>
<xs:complexType name="ParameterType">
<xs:attribute type="xs:string" name="Id" use="required" />
<xs:attribute type="xs:string" name="Name" use="required" />
<xs:attribute type="ParameterValueType" name="Type" use="required" />
<xs:attribute type="xs:string" name="Value" use="required" />
<xs:attribute type="xs:string" name="Interpretation" use="optional" />
<xs:attribute type="xs:string" name="Uom" use="optional" />
<xs:attribute type="xs:boolean" name="Hidden" use="optional" />
<xs:attribute type="xs:int" name="Index" use="optional" />
</xs:complexType>
<xs:complexType name="PoliciesType">
<xs:sequence>
<xs:element type="PolicyType" name="Policy" maxOccurs="unbounded" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="PolicyType">
<xs:attribute type="xs:string" name="Type" use="required" />
<xs:attribute type="xs:string" name="Value" use="required" />
</xs:complexType>
<xs:complexType name="TimedStateType">
<xs:sequence>
<xs:element type="ValueType" name="Value" maxOccurs="unbounded" minOccurs="0" />
</xs:sequence>
<xs:attribute type="xs:string" name="Id" use="required" />
<xs:attribute type="xs:string" name="Name" use="required" />
<xs:attribute type="TimedStateTypeType" name="Type" use="required" />
<xs:attribute type="xs:string" name="Interpretation" use="optional" />
<xs:attribute type="xs:string" name="Uom" use="optional" />
<xs:attribute type="xs:boolean" name="Hidden" use="optional" />
<xs:attribute type="xs:int" name="Index" use="optional" />
</xs:complexType>
<xs:complexType name="ValueType">
<xs:attribute type="xs:dateTime" name="Time" use="required" />
<xs:attribute type="xs:string" name="Value" use="required" />
</xs:complexType>
<xs:complexType name="ValueChangeType">
<xs:attribute type="xs:string" name="StateId" use="required" />
<xs:attribute type="xs:dateTime" name="Time" use="required" />
<xs:attribute type="xs:string" name="Value" use="required" />
<xs:attribute type="TimedStateTypeType" name="Type" use="required" />
</xs:complexType>
<xs:simpleType name="StateType">
<xs:restriction base="xs:string">
<xs:enumeration value="Created" />
<xs:enumeration value="Planning" />
<xs:enumeration value="Planned" />
<xs:enumeration value="Execution" />
<xs:enumeration value="Stopped" />
<xs:enumeration value="Warning" />
<xs:enumeration value="Error" />
<xs:enumeration value="Executed" />
<xs:enumeration value="Closed" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TimeOrderingType">
<xs:restriction base="xs:string">
<xs:enumeration value="Series" />
<xs:enumeration value="Parallel" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ParameterValueType">
<xs:restriction base="xs:string">
<xs:enumeration value="Boolean" />
<xs:enumeration value="String" />
<xs:enumeration value="Integer" />
<xs:enumeration value="Long" />
<xs:enumeration value="Float" />
<xs:enumeration value="Date" />
<xs:enumeration value="Duration" />
<xs:enumeration value="StringList" />
<xs:enumeration value="IntegerList" />
<xs:enumeration value="FloatList" />
<xs:enumeration value="LongList" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TimedStateTypeType">
<xs:restriction base="xs:string">
<xs:enumeration value="Boolean" />
<xs:enumeration value="Integer" />
<xs:enumeration value="Float" />
<xs:enumeration value="StringSet" />
</xs:restriction>
</xs:simpleType>
</xs:schema>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<StrolchModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://strolch.li/xsd/StrolchModel-1.4.xsd" xsi:schemaLocation="https://strolch.li/xsd/StrolchModel-1.4.xsd StrolchModel.xsd">
<IncludeFile file="templates.xml" />
<Resource Id="validation" Name="Validation Resource" Type="Validation">
<Policies>
<Policy Type="ExecutionPolicy" Value="key:ValidationExecution" />
<Policy Type="ConfirmationPolicy" Value="key:DefaultConfirmation" />
</Policies>
</Resource>
<Resource Id="packaging" Name="Packaging Resource" Type="Packaging">
<Policies>
<Policy Type="ExecutionPolicy" Value="key:PackagingExecution" />
<Policy Type="ConfirmationPolicy" Value="key:DefaultConfirmation" />
</Policies>
</Resource>
<Resource Id="sending" Name="Sending Resource" Type="Sending">
<Policies>
<Policy Type="ExecutionPolicy" Value="key:SendingExecution" />
<Policy Type="ConfirmationPolicy" Value="key:DefaultConfirmation" />
</Policies>
</Resource>
</StrolchModel>

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<StrolchModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://strolch.li/xsd/StrolchModel-1.4.xsd" xsi:schemaLocation="https://strolch.li/xsd/StrolchModel-1.4.xsd StrolchModel.xsd">
<Resource Id="Book" Name="Book Template" Type="Template">
<ParameterBag Id="parameters" Name="Parameters" Type="Parameters">
<Parameter Id="description" Name="Description" Type="String" Value="" />
<Parameter Id="quantity" Name="Quantity in Stock" Type="Integer" Value="0" />
</ParameterBag>
</Resource>
<Resource Id="Account" Name="Account Template" Type="Template">
<ParameterBag Id="parameters" Name="Parameters" Type="Parameters">
<Parameter Id="user" Name="User" Type="String" Value="" />
<Parameter Id="firstName" Name="First Name" Type="String" Value="" />
<Parameter Id="lastName" Name="Last Name" Type="String" Value="" />
<Parameter Id="email" Name="E-Mail" Type="String" Value="" />
</ParameterBag>
<ParameterBag Name="Address" Id="address" Type="Address">
<Parameter Id="phone" Name="Telephone Number" Type="String" Value="" />
<Parameter Id="street" Name="Street" Type="String" Value="" />
<Parameter Id="city" Name="City" Type="String" Value="" />
<Parameter Id="zip" Name="Postal Code" Type="String" Value="" />
<Parameter Id="country" Name="Country" Type="String" Value="" />
</ParameterBag>
</Resource>
<Resource Id="UserCart" Name="UserCart Template" Type="Template">
<ParameterBag Id="books" Name="Books" Type="Book">
<!-- Parameter Id="bookId" Name="Book reference" Type="Float" Value="0" / -->
</ParameterBag>
<ParameterBag Id="relations" Name="Relations" Type="Parameters">
<Parameter Id="account" Name="Account" Type="String" Interpretation="Resource-Ref" Uom="Account" Value="" />
</ParameterBag>
</Resource>
<Order Id="Order" Name="Order Template" Type="Template" State="Created">
<ParameterBag Id="books" Name="Books" Type="Book">
<!-- Parameter Id="bookId" Name="Book reference" Type="Float" Value="0" / -->
</ParameterBag>
<ParameterBag Id="relations" Name="Relations" Type="Parameters">
<Parameter Id="account" Name="Account" Type="String" Interpretation="Resource-Ref" Uom="Account" Value="" />
</ParameterBag>
</Order>
<Activity Id="FromStock" Name="From Stock Template" Type="FromStock" TimeOrdering="Series">
<ParameterBag Name="objectives" Id="Objectives" Type="Objectives">
<Parameter Name="Duration" Id="duration" Value="PT1MS" Type="Duration" />
</ParameterBag>
<Action Id="Validate" Name="Validation of order" Type="Use" ResourceType="Validation" ResourceId="validation" />
<!-- for each book we do a consume, i.e. reduce the stock quantity -->
<Action Id="Consume" Name="Consume Template for book" Type="Template">
<ParameterBag Id="parameters" Name="Parameters" Type="Parameters">
<Parameter Id="quantity" Name="Quantity" Type="Float" Value="0" />
</ParameterBag>
</Action>
<Action Id="Package" Name="Packaging of Order" Type="Use" ResourceType="Packaging" ResourceId="packaging" />
<Action Id="Send" Name="Sending of package" Type="Use" ResourceType="Sending" ResourceId="sending" />
</Activity>
</StrolchModel>

1
runtime/temp/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/sessions.dat

View File

@ -0,0 +1,53 @@
package li.strolch.bookshop.web;
import java.io.InputStream;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import li.strolch.agent.api.StrolchAgent;
import li.strolch.agent.api.StrolchBootstrapper;
@WebListener
public class StartupListener implements ServletContextListener {
private static final Logger logger = LoggerFactory.getLogger(StartupListener.class);
private StrolchAgent agent;
@Override
public void contextInitialized(ServletContextEvent sce) {
logger.info("Starting Bookshop...");
try {
// we load the configuration by reading the boot strap file:
String boostrapFileName = "/WEB-INF/" + StrolchBootstrapper.FILE_BOOTSTRAP;
InputStream bootstrapFile = sce.getServletContext().getResourceAsStream(boostrapFileName);
StrolchBootstrapper bootstrapper = new StrolchBootstrapper(StartupListener.class);
// now setup, initialize and start Strolch:
this.agent = bootstrapper.setupByBoostrapFile(StartupListener.class, bootstrapFile);
this.agent.initialize();
this.agent.start();
} catch (Exception e) {
logger.error("Failed to start Bookshop due to: " + e.getMessage(), e);
throw e;
}
logger.info("Started Bookshop.");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
if (this.agent != null) {
this.agent.stop();
this.agent.destroy();
}
logger.info("Destroyed Bookshop.");
}
}

View File

@ -0,0 +1 @@
ENV_STROLCH=${strolch.env}

View File

@ -0,0 +1,6 @@
groupId=${project.groupId}
artifactId=${project.artifactId}
artifactVersion=${project.version}
scmRevision=${buildNumber}
scmBranch=${scmBranch}
buildTimestamp=${buildTimestamp}

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d [%thread] %-5level %class{36}:%line %method - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<StrolchBootstrap>
<env id="dev.eitchpc" default="true">
<root>/home/eitch/src/git/strolch-bookshop/runtime</root>
<environment>dev</environment>
</env>
<env id="dev.eitchmac" default="true">
<root>/Users/eitch/src/git/strolch-bookshop/runtime</root>
<environment>dev</environment>
</env>
</StrolchBootstrap>