Skip to content

Commit 4da4ce7

Browse files
committed
initial commit
0 parents  commit 4da4ce7

File tree

10 files changed

+486
-0
lines changed

10 files changed

+486
-0
lines changed

.gitignore

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Project related
2+
3+
# Java related
4+
pom.xml
5+
pom.xml.asc
6+
*jar
7+
*.class
8+
9+
# Leiningen
10+
classes/
11+
lib/
12+
native/
13+
checkouts/
14+
target/
15+
.lein-*
16+
repl-port
17+
.nrepl-port
18+
.repl
19+
20+
# Temp Files
21+
*.orig
22+
*~
23+
.*.swp
24+
.*.swo
25+
*.tmp
26+
*.bak
27+
28+
# OS X
29+
.DS_Store
30+
31+
# Logging
32+
*.log
33+
/logs/
34+
35+
# Builds
36+
out/
37+
build/
38+
39+
# Others
40+
.clj-kondo
41+
.idea

Capstanfile

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
#
3+
# Name of the base image. Capstan will download this automatically from
4+
# Cloudius S3 repository.
5+
#
6+
#base: cloudius/osv
7+
base: cloudius/osv-openjdk8
8+
9+
#
10+
# The command line passed to OSv to start up the application.
11+
#
12+
#cmdline: /java.so -cp /clojure-api/app.jar clojure.main -m clojure-api
13+
cmdline: /java.so -jar /clojure-api/app.jar
14+
15+
#
16+
# The command to use to build the application.
17+
# You can use any build tool/command (make/rake/lein/boot) - this runs locally on your machine
18+
#
19+
# For Leiningen, you can use:
20+
#build: lein uberjar
21+
# For Boot, you can use:
22+
#build: boot build
23+
24+
#
25+
# List of files that are included in the generated image.
26+
#
27+
files:
28+
/clojure-api/app.jar: ./target/clojure-api-0.0.1-SNAPSHOT-standalone.jar
29+

Dockerfile

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
FROM openjdk:8-alpine
2+
MAINTAINER Your Name <[email protected]>
3+
4+
ADD target/clojure-api-0.0.1-SNAPSHOT-standalone.jar /clojure-api/app.jar
5+
6+
EXPOSE 8080
7+
8+
CMD ["java", "-jar", "/clojure-api/app.jar"]

README.md

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# clojure-api
2+
3+
FIXME
4+
5+
## Getting Started
6+
7+
1. Start the application: `lein run`
8+
2. Go to [localhost:8080](http://localhost:8080/) to see: `Hello World!`
9+
3. Read your app's source code at src/clojure_api/service.clj. Explore the docs of functions
10+
that define routes and responses.
11+
4. Run your app's tests with `lein test`. Read the tests at test/clojure_api/service_test.clj.
12+
5. Learn more! See the [Links section below](#links).
13+
14+
15+
## Configuration
16+
17+
To configure logging see config/logback.xml. By default, the app logs to stdout and logs/.
18+
To learn more about configuring Logback, read its [documentation](http://logback.qos.ch/documentation.html).
19+
20+
21+
## Developing your service
22+
23+
1. Start a new REPL: `lein repl`
24+
2. Start your service in dev-mode: `(def dev-serv (run-dev))`
25+
3. Connect your editor to the running REPL session.
26+
Re-evaluated code will be seen immediately in the service.
27+
28+
### [Docker](https://www.docker.com/) container support
29+
30+
1. Configure your service to accept incoming connections (edit service.clj and add ::http/host "0.0.0.0" )
31+
2. Build an uberjar of your service: `lein uberjar`
32+
3. Build a Docker image: `sudo docker build -t clojure-api .`
33+
4. Run your Docker image: `docker run -p 8080:8080 clojure-api`
34+
35+
### [OSv](http://osv.io/) unikernel support with [Capstan](http://osv.io/capstan/)
36+
37+
1. Build and run your image: `capstan run -f "8080:8080"`
38+
39+
Once the image it built, it's cached. To delete the image and build a new one:
40+
41+
1. `capstan rmi clojure-api; capstan build`
42+
43+
## Connect IDE with running REPL
44+
45+
_IntelliJ_
46+
* Go to Run > Edit Configurations and add a Remote Clojure REPL.
47+
* Set Connection Type to nREPL.
48+
* Set Host to localhost and port to the one that appears in the output of `lein repl`.
49+
* Set Context Module to the current project.
50+
* Save and close the configuration.
51+
* Hit Run and you're ready to go.
52+
53+
Whenever you change your code, hit command-shit-P to re-evaluate it in the REPL.
54+
55+
## Links
56+
* [Other Pedestal examples](http://pedestal.io/samples)

clojure-api.iml

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module type="JAVA_MODULE" version="4">
3+
<component name="BuildSystem">
4+
<option name="buildSystemId" value="LEININGEN" />
5+
<option name="displayName" value="clojure-api:0.0.1-SNAPSHOT" />
6+
</component>
7+
<component name="NewModuleRootManager">
8+
<output url="file://$MODULE_DIR$/target/classes" />
9+
<output-test url="file://$MODULE_DIR$/target/classes" />
10+
<exclude-output />
11+
<content url="file://$MODULE_DIR$">
12+
<sourceFolder url="file://$MODULE_DIR$/config" isTestSource="false" />
13+
<sourceFolder url="file://$MODULE_DIR$/dev-resources" isTestSource="false" />
14+
<sourceFolder url="file://$MODULE_DIR$/resources" isTestSource="false" />
15+
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
16+
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
17+
<excludeFolder url="file://$MODULE_DIR$/target" />
18+
</content>
19+
<orderEntry type="inheritedJdk" />
20+
<orderEntry type="sourceFolder" forTests="false" />
21+
<orderEntry type="library" name="Leiningen: ch.qos.logback/logback-classic:1.2.3" level="project" />
22+
<orderEntry type="library" name="Leiningen: ch.qos.logback/logback-core:1.2.3" level="project" />
23+
<orderEntry type="library" name="Leiningen: cheshire:5.9.0" level="project" />
24+
<orderEntry type="library" name="Leiningen: clojure-complete:0.2.5" level="project" />
25+
<orderEntry type="library" name="Leiningen: com.cognitect/transit-clj:0.8.313" level="project" />
26+
<orderEntry type="library" name="Leiningen: com.cognitect/transit-java:0.8.337" level="project" />
27+
<orderEntry type="library" name="Leiningen: com.fasterxml.jackson.core/jackson-core:2.9.9" level="project" />
28+
<orderEntry type="library" name="Leiningen: com.fasterxml.jackson.dataformat/jackson-dataformat-cbor:2.9.9" level="project" />
29+
<orderEntry type="library" name="Leiningen: com.fasterxml.jackson.dataformat/jackson-dataformat-smile:2.9.9" level="project" />
30+
<orderEntry type="library" name="Leiningen: com.googlecode.json-simple/json-simple:1.1.1" level="project" />
31+
<orderEntry type="library" name="Leiningen: commons-codec:1.15" level="project" />
32+
<orderEntry type="library" name="Leiningen: commons-fileupload:1.4" level="project" />
33+
<orderEntry type="library" name="Leiningen: commons-io:2.10.0" level="project" />
34+
<orderEntry type="library" name="Leiningen: crypto-equality:1.0.0" level="project" />
35+
<orderEntry type="library" name="Leiningen: crypto-random:1.2.0" level="project" />
36+
<orderEntry type="library" name="Leiningen: io.dropwizard.metrics/metrics-core:4.1.0" level="project" />
37+
<orderEntry type="library" name="Leiningen: io.dropwizard.metrics/metrics-jmx:4.1.0" level="project" />
38+
<orderEntry type="library" name="Leiningen: io.opentracing/opentracing-api:0.33.0" level="project" />
39+
<orderEntry type="library" name="Leiningen: io.opentracing/opentracing-noop:0.33.0" level="project" />
40+
<orderEntry type="library" name="Leiningen: io.opentracing/opentracing-util:0.33.0" level="project" />
41+
<orderEntry type="library" name="Leiningen: io.pedestal/pedestal.interceptor:0.5.10" level="project" />
42+
<orderEntry type="library" name="Leiningen: io.pedestal/pedestal.jetty:0.5.10" level="project" />
43+
<orderEntry type="library" name="Leiningen: io.pedestal/pedestal.log:0.5.10" level="project" />
44+
<orderEntry type="library" name="Leiningen: io.pedestal/pedestal.route:0.5.10" level="project" />
45+
<orderEntry type="library" name="Leiningen: io.pedestal/pedestal.service-tools:0.5.10" level="project" />
46+
<orderEntry type="library" name="Leiningen: io.pedestal/pedestal.service:0.5.10" level="project" />
47+
<orderEntry type="library" name="Leiningen: javax.servlet/javax.servlet-api:3.1.0" level="project" />
48+
<orderEntry type="library" name="Leiningen: javax.xml.bind/jaxb-api:2.3.0" level="project" />
49+
<orderEntry type="library" name="Leiningen: nrepl:0.6.0" level="project" />
50+
<orderEntry type="library" name="Leiningen: ns-tracker:0.4.0" level="project" />
51+
<orderEntry type="library" name="Leiningen: org.clojure/clojure:1.10.1" level="project" />
52+
<orderEntry type="library" name="Leiningen: org.clojure/core.async:1.5.648" level="project" />
53+
<orderEntry type="library" name="Leiningen: org.clojure/core.cache:0.6.5" level="project" />
54+
<orderEntry type="library" name="Leiningen: org.clojure/core.incubator:0.1.4" level="project" />
55+
<orderEntry type="library" name="Leiningen: org.clojure/core.match:0.3.0" level="project" />
56+
<orderEntry type="library" name="Leiningen: org.clojure/core.memoize:0.5.9" level="project" />
57+
<orderEntry type="library" name="Leiningen: org.clojure/core.specs.alpha:0.2.44" level="project" />
58+
<orderEntry type="library" name="Leiningen: org.clojure/data.codec:0.1.0" level="project" />
59+
<orderEntry type="library" name="Leiningen: org.clojure/data.priority-map:0.0.7" level="project" />
60+
<orderEntry type="library" name="Leiningen: org.clojure/data.xml:0.2.0-alpha5" level="project" />
61+
<orderEntry type="library" name="Leiningen: org.clojure/java.classpath:0.3.0" level="project" />
62+
<orderEntry type="library" name="Leiningen: org.clojure/spec.alpha:0.2.176" level="project" />
63+
<orderEntry type="library" name="Leiningen: org.clojure/tools.analyzer.jvm:0.7.2" level="project" />
64+
<orderEntry type="library" name="Leiningen: org.clojure/tools.analyzer:0.6.9" level="project" />
65+
<orderEntry type="library" name="Leiningen: org.clojure/tools.namespace:0.2.11" level="project" />
66+
<orderEntry type="library" name="Leiningen: org.clojure/tools.reader:1.3.2" level="project" />
67+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty.alpn/alpn-api:1.1.3.v20160715" level="project" />
68+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty.http2/http2-common:9.4.44.v20210927" level="project" />
69+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty.http2/http2-hpack:9.4.44.v20210927" level="project" />
70+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty.http2/http2-server:9.4.44.v20210927" level="project" />
71+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty.websocket/websocket-api:9.4.44.v20210927" level="project" />
72+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty.websocket/websocket-client:9.4.44.v20210927" level="project" />
73+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty.websocket/websocket-common:9.4.44.v20210927" level="project" />
74+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty.websocket/websocket-server:9.4.44.v20210927" level="project" />
75+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty.websocket/websocket-servlet:9.4.44.v20210927" level="project" />
76+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty/jetty-alpn-server:9.4.44.v20210927" level="project" />
77+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty/jetty-client:9.4.44.v20210927" level="project" />
78+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty/jetty-http:9.4.44.v20210927" level="project" />
79+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty/jetty-io:9.4.44.v20210927" level="project" />
80+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty/jetty-security:9.4.44.v20210927" level="project" />
81+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty/jetty-server:9.4.44.v20210927" level="project" />
82+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty/jetty-servlet:9.4.44.v20210927" level="project" />
83+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty/jetty-util-ajax:9.4.44.v20210927" level="project" />
84+
<orderEntry type="library" name="Leiningen: org.eclipse.jetty/jetty-util:9.4.44.v20210927" level="project" />
85+
<orderEntry type="library" name="Leiningen: org.javassist/javassist:3.18.1-GA" level="project" />
86+
<orderEntry type="library" name="Leiningen: org.msgpack/msgpack:0.6.12" level="project" />
87+
<orderEntry type="library" name="Leiningen: org.ow2.asm/asm-all:4.2" level="project" />
88+
<orderEntry type="library" name="Leiningen: org.slf4j/jcl-over-slf4j:1.7.26" level="project" />
89+
<orderEntry type="library" name="Leiningen: org.slf4j/jul-to-slf4j:1.7.26" level="project" />
90+
<orderEntry type="library" name="Leiningen: org.slf4j/log4j-over-slf4j:1.7.26" level="project" />
91+
<orderEntry type="library" name="Leiningen: org.slf4j/slf4j-api:1.7.26" level="project" />
92+
<orderEntry type="library" name="Leiningen: ring/ring-codec:1.1.3" level="project" />
93+
<orderEntry type="library" name="Leiningen: ring/ring-core:1.9.4" level="project" />
94+
<orderEntry type="library" name="Leiningen: tigris:0.1.1" level="project" />
95+
</component>
96+
</module>

config/logback.xml

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
2+
<!-- Scanning is currently turned on; This will impact performance! -->
3+
<configuration scan="true" scanPeriod="10 seconds">
4+
<!-- Silence Logback's own status messages about config parsing
5+
<statusListener class="ch.qos.logback.core.status.NopStatusListener" /> -->
6+
7+
<!-- Simple file output -->
8+
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
9+
<!-- encoder defaults to ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
10+
<encoder>
11+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} %X{io.pedestal} - %msg%n</pattern>
12+
</encoder>
13+
14+
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
15+
<!-- rollover daily -->
16+
<fileNamePattern>logs/clojure-api-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
17+
<!-- or whenever the file size reaches 64 MB -->
18+
<maxFileSize>64 MB</maxFileSize>
19+
</rollingPolicy>
20+
21+
<!-- Safely log to the same file from multiple JVMs. Degrades performance! -->
22+
<prudent>true</prudent>
23+
</appender>
24+
25+
26+
<!-- Console output -->
27+
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
28+
<!-- encoder defaults to ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
29+
<encoder>
30+
<pattern>%-5level %logger{36} %X{io.pedestal} - %msg%n</pattern>
31+
</encoder>
32+
<!-- Only log level INFO and above -->
33+
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
34+
<level>INFO</level>
35+
</filter>
36+
</appender>
37+
38+
39+
<!-- Enable FILE and STDOUT appenders for all log messages.
40+
By default, only log at level INFO and above. -->
41+
<root level="INFO">
42+
<appender-ref ref="FILE" />
43+
<appender-ref ref="STDOUT" />
44+
</root>
45+
46+
<!-- For loggers in the these namespaces, log at all levels. -->
47+
<logger name="user" level="ALL" />
48+
<!-- To log pedestal internals, enable this and change ThresholdFilter to DEBUG
49+
<logger name="io.pedestal" level="ALL" />
50+
-->
51+
52+
</configuration>

project.clj

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
(defproject clojure-api "0.0.1-SNAPSHOT"
2+
:description "A Sample REST API"
3+
:url "http://example.com/FIXME"
4+
:license {:name "Eclipse Public License"
5+
:url "http://www.eclipse.org/legal/epl-v10.html"}
6+
:dependencies [[org.clojure/clojure "1.10.1"]
7+
[io.pedestal/pedestal.service "0.5.10"]
8+
9+
;; Remove this line and uncomment one of the next lines to
10+
;; use Immutant or Tomcat instead of Jetty:
11+
[io.pedestal/pedestal.jetty "0.5.10"]
12+
;; [io.pedestal/pedestal.immutant "0.5.10"]
13+
;; [io.pedestal/pedestal.tomcat "0.5.10"]
14+
15+
[ch.qos.logback/logback-classic "1.2.3" :exclusions [org.slf4j/slf4j-api]]
16+
[org.slf4j/jul-to-slf4j "1.7.26"]
17+
[org.slf4j/jcl-over-slf4j "1.7.26"]
18+
[org.slf4j/log4j-over-slf4j "1.7.26"]]
19+
:min-lein-version "2.0.0"
20+
:resource-paths ["config", "resources"]
21+
;; If you use HTTP/2 or ALPN, use the java-agent to pull in the correct alpn-boot dependency
22+
;:java-agents [[org.mortbay.jetty.alpn/jetty-alpn-agent "2.0.5"]]
23+
:profiles {:dev {:aliases {"run-dev" ["trampoline" "run" "-m" "clojure-api.server/run-dev"]}
24+
:dependencies [[io.pedestal/pedestal.service-tools "0.5.10"]]}
25+
:uberjar {:aot [clojure-api.server]}}
26+
:main ^{:skip-aot true} clojure-api.server)

src/clojure_api/server.clj

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
(ns clojure-api.server
2+
(:gen-class) ; for -main method in uberjar
3+
(:require [io.pedestal.http :as server]
4+
[io.pedestal.http.route :as route]
5+
[clojure-api.service :as service]))
6+
7+
;; This is an adapted service map, that can be started and stopped
8+
;; From the REPL you can call server/start and server/stop on this service
9+
(defonce runnable-service (server/create-server service/service))
10+
11+
(defn run-dev
12+
"The entry-point for 'lein run-dev'"
13+
[& args]
14+
(println "\nCreating your [DEV] server...")
15+
(-> service/service ;; start with production configuration
16+
(merge {:env :dev
17+
;; do not block thread that starts web server
18+
::server/join? false
19+
;; Routes can be a function that resolve routes,
20+
;; we can use this to set the routes to be reloadable
21+
::server/routes #(route/expand-routes (deref #'service/routes))
22+
;; all origins are allowed in dev mode
23+
::server/allowed-origins {:creds true :allowed-origins (constantly true)}
24+
;; Content Security Policy (CSP) is mostly turned off in dev mode
25+
::server/secure-headers {:content-security-policy-settings {:object-src "'none'"}}})
26+
;; Wire up interceptor chains
27+
server/default-interceptors
28+
server/dev-interceptors
29+
server/create-server
30+
server/start))
31+
32+
(defn -main
33+
"The entry-point for 'lein run'"
34+
[& args]
35+
(println "\nCreating your server...")
36+
(server/start runnable-service))
37+
38+
;; If you package the service up as a WAR,
39+
;; some form of the following function sections is required (for io.pedestal.servlet.ClojureVarServlet).
40+
41+
;;(defonce servlet (atom nil))
42+
;;
43+
;;(defn servlet-init
44+
;; [_ config]
45+
;; ;; Initialize your app here.
46+
;; (reset! servlet (server/servlet-init service/service nil)))
47+
;;
48+
;;(defn servlet-service
49+
;; [_ request response]
50+
;; (server/servlet-service @servlet request response))
51+
;;
52+
;;(defn servlet-destroy
53+
;; [_]
54+
;; (server/servlet-destroy @servlet)
55+
;; (reset! servlet nil))
56+

0 commit comments

Comments
 (0)