ported sdn-todos example into org.neo4j namespace, altered text as appropriate
This commit is contained in:
9
spring-data-neo4j-examples/todos/.gitignore
vendored
Normal file
9
spring-data-neo4j-examples/todos/.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
target/
|
||||
.idea
|
||||
*.iml
|
||||
.project
|
||||
.classpath
|
||||
.settings/
|
||||
*.swp
|
||||
*~
|
||||
.DS_Store
|
||||
1
spring-data-neo4j-examples/todos/Procfile
Normal file
1
spring-data-neo4j-examples/todos/Procfile
Normal file
@@ -0,0 +1 @@
|
||||
web: sh target/bin/webapp
|
||||
60
spring-data-neo4j-examples/todos/bin/todo
Executable file
60
spring-data-neo4j-examples/todos/bin/todo
Executable file
@@ -0,0 +1,60 @@
|
||||
#!/bin/sh
|
||||
|
||||
while getopts ":r" opt; do
|
||||
case $opt in
|
||||
r)
|
||||
export APP_URL=`heroku info --raw | sed -n 's/^web_url=\(.*\)$/\1/p'`
|
||||
;;
|
||||
\?)
|
||||
echo "Invalid option: -$OPTARG" >&2
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
APP_URL=${APP_URL:="http://localhost:8080/"}
|
||||
REST_ENDPOINT="${APP_URL}api/todos"
|
||||
CURL_OPTS="--verbose --fail -H Accept:application/json -H Content-Type:application/json"
|
||||
|
||||
list() {
|
||||
curl ${CURL_OPTS} ${REST_ENDPOINT}
|
||||
}
|
||||
|
||||
make() {
|
||||
TITLE=$1
|
||||
curl -d "{ \"title\" :\"${TITLE}\"}" ${CURL_OPTS} ${REST_ENDPOINT}
|
||||
}
|
||||
|
||||
remove() {
|
||||
ID=$1
|
||||
REST_ENDPOINT="${REST_ENDPOINT}/${ID}"
|
||||
curl -X DELETE ${CURL_OPTS} ${REST_ENDPOINT}
|
||||
}
|
||||
|
||||
usage() {
|
||||
echo "Usage: $0 { list | mk | rm }"
|
||||
}
|
||||
|
||||
if [ "$1" == "" ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
case "$1" in
|
||||
list)
|
||||
list
|
||||
;;
|
||||
|
||||
mk)
|
||||
if [ "$2" == "" ]; then usage; echo " mk \"text\""; exit 1; fi
|
||||
make "$2"
|
||||
;;
|
||||
rm)
|
||||
if [ "$2" == "" ]; then usage; echo " rm {id}"; exit 1; fi
|
||||
remove "$2"
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
362
spring-data-neo4j-examples/todos/pom.xml
Normal file
362
spring-data-neo4j-examples/todos/pom.xml
Normal file
@@ -0,0 +1,362 @@
|
||||
<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>org.neo4j.app</groupId>
|
||||
<artifactId>sdn-todos</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>sdn-todos</name>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<neo4j.version>1.5</neo4j.version>
|
||||
<spring.version>3.0.6.RELEASE</spring.version>
|
||||
<spring-data-neo4j.version>2.0.0.RC1</spring-data-neo4j.version>
|
||||
<aspectj.version>1.6.12</aspectj.version>
|
||||
<slf4j.version>1.6.1</slf4j.version>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>spring-maven-release</id>
|
||||
<name>Spring Maven Release Repository</name>
|
||||
<url>http://maven.springframework.org/release</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>neo4j-public-repository</id>
|
||||
<url>http://m2.neo4j.org/</url>
|
||||
<name>Publicly available Maven 2 repository for Neo4j</name>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>spring-maven-milestone</id>
|
||||
<url>http://maven.springframework.org/milestone</url>
|
||||
<name>Spring Framework Maven MILESTONE Repository</name>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>spring-maven-snapshot</id>
|
||||
<url>http://maven.springframework.org/snapshot</url>
|
||||
<name>Springframework Maven SNAPSHOT Repository</name>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>spring-maven-release</id>
|
||||
<name>Spring Maven Release Repository</name>
|
||||
<url>http://maven.springframework.org/release</url>
|
||||
</pluginRepository>
|
||||
<pluginRepository>
|
||||
<id>spring-maven-milestone</id>
|
||||
<name>Spring Maven Milestone Repository</name>
|
||||
<url>http://maven.springframework.org/milestone</url>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
<dependencies>
|
||||
<!-- General dependencies for any application -->
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.8.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.16</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>${slf4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>jcl-over-slf4j</artifactId>
|
||||
<version>${slf4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-log4j12</artifactId>
|
||||
<version>${slf4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.aspectj</groupId>
|
||||
<artifactId>aspectjrt</artifactId>
|
||||
<version>${aspectj.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.aspectj</groupId>
|
||||
<artifactId>aspectjweaver</artifactId>
|
||||
<version>${aspectj.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>servlet-api</artifactId>
|
||||
<version>2.5</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sf.flexjson</groupId>
|
||||
<artifactId>flexjson</artifactId>
|
||||
<version>2.1</version>
|
||||
</dependency>
|
||||
<!-- self-hosting servlet dependencies -->
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-webapp</artifactId>
|
||||
<version>7.4.4.v20110707</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mortbay.jetty</groupId>
|
||||
<artifactId>jsp-2.1-glassfish</artifactId>
|
||||
<version>2.1.v20100127</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring dependencies -->
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-core</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-test</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-context</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-aop</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-aspects</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-tx</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.data</groupId>
|
||||
<artifactId>spring-data-neo4j-aspects</artifactId>
|
||||
<version>${spring-data-neo4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.data</groupId>
|
||||
<artifactId>spring-data-neo4j-rest</artifactId>
|
||||
<version>${spring-data-neo4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.validation</groupId>
|
||||
<artifactId>validation-api</artifactId>
|
||||
<version>1.0.0.GA</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.neo4j</groupId>
|
||||
<artifactId>neo4j</artifactId>
|
||||
<version>${neo4j.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.neo4j</groupId>
|
||||
<artifactId>neo4j-udc</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-web</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
<classifier />
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-webmvc</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
<classifier />
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>appassembler-maven-plugin</artifactId>
|
||||
<version>1.1.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals><goal>assemble</goal></goals>
|
||||
<configuration>
|
||||
<assembleDirectory>target</assembleDirectory>
|
||||
<extraJvmArguments>-Xmx512m</extraJvmArguments>
|
||||
<programs>
|
||||
<program>
|
||||
<mainClass>Main</mainClass>
|
||||
<name>webapp</name>
|
||||
</program>
|
||||
</programs>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.3.2</version>
|
||||
<configuration>
|
||||
<source>1.6</source>
|
||||
<target>1.6</target>
|
||||
<encoding>UTF-8</encoding>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>aspectj-maven-plugin</artifactId>
|
||||
<version>1.2</version> <!-- NB: do use 1.3 or 1.3.x due to MASPECTJ-90 - wait for 1.4 -->
|
||||
<dependencies>
|
||||
<!-- NB: You must use Maven 2.0.9 or above or these are ignored (see
|
||||
MNG-2972) -->
|
||||
<dependency>
|
||||
<groupId>org.aspectj</groupId>
|
||||
<artifactId>aspectjrt</artifactId>
|
||||
<version>${aspectj.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.aspectj</groupId>
|
||||
<artifactId>aspectjtools</artifactId>
|
||||
<version>${aspectj.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>compile</goal>
|
||||
<goal>test-compile</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<outxml>true</outxml>
|
||||
<aspectLibraries>
|
||||
<aspectLibrary>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-aspects</artifactId>
|
||||
</aspectLibrary>
|
||||
<aspectLibrary>
|
||||
<groupId>org.springframework.data</groupId>
|
||||
<artifactId>spring-data-neo4j-aspects</artifactId>
|
||||
</aspectLibrary>
|
||||
</aspectLibraries>
|
||||
<source>1.6</source>
|
||||
<target>1.6</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<version>2.5</version>
|
||||
<configuration>
|
||||
<encoding>UTF-8</encoding>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.8</version>
|
||||
<configuration>
|
||||
<printSummary>false</printSummary>
|
||||
<redirectTestOutputToFile>true</redirectTestOutputToFile>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!-- IDE -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-eclipse-plugin</artifactId>
|
||||
<version>2.7</version> <!-- Note 2.8 does not work with AspectJ aspect path -->
|
||||
<configuration>
|
||||
<downloadSources>true</downloadSources>
|
||||
<downloadJavadocs>false</downloadJavadocs>
|
||||
<wtpversion>2.0</wtpversion>
|
||||
<additionalBuildcommands>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.ajdt.core.ajbuilder</name>
|
||||
<arguments>
|
||||
<aspectPath>org.springframework.aspects</aspectPath>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.springframework.ide.eclipse.core.springbuilder</name>
|
||||
</buildCommand>
|
||||
</additionalBuildcommands>
|
||||
<additionalProjectnatures>
|
||||
<projectnature>org.eclipse.ajdt.ui.ajnature</projectnature>
|
||||
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
|
||||
</additionalProjectnatures>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-idea-plugin</artifactId>
|
||||
<version>2.2</version>
|
||||
<configuration>
|
||||
<downloadSources>true</downloadSources>
|
||||
<dependenciesAsLibraries>true</dependenciesAsLibraries>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>tomcat-maven-plugin</artifactId>
|
||||
<version>1.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.mortbay.jetty</groupId>
|
||||
<artifactId>jetty-maven-plugin</artifactId>
|
||||
<version>7.4.2.v20110526</version>
|
||||
<configuration>
|
||||
<webAppConfig>
|
||||
<contextPath>/${project.name}</contextPath>
|
||||
</webAppConfig>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
87
spring-data-neo4j-examples/todos/readme.md
Normal file
87
spring-data-neo4j-examples/todos/readme.md
Normal file
@@ -0,0 +1,87 @@
|
||||
Spring Data Neo4j Todos
|
||||
=======================
|
||||
|
||||
A simple todo list using Spring Data Neo4j, configured for easy deployment to Heroku.
|
||||
|
||||
Get Ready
|
||||
---------
|
||||
|
||||
To prepare for deploying to Heroku, you must first become a Hero:
|
||||
|
||||
* Create an account on [Heroku](http://heroku.com)
|
||||
* Install the `heroku` command-line client
|
||||
* See the [Heroku Quickstart](http://devcenter.heroku.com/articles/quickstart) for details
|
||||
|
||||
Feel ready? OK, then get a copy of this project and checkout the heroku-deploy branch:
|
||||
|
||||
```bash
|
||||
git clone git://github.com/akollegger/sdn-todos.git
|
||||
cd sdn-todos
|
||||
git checkout heroku-deploy
|
||||
```
|
||||
|
||||
Local build and run
|
||||
-------------------
|
||||
|
||||
* Run a local Neo4j server (using default config)
|
||||
|
||||
```bash
|
||||
export NEO4J_REST_URL=http://localhost:7474/db/data
|
||||
export NEO4J_LOGIN=""
|
||||
export NEO4J_PASSWORD=""
|
||||
```
|
||||
* Build, then run locally
|
||||
|
||||
```bash
|
||||
mvn package
|
||||
sh target/bin/webapp
|
||||
```
|
||||
|
||||
* check that it is working
|
||||
|
||||
```bash
|
||||
./bin/todo mk "tweet high praises to @neo4j"
|
||||
./bin/todo list
|
||||
```
|
||||
|
||||
Satisfied? Then `ctrl-c` to kill the application.
|
||||
|
||||
|
||||
Deploy on Heroku
|
||||
----------------
|
||||
|
||||
Create a new provisioning stack on Heroku for the app.
|
||||
|
||||
```bash
|
||||
heroku create --stack cedar`
|
||||
heroku addons:add neo4j
|
||||
git push heroku heroku-deploy:master
|
||||
```
|
||||
|
||||
Check to make sure it is running with `heroku ps`, which should show a `web.1` process with an "up" state.
|
||||
|
||||
Finally try it out using the `-r` flag to indicate remote access.
|
||||
|
||||
```bash
|
||||
./bin/todo -r mk "tweet thanks for the good work @mesirii @akollegger"
|
||||
./bin/todo -r list
|
||||
```
|
||||
|
||||
To see the Neo4j graph you just created through Heroku, use `heroku config` to reveal the NEO4J_URL
|
||||
which can take you to Neo4j's Webadmin. Have fun!
|
||||
|
||||
For a detailed play-by-play, read [Becoming a Heroku](https://github.com/akollegger/sdn-todos/wiki/Becoming-a-Hero(ku))
|
||||
|
||||
CLI Tool
|
||||
--------
|
||||
|
||||
A simplistic `todo` script in the `bin` directory can directly create, delete and list todos.
|
||||
|
||||
Usage: todo [-r] [ list | mk | rm ]
|
||||
|
||||
todo -r - access the remote (Heroku) todo application
|
||||
todo list - list current todos
|
||||
todo mk "a new todo" - to create a todo
|
||||
todo rm 1 - to remove the todo with id 1
|
||||
|
||||
|
||||
23
spring-data-neo4j-examples/todos/src/main/java/Main.java
Normal file
23
spring-data-neo4j-examples/todos/src/main/java/Main.java
Normal file
@@ -0,0 +1,23 @@
|
||||
import org.eclipse.jetty.server.Server;
|
||||
import org.eclipse.jetty.webapp.WebAppContext;
|
||||
public class Main
|
||||
{
|
||||
public static void main(String[] args) throws Exception
|
||||
{
|
||||
String webappDirLocation = "src/main/webapp/";
|
||||
String webPort = System.getenv("PORT");
|
||||
if(webPort == null || webPort.isEmpty()) {
|
||||
webPort = "8080";
|
||||
}
|
||||
Server server = new Server(Integer.valueOf(webPort));
|
||||
WebAppContext root = new WebAppContext();
|
||||
root.setContextPath("/");
|
||||
root.setDescriptor(webappDirLocation+"/WEB-INF/web.xml");
|
||||
root.setResourceBase(webappDirLocation);
|
||||
root.setParentLoaderPriority(true);
|
||||
server.setHandler(root);
|
||||
server.start();
|
||||
server.join();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
package org.neo4j.app.todos;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import org.neo4j.graphdb.Node;
|
||||
import org.springframework.beans.factory.annotation.Configurable;
|
||||
import org.springframework.data.neo4j.annotation.GraphId;
|
||||
import org.springframework.data.neo4j.annotation.NodeEntity;
|
||||
|
||||
import flexjson.JSONDeserializer;
|
||||
import flexjson.JSONSerializer;
|
||||
|
||||
@NodeEntity
|
||||
@Configurable
|
||||
public class Todo {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@GraphId
|
||||
private Long id;
|
||||
|
||||
private String title;
|
||||
|
||||
private Boolean isDone = false;
|
||||
|
||||
public Todo() {;}
|
||||
|
||||
public Todo(Node n) {
|
||||
setPersistentState(n);
|
||||
}
|
||||
|
||||
public Long getId() {
|
||||
return getNodeId();
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return this.title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public Boolean getIsDone() {
|
||||
return this.isDone;
|
||||
}
|
||||
|
||||
public void setIsDone(Boolean done) {
|
||||
this.isDone = done;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Done: ").append(getIsDone()).append(", ");
|
||||
sb.append("Title: ").append(getTitle());
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public String toJson() {
|
||||
return new JSONSerializer().exclude("*.class", "*.persistentState", "*.entityState").serialize(this);
|
||||
}
|
||||
|
||||
public static String toJsonArray(Iterable<Todo> collection) {
|
||||
return new JSONSerializer().exclude("*.class", "*.persistentState", "*.entityState").serialize(collection);
|
||||
}
|
||||
|
||||
public static Todo fromJsonToTodo(String json) {
|
||||
return new JSONDeserializer<Todo>().use(null, Todo.class).deserialize(json);
|
||||
}
|
||||
|
||||
public static Collection<Todo> fromJsonArrayToTodoes(String json) {
|
||||
return new JSONDeserializer<List<Todo>>().use(null, ArrayList.class).use("values", Todo.class).deserialize(json);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
package org.neo4j.app.todos;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.util.UriUtils;
|
||||
import org.springframework.web.util.WebUtils;
|
||||
|
||||
@RequestMapping("/todos")
|
||||
@Controller
|
||||
public class TodoController {
|
||||
|
||||
@Autowired TodoRepository todos;
|
||||
|
||||
/**
|
||||
* POST /todos { "title": "text of the todo" }
|
||||
*
|
||||
* Creates a new todo.
|
||||
*
|
||||
* @param json
|
||||
* @return json containing the id of the newly created todo
|
||||
*/
|
||||
@RequestMapping(method = RequestMethod.POST, headers = "Accept=application/json")
|
||||
public ResponseEntity<String> createFromJson(@RequestBody String json) {
|
||||
Todo createdTodo = todos.save(Todo.fromJsonToTodo(json));
|
||||
HttpHeaders headers= new HttpHeaders();
|
||||
headers.add("Content-Type", "application/text");
|
||||
return new ResponseEntity<String>("{\"id\":" + createdTodo.getId() + "}", headers, HttpStatus.CREATED);
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /todos/{id}
|
||||
*
|
||||
* Gets the full json for a todo.
|
||||
*
|
||||
* @param id
|
||||
* @return json representation of the requested todo, or HttpStatus.NOT_FOUND
|
||||
*/
|
||||
@RequestMapping(value = "/{id}", method = RequestMethod.GET, headers = "Accept=application/json")
|
||||
@ResponseBody
|
||||
public ResponseEntity<String> showJson(@PathVariable("id") Long id) {
|
||||
Todo todo = todos.findOne(id);
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.add("Content-Type", "application/text; charset=utf-8");
|
||||
if (todo == null) {
|
||||
return new ResponseEntity<String>(headers, HttpStatus.NOT_FOUND);
|
||||
}
|
||||
return new ResponseEntity<String>(todo.toJson(), headers, HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get /todos/
|
||||
*
|
||||
* Gets a json array of all todos.
|
||||
*
|
||||
* @return json array representation of all todos
|
||||
*/
|
||||
@RequestMapping(headers = "Accept=application/json")
|
||||
@ResponseBody
|
||||
public ResponseEntity<String> listJson() {
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.add("Content-Type", "application/text; charset=utf-8");
|
||||
return new ResponseEntity<String>(Todo.toJsonArray(todos.findAll()), headers, HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* PUT /todos/ { "id": id, "title": "text of todo", idDone: true|false }
|
||||
*
|
||||
* Updates an existing todo.
|
||||
*
|
||||
* @param json full json representation of the todo to update
|
||||
* @return
|
||||
*/
|
||||
@RequestMapping(method = RequestMethod.PUT, headers = "Accept=application/json")
|
||||
public ResponseEntity<String> updateFromJson(@RequestBody String json) {
|
||||
HttpHeaders headers= new HttpHeaders();
|
||||
headers.add("Content-Type", "application/text");
|
||||
if (todos.save(Todo.fromJsonToTodo(json)) == null) {
|
||||
return new ResponseEntity<String>(headers, HttpStatus.NOT_FOUND);
|
||||
}
|
||||
return new ResponseEntity<String>(headers, HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* DELETE /todos/{id}
|
||||
*
|
||||
* Deletes an existing todo.
|
||||
*
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE, headers = "Accept=application/json")
|
||||
public ResponseEntity<String> deleteFromJson(@PathVariable("id") Long id) {
|
||||
Todo todo = todos.findOne(id);
|
||||
HttpHeaders headers= new HttpHeaders();
|
||||
headers.add("Content-Type", "application/text");
|
||||
if (todo == null) {
|
||||
return new ResponseEntity<String>(headers, HttpStatus.NOT_FOUND);
|
||||
}
|
||||
todos.delete(todo);
|
||||
return new ResponseEntity<String>(headers, HttpStatus.OK);
|
||||
}
|
||||
|
||||
String encodeUrlPathSegment(String pathSegment, HttpServletRequest httpServletRequest) {
|
||||
String enc = httpServletRequest.getCharacterEncoding();
|
||||
if (enc == null) {
|
||||
enc = WebUtils.DEFAULT_CHARACTER_ENCODING;
|
||||
}
|
||||
try {
|
||||
pathSegment = UriUtils.encodePathSegment(pathSegment, enc);
|
||||
}
|
||||
catch (UnsupportedEncodingException uee) {}
|
||||
return pathSegment;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package org.neo4j.app.todos;
|
||||
|
||||
import org.springframework.data.neo4j.repository.GraphRepository;
|
||||
|
||||
public interface TodoRepository extends GraphRepository<Todo> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
|
||||
xmlns:tx="http://www.springframework.org/schema/tx"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
||||
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||
http://www.springframework.org/schema/data/neo4j
|
||||
http://www.springframework.org/schema/data/neo4j/spring-neo4j-2.0.xsd
|
||||
http://www.springframework.org/schema/tx
|
||||
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
|
||||
|
||||
<neo4j:repositories base-package="org.neo4j.app.todos"/>
|
||||
<tx:annotation-driven mode="aspectj"/>
|
||||
|
||||
<neo4j:config graphDatabaseService="graphDatabaseService"/>
|
||||
<bean id="graphDatabaseService"
|
||||
class="org.springframework.data.neo4j.rest.SpringRestGraphDatabase">
|
||||
<constructor-arg index="0" value="${NEO4J_REST_URL}" />
|
||||
<constructor-arg index="1" value="${NEO4J_LOGIN}" />
|
||||
<constructor-arg index="2" value="${NEO4J_PASSWORD}" />
|
||||
</bean>
|
||||
|
||||
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,64 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xmlns:jee="http://www.springframework.org/schema/jee"
|
||||
xmlns:tx="http://www.springframework.org/schema/tx"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
|
||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
|
||||
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
|
||||
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
|
||||
|
||||
|
||||
<!--
|
||||
This will automatically locate any and all property files you have
|
||||
within your classpath, provided they fall under the META-INF/spring
|
||||
directory. The located property files are parsed and their values can
|
||||
then be used within application context files in the form of
|
||||
${propertyKey}.
|
||||
-->
|
||||
<context:property-placeholder location="classpath*:META-INF/spring/*.properties"/>
|
||||
|
||||
<!--
|
||||
Turn on AspectJ @Configurable support. As a result, any time you
|
||||
instantiate an object, Spring will attempt to perform dependency
|
||||
injection on that object. This occurs for instantiation via the "new"
|
||||
keyword, as well as via reflection. This is possible because AspectJ
|
||||
is used to "weave" Roo-based applications at compile time. In effect
|
||||
this feature allows dependency injection of any object at all in your
|
||||
system, which is a very useful feature (without @Configurable you'd
|
||||
only be able to dependency inject objects acquired from Spring or
|
||||
subsequently presented to a specific Spring dependency injection
|
||||
method). Roo applications use this useful feature in a number of
|
||||
areas, such as @PersistenceContext injection into entities.
|
||||
-->
|
||||
<context:spring-configured/>
|
||||
|
||||
<!--
|
||||
This declaration will cause Spring to locate every @Component,
|
||||
@Repository and @Service in your application. In practical terms this
|
||||
allows you to write a POJO and then simply annotate the new POJO as an
|
||||
@Service and Spring will automatically detect, instantiate and
|
||||
dependency inject your service at startup time. Importantly, you can
|
||||
then also have your new service injected into any other class that
|
||||
requires it simply by declaring a field for your service inside the
|
||||
relying class and Spring will inject it. Note that two exclude filters
|
||||
are declared. The first ensures that Spring doesn't spend time
|
||||
introspecting Roo-specific ITD aspects. The second ensures Roo doesn't
|
||||
instantiate your @Controller classes, as these should be instantiated
|
||||
by a web tier application context. Refer to web.xml for more details
|
||||
about the web tier application context setup services.
|
||||
|
||||
Furthermore, this turns on @Autowired, @PostConstruct etc support. These
|
||||
annotations allow you to use common Spring and Java Enterprise Edition
|
||||
annotations in your classes without needing to do any special configuration.
|
||||
The most commonly used annotation is @Autowired, which instructs Spring to
|
||||
dependency inject an object into your class.
|
||||
-->
|
||||
<context:component-scan base-package="org.neo4j.app.todos">
|
||||
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
|
||||
</context:component-scan>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,17 @@
|
||||
log4j.rootLogger=error, stdout
|
||||
|
||||
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||
|
||||
# Print the date in ISO 8601 format
|
||||
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
|
||||
|
||||
log4j.appender.R=org.apache.log4j.RollingFileAppender
|
||||
log4j.appender.R.File=application.log
|
||||
|
||||
log4j.appender.R.MaxFileSize=100KB
|
||||
# Keep one backup file
|
||||
log4j.appender.R.MaxBackupIndex=1
|
||||
|
||||
log4j.appender.R.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
|
||||
47
spring-data-neo4j-examples/todos/src/main/webapp/404.html
Executable file
47
spring-data-neo4j-examples/todos/src/main/webapp/404.html
Executable file
@@ -0,0 +1,47 @@
|
||||
<!DOCTYPE html>
|
||||
<!--[if lt IE 7 ]><html class="ie ie6" lang="en"> <![endif]-->
|
||||
<!--[if IE 7 ]><html class="ie ie7" lang="en"> <![endif]-->
|
||||
<!--[if IE 8 ]><html class="ie ie8" lang="en"> <![endif]-->
|
||||
<!--[if (gte IE 9)|!(IE)]><!--><html lang="en"> <!--<![endif]-->
|
||||
<head>
|
||||
|
||||
<!-- Basic Page Needs
|
||||
================================================== -->
|
||||
<meta charset="utf-8">
|
||||
<title>Your Page Title Here :)</title>
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
<!--[if lt IE 9]>
|
||||
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<!-- Mobile Specific Metas
|
||||
================================================== -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
|
||||
<!-- CSS
|
||||
================================================== -->
|
||||
<link rel="stylesheet" href="stylesheets/base.css">
|
||||
<link rel="stylesheet" href="stylesheets/skeleton.css">
|
||||
<link rel="stylesheet" href="stylesheets/layout.css">
|
||||
|
||||
<!-- Favicons
|
||||
================================================== -->
|
||||
<link rel="shortcut icon" href="images/favicon.ico">
|
||||
<link rel="apple-touch-icon" href="images/apple-touch-icon.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- Primary Page Layout
|
||||
================================================== -->
|
||||
<div class="container">
|
||||
<h1 style="margin-top: 100px; text-align:center">Sorry. Couldn't Find That Page!</h1>
|
||||
</div>
|
||||
|
||||
<!-- End Document
|
||||
================================================== -->
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1 @@
|
||||
styleSheet=resources/styles/alt.css
|
||||
@@ -0,0 +1 @@
|
||||
styleSheet=resources/styles/standard.css
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
|
||||
|
||||
<!-- The controllers are autodetected POJOs labeled with the @Controller annotation. -->
|
||||
<context:component-scan base-package="org.neo4j.app.todos" use-default-filters="false">
|
||||
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
|
||||
</context:component-scan>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,88 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
|
||||
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
|
||||
|
||||
|
||||
<display-name>sdn-todos</display-name>
|
||||
|
||||
<description>Neo4j SDN Todo Application</description>
|
||||
|
||||
|
||||
<!-- Enable escaping of form submission contents -->
|
||||
<context-param>
|
||||
<param-name>defaultHtmlEscape</param-name>
|
||||
<param-value>true</param-value>
|
||||
</context-param>
|
||||
|
||||
<context-param>
|
||||
<param-name>contextConfigLocation</param-name>
|
||||
<param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
|
||||
</context-param>
|
||||
|
||||
<filter>
|
||||
<filter-name>CharacterEncodingFilter</filter-name>
|
||||
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
|
||||
<init-param>
|
||||
<param-name>encoding</param-name>
|
||||
<param-value>UTF-8</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<param-name>forceEncoding</param-name>
|
||||
<param-value>true</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
|
||||
|
||||
|
||||
<filter>
|
||||
<filter-name>HttpMethodFilter</filter-name>
|
||||
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
|
||||
</filter>
|
||||
<filter-mapping>
|
||||
<filter-name>CharacterEncodingFilter</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
<filter-mapping>
|
||||
<filter-name>HttpMethodFilter</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
<!-- Creates the Spring Container shared by all Servlets and Filters -->
|
||||
<listener>
|
||||
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
|
||||
</listener>
|
||||
|
||||
<!-- Handles Spring requests -->
|
||||
<servlet>
|
||||
<servlet-name>dispatcher</servlet-name>
|
||||
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
|
||||
<init-param>
|
||||
<param-name>contextConfigLocation</param-name>
|
||||
<param-value>/WEB-INF/spring/webmvc-config.xml</param-value>
|
||||
</init-param>
|
||||
<load-on-startup>1</load-on-startup>
|
||||
</servlet>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>dispatcher</servlet-name>
|
||||
<url-pattern>/api/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<session-config>
|
||||
<session-timeout>10</session-timeout>
|
||||
</session-config>
|
||||
|
||||
<welcome-file-list>
|
||||
<welcome-file>index.jsp</welcome-file>
|
||||
</welcome-file-list>
|
||||
|
||||
<error-page>
|
||||
<exception-type>java.lang.Exception</exception-type>
|
||||
<location>/uncaughtException</location>
|
||||
</error-page>
|
||||
|
||||
<error-page>
|
||||
<error-code>404</error-code>
|
||||
<location>/resourceNotFound</location>
|
||||
</error-page>
|
||||
</web-app>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 4.0 KiB |
BIN
spring-data-neo4j-examples/todos/src/main/webapp/images/apple-touch-icon.png
Executable file
BIN
spring-data-neo4j-examples/todos/src/main/webapp/images/apple-touch-icon.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 7.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
107
spring-data-neo4j-examples/todos/src/main/webapp/index.jsp
Normal file
107
spring-data-neo4j-examples/todos/src/main/webapp/index.jsp
Normal file
@@ -0,0 +1,107 @@
|
||||
<!DOCTYPE html>
|
||||
<!--[if lt IE 7 ]><html class="ie ie6" lang="en"> <![endif]-->
|
||||
<!--[if IE 7 ]><html class="ie ie7" lang="en"> <![endif]-->
|
||||
<!--[if IE 8 ]><html class="ie ie8" lang="en"> <![endif]-->
|
||||
<!--[if (gte IE 9)|!(IE)]><!--><html lang="en"> <!--<![endif]-->
|
||||
<head>
|
||||
|
||||
<!-- Basic Page Needs
|
||||
================================================== -->
|
||||
<meta charset="utf-8">
|
||||
<title>SDN Todos</title>
|
||||
<meta name="description" content="An SDN Demo Application">
|
||||
<meta name="author" content="Andreas Kollegger">
|
||||
<!--[if lt IE 9]>
|
||||
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<!-- Mobile Specific Metas
|
||||
================================================== -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
|
||||
<!-- CSS
|
||||
================================================== -->
|
||||
<link rel="stylesheet" href="stylesheets/base.css">
|
||||
<link rel="stylesheet" href="stylesheets/skeleton.css">
|
||||
<link rel="stylesheet" href="stylesheets/layout.css">
|
||||
|
||||
<!-- Favicons
|
||||
================================================== -->
|
||||
<link rel="shortcut icon" href="images/favicon.ico">
|
||||
<link rel="apple-touch-icon" href="images/apple-touch-icon.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
|
||||
<!-- Primary Page Layout
|
||||
================================================== -->
|
||||
|
||||
<!-- Delete everything in this .container and get started on your own site! -->
|
||||
|
||||
<div class="container">
|
||||
<div class="sixteen columns">
|
||||
<h1 class="remove-bottom" style="margin-top: 40px">Spring Data Neo4j: Todos</h1>
|
||||
<h5>heroku-deploy</h5>
|
||||
<hr />
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="one-third column">
|
||||
<h3>About SDN Todos</h3>
|
||||
<p>SDN Todos is a small demonstration application of Spring Data Neo4j. SDN is used to define a simple 'Todo' domain entity, exposed with a JSON endpoint.
|
||||
Inspired by the SproutCore (now <a href="http://www.emberjs.com/">ember.js</a>) demo application, this was originally intended as a server-side
|
||||
companion using Neo4j. Now, it is a headless baseline implementation with a simple CLI.
|
||||
</p>
|
||||
</div>
|
||||
<div class="one-third column">
|
||||
<h3>Highlights</h3>
|
||||
<p>SDN Todos is small, yet demonstrative:</p>
|
||||
<ul class="square">
|
||||
<li><strong>Spring Data Neo4j simplicity</strong>: annotated POJO, companion Repository and MVC controller</li>
|
||||
<li><strong>Heroku ready</strong>: run locally, or easily deploy into the cloud</li>
|
||||
<li><strong>CLI clarity</strong>: no distracting UI, just simple tooling</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="one-third column">
|
||||
<h3>Docs & Support</h3>
|
||||
<p>To learn more about developing with Spring Data Neo4j, visit <a href="https://spring.neo4j.org">spring.neo4j.org</a>.
|
||||
For questions or comments, join us on the <a href="http://groups.google.com/group/neo4j">Neo4j google group</a>.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- UI -->
|
||||
<div class="row">
|
||||
<h5>Todos (a simply jquery pull from the json endpoint):</h5>
|
||||
|
||||
<div id="todos">
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
</div>
|
||||
|
||||
<!-- footer -->
|
||||
<div class="row">
|
||||
<div class="eight columns">
|
||||
<a href="http://neo4j.org"><image src="images/icon_neo4j.png"/></a>
|
||||
</div>
|
||||
<div class="eight columns">
|
||||
<a href="http://spring.neo4j.org"><image style="float:right" src="images/icon_sdn.png"/></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- container -->
|
||||
|
||||
|
||||
|
||||
<!-- JS
|
||||
================================================== -->
|
||||
<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
|
||||
<script src="javascripts/sdn-todos.js"></script>
|
||||
|
||||
<!-- End Document
|
||||
================================================== -->
|
||||
</body>
|
||||
</html>
|
||||
25
spring-data-neo4j-examples/todos/src/main/webapp/javascripts/sdn-todos.js
Executable file
25
spring-data-neo4j-examples/todos/src/main/webapp/javascripts/sdn-todos.js
Executable file
@@ -0,0 +1,25 @@
|
||||
$(document).ready(function() {
|
||||
|
||||
$.ajaxSetup ({
|
||||
cache: false
|
||||
});
|
||||
|
||||
var jsonUrl = "api/todos";
|
||||
|
||||
$.getJSON(
|
||||
jsonUrl,
|
||||
function(json) {
|
||||
var items = [];
|
||||
|
||||
$.each(json, function(i, todo) {
|
||||
items.push('<li>' + todo.title + '</li>');
|
||||
});
|
||||
|
||||
$('<ul/>', {
|
||||
'class': 'disc',
|
||||
html: items.join('')
|
||||
}).appendTo('div#todos');
|
||||
}
|
||||
);
|
||||
|
||||
});
|
||||
42
spring-data-neo4j-examples/todos/src/main/webapp/javascripts/tabs.js
Executable file
42
spring-data-neo4j-examples/todos/src/main/webapp/javascripts/tabs.js
Executable file
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Skeleton V1.1
|
||||
* Copyright 2011, Dave Gamache
|
||||
* www.getskeleton.com
|
||||
* Free to use under the MIT license.
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* 8/17/2011
|
||||
*/
|
||||
|
||||
|
||||
$(document).ready(function() {
|
||||
|
||||
/* Tabs Activiation
|
||||
================================================== */
|
||||
|
||||
var tabs = $('ul.tabs');
|
||||
|
||||
tabs.each(function(i) {
|
||||
|
||||
//Get all tabs
|
||||
var tab = $(this).find('> li > a');
|
||||
tab.click(function(e) {
|
||||
|
||||
//Get Location of tab's content
|
||||
var contentLocation = $(this).attr('href');
|
||||
|
||||
//Let go if not a hashed one
|
||||
if(contentLocation.charAt(0)=="#") {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
//Make Tab Active
|
||||
tab.removeClass('active');
|
||||
$(this).addClass('active');
|
||||
|
||||
//Show Tab Content & add active class
|
||||
$(contentLocation).show().addClass('active').siblings().hide().removeClass('active');
|
||||
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,17 @@
|
||||
log4j.rootLogger=error, stdout
|
||||
|
||||
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||
|
||||
# Print the date in ISO 8601 format
|
||||
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
|
||||
|
||||
log4j.appender.R=org.apache.log4j.RollingFileAppender
|
||||
log4j.appender.R.File=application.log
|
||||
|
||||
log4j.appender.R.MaxFileSize=100KB
|
||||
# Keep one backup file
|
||||
log4j.appender.R.MaxBackupIndex=1
|
||||
|
||||
log4j.appender.R.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
|
||||
5
spring-data-neo4j-examples/todos/src/main/webapp/robots.txt
Executable file
5
spring-data-neo4j-examples/todos/src/main/webapp/robots.txt
Executable file
@@ -0,0 +1,5 @@
|
||||
# www.robotstxt.org/
|
||||
# www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449
|
||||
|
||||
User-agent: *
|
||||
|
||||
338
spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/base.css
Executable file
338
spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/base.css
Executable file
@@ -0,0 +1,338 @@
|
||||
/*
|
||||
* Skeleton V1.1
|
||||
* Copyright 2011, Dave Gamache
|
||||
* www.getskeleton.com
|
||||
* Free to use under the MIT license.
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* 8/17/2011
|
||||
*/
|
||||
|
||||
|
||||
/* Table of Content
|
||||
==================================================
|
||||
#Reset & Basics
|
||||
#Basic Styles
|
||||
#Site Styles
|
||||
#Typography
|
||||
#Links
|
||||
#Lists
|
||||
#Images
|
||||
#Buttons
|
||||
#Tabs
|
||||
#Forms
|
||||
#Misc */
|
||||
|
||||
|
||||
/* #Reset & Basics (Inspired by E. Meyers)
|
||||
================================================== */
|
||||
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-size: 100%;
|
||||
font: inherit;
|
||||
vertical-align: baseline; }
|
||||
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
|
||||
display: block; }
|
||||
body {
|
||||
line-height: 1; }
|
||||
ol, ul {
|
||||
list-style: none; }
|
||||
blockquote, q {
|
||||
quotes: none; }
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {
|
||||
content: '';
|
||||
content: none; }
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
|
||||
/* #Basic Styles
|
||||
================================================== */
|
||||
body {
|
||||
background: #fff;
|
||||
font: 14px/21px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
color: #444;
|
||||
-webkit-font-smoothing: antialiased; /* Fix for webkit rendering */
|
||||
-webkit-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
|
||||
/* #Typography
|
||||
================================================== */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: #181818;
|
||||
font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif;
|
||||
font-weight: normal; }
|
||||
h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { font-weight: inherit; }
|
||||
h1 { font-size: 46px; line-height: 50px; margin-bottom: 14px;}
|
||||
h2 { font-size: 35px; line-height: 40px; margin-bottom: 10px; }
|
||||
h3 { font-size: 28px; line-height: 34px; margin-bottom: 8px; }
|
||||
h4 { font-size: 21px; line-height: 30px; margin-bottom: 4px; }
|
||||
h5 { font-size: 17px; line-height: 24px; }
|
||||
h6 { font-size: 14px; line-height: 21px; }
|
||||
.subheader { color: #777; }
|
||||
|
||||
p { margin: 0 0 20px 0; }
|
||||
p img { margin: 0; }
|
||||
p.lead { font-size: 21px; line-height: 27px; color: #777; }
|
||||
|
||||
em { font-style: italic; }
|
||||
strong { font-weight: bold; color: #333; }
|
||||
small { font-size: 80%; }
|
||||
|
||||
/* Blockquotes */
|
||||
blockquote, blockquote p { font-size: 17px; line-height: 24px; color: #777; font-style: italic; }
|
||||
blockquote { margin: 0 0 20px; padding: 9px 20px 0 19px; border-left: 1px solid #ddd; }
|
||||
blockquote cite { display: block; font-size: 12px; color: #555; }
|
||||
blockquote cite:before { content: "\2014 \0020"; }
|
||||
blockquote cite a, blockquote cite a:visited, blockquote cite a:visited { color: #555; }
|
||||
|
||||
hr { border: solid #ddd; border-width: 1px 0 0; clear: both; margin: 10px 0 30px; height: 0; }
|
||||
|
||||
|
||||
/* #Links
|
||||
================================================== */
|
||||
a, a:visited { color: #333; text-decoration: underline; outline: 0; }
|
||||
a:hover, a:focus { color: #000; }
|
||||
p a, p a:visited { line-height: inherit; }
|
||||
|
||||
|
||||
/* #Lists
|
||||
================================================== */
|
||||
ul, ol { margin-bottom: 20px; }
|
||||
ul { list-style: none outside; }
|
||||
ol { list-style: decimal; }
|
||||
ol, ul.square, ul.circle, ul.disc { margin-left: 30px; }
|
||||
ul.square { list-style: square outside; }
|
||||
ul.circle { list-style: circle outside; }
|
||||
ul.disc { list-style: disc outside; }
|
||||
ul ul, ul ol,
|
||||
ol ol, ol ul { margin: 4px 0 5px 30px; font-size: 90%; }
|
||||
ul ul li, ul ol li,
|
||||
ol ol li, ol ul li { margin-bottom: 6px; }
|
||||
li { line-height: 18px; margin-bottom: 12px; }
|
||||
ul.large li { line-height: 21px; }
|
||||
li p { line-height: 21px; }
|
||||
|
||||
/* #Images
|
||||
================================================== */
|
||||
|
||||
img.scale-with-grid {
|
||||
max-width: 100%;
|
||||
height: auto; }
|
||||
|
||||
|
||||
/* #Buttons
|
||||
================================================== */
|
||||
|
||||
a.button,
|
||||
button,
|
||||
input[type="submit"],
|
||||
input[type="reset"],
|
||||
input[type="button"] {
|
||||
background: #eee; /* Old browsers */
|
||||
background: #eee -moz-linear-gradient(top, rgba(255,255,255,.2) 0%, rgba(0,0,0,.2) 100%); /* FF3.6+ */
|
||||
background: #eee -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.2)), color-stop(100%,rgba(0,0,0,.2))); /* Chrome,Safari4+ */
|
||||
background: #eee -webkit-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Chrome10+,Safari5.1+ */
|
||||
background: #eee -o-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Opera11.10+ */
|
||||
background: #eee -ms-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* IE10+ */
|
||||
background: #eee linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* W3C */
|
||||
border: 1px solid #aaa;
|
||||
border-top: 1px solid #ccc;
|
||||
border-left: 1px solid #ccc;
|
||||
padding: 4px 12px;
|
||||
-moz-border-radius: 3px;
|
||||
-webkit-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
color: #444;
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
text-shadow: 0 1px rgba(255, 255, 255, .75);
|
||||
cursor: pointer;
|
||||
margin-bottom: 20px;
|
||||
line-height: 21px;
|
||||
font-family: "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; }
|
||||
|
||||
a.button:hover,
|
||||
button:hover,
|
||||
input[type="submit"]:hover,
|
||||
input[type="reset"]:hover,
|
||||
input[type="button"]:hover {
|
||||
color: #222;
|
||||
background: #ddd; /* Old browsers */
|
||||
background: #ddd -moz-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); /* FF3.6+ */
|
||||
background: #ddd -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.3)), color-stop(100%,rgba(0,0,0,.3))); /* Chrome,Safari4+ */
|
||||
background: #ddd -webkit-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Chrome10+,Safari5.1+ */
|
||||
background: #ddd -o-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Opera11.10+ */
|
||||
background: #ddd -ms-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* IE10+ */
|
||||
background: #ddd linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* W3C */
|
||||
border: 1px solid #888;
|
||||
border-top: 1px solid #aaa;
|
||||
border-left: 1px solid #aaa; }
|
||||
|
||||
a.button:active,
|
||||
button:active,
|
||||
input[type="submit"]:active,
|
||||
input[type="reset"]:active,
|
||||
input[type="button"]:active {
|
||||
border: 1px solid #666;
|
||||
background: #ccc; /* Old browsers */
|
||||
background: #ccc -moz-linear-gradient(top, rgba(255,255,255,.35) 0%, rgba(10,10,10,.4) 100%); /* FF3.6+ */
|
||||
background: #ccc -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.35)), color-stop(100%,rgba(10,10,10,.4))); /* Chrome,Safari4+ */
|
||||
background: #ccc -webkit-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Chrome10+,Safari5.1+ */
|
||||
background: #ccc -o-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Opera11.10+ */
|
||||
background: #ccc -ms-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* IE10+ */
|
||||
background: #ccc linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* W3C */ }
|
||||
|
||||
.button.full-width,
|
||||
button.full-width,
|
||||
input[type="submit"].full-width,
|
||||
input[type="reset"].full-width,
|
||||
input[type="button"].full-width {
|
||||
width: 100%;
|
||||
padding-left: 0 !important;
|
||||
padding-right: 0 !important;
|
||||
text-align: center; }
|
||||
|
||||
|
||||
/* #Tabs (activate in tabs.js)
|
||||
================================================== */
|
||||
ul.tabs {
|
||||
display: block;
|
||||
margin: 0 0 20px 0;
|
||||
padding: 0;
|
||||
border-bottom: solid 1px #ddd; }
|
||||
ul.tabs li {
|
||||
display: block;
|
||||
width: auto;
|
||||
height: 30px;
|
||||
padding: 0;
|
||||
float: left;
|
||||
margin-bottom: 0; }
|
||||
ul.tabs li a {
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
width: auto;
|
||||
height: 29px;
|
||||
padding: 0px 20px;
|
||||
line-height: 30px;
|
||||
border: solid 1px #ddd;
|
||||
border-width: 1px 1px 0 0;
|
||||
margin: 0;
|
||||
background: #f5f5f5;
|
||||
font-size: 13px; }
|
||||
ul.tabs li a.active {
|
||||
background: #fff;
|
||||
height: 30px;
|
||||
position: relative;
|
||||
top: -4px;
|
||||
padding-top: 4px;
|
||||
border-left-width: 1px;
|
||||
margin: 0 0 0 -1px;
|
||||
color: #111;
|
||||
-moz-border-radius-topleft: 2px;
|
||||
-webkit-border-top-left-radius: 2px;
|
||||
border-top-left-radius: 2px;
|
||||
-moz-border-radius-topright: 2px;
|
||||
-webkit-border-top-right-radius: 2px;
|
||||
border-top-right-radius: 2px; }
|
||||
ul.tabs li:first-child a.active {
|
||||
margin-left: 0; }
|
||||
ul.tabs li:first-child a {
|
||||
border-width: 1px 1px 0 1px;
|
||||
-moz-border-radius-topleft: 2px;
|
||||
-webkit-border-top-left-radius: 2px;
|
||||
border-top-left-radius: 2px; }
|
||||
ul.tabs li:last-child a {
|
||||
-moz-border-radius-topright: 2px;
|
||||
-webkit-border-top-right-radius: 2px;
|
||||
border-top-right-radius: 2px; }
|
||||
|
||||
ul.tabs-content { margin: 0; display: block; }
|
||||
ul.tabs-content > li { display:none; }
|
||||
ul.tabs-content > li.active { display: block; }
|
||||
|
||||
/* Clearfixing tabs for beautiful stacking */
|
||||
ul.tabs:before,
|
||||
ul.tabs:after {
|
||||
content: '\0020';
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
visibility: hidden;
|
||||
width: 0;
|
||||
height: 0; }
|
||||
ul.tabs:after {
|
||||
clear: both; }
|
||||
ul.tabs {
|
||||
zoom: 1; }
|
||||
|
||||
|
||||
/* #Forms
|
||||
================================================== */
|
||||
|
||||
form {
|
||||
margin-bottom: 20px; }
|
||||
fieldset {
|
||||
margin-bottom: 20px; }
|
||||
input[type="text"],
|
||||
input[type="password"],
|
||||
input[type="email"],
|
||||
textarea,
|
||||
select {
|
||||
border: 1px solid #ccc;
|
||||
padding: 6px 4px;
|
||||
outline: none;
|
||||
-moz-border-radius: 2px;
|
||||
-webkit-border-radius: 2px;
|
||||
border-radius: 2px;
|
||||
font: 13px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
color: #777;
|
||||
margin: 0;
|
||||
width: 210px;
|
||||
max-width: 100%;
|
||||
display: block;
|
||||
margin-bottom: 20px;
|
||||
background: #fff; }
|
||||
select {
|
||||
padding: 0; }
|
||||
input[type="text"]:focus,
|
||||
input[type="password"]:focus,
|
||||
input[type="email"]:focus,
|
||||
textarea:focus {
|
||||
border: 1px solid #aaa;
|
||||
color: #444;
|
||||
-moz-box-shadow: 0 0 3px rgba(0,0,0,.2);
|
||||
-webkit-box-shadow: 0 0 3px rgba(0,0,0,.2);
|
||||
box-shadow: 0 0 3px rgba(0,0,0,.2); }
|
||||
textarea {
|
||||
min-height: 60px; }
|
||||
label,
|
||||
legend {
|
||||
display: block;
|
||||
font-weight: bold;
|
||||
font-size: 13px; }
|
||||
select {
|
||||
width: 220px; }
|
||||
input[type="checkbox"] {
|
||||
display: inline; }
|
||||
label span,
|
||||
legend span {
|
||||
font-weight: normal;
|
||||
font-size: 13px;
|
||||
color: #444; }
|
||||
|
||||
/* #Misc
|
||||
================================================== */
|
||||
.remove-bottom { margin-bottom: 0 !important; }
|
||||
.half-bottom { margin-bottom: 10px !important; }
|
||||
.add-bottom { margin-bottom: 20px !important; }
|
||||
|
||||
|
||||
/* #SDN styling
|
||||
================================================== */
|
||||
#footer { background: #eee; }
|
||||
58
spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/layout.css
Executable file
58
spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/layout.css
Executable file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Skeleton V1.1
|
||||
* Copyright 2011, Dave Gamache
|
||||
* www.getskeleton.com
|
||||
* Free to use under the MIT license.
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* 8/17/2011
|
||||
*/
|
||||
|
||||
/* Table of Content
|
||||
==================================================
|
||||
#Site Styles
|
||||
#Page Styles
|
||||
#Media Queries
|
||||
#Font-Face */
|
||||
|
||||
/* #Site Styles
|
||||
================================================== */
|
||||
|
||||
/* #Page Styles
|
||||
================================================== */
|
||||
|
||||
/* #Media Queries
|
||||
================================================== */
|
||||
|
||||
/* Smaller than standard 960 (devices and browsers) */
|
||||
@media only screen and (max-width: 959px) {}
|
||||
|
||||
/* Tablet Portrait size to standard 960 (devices and browsers) */
|
||||
@media only screen and (min-width: 768px) and (max-width: 959px) {}
|
||||
|
||||
/* All Mobile Sizes (devices and browser) */
|
||||
@media only screen and (max-width: 767px) {}
|
||||
|
||||
/* Mobile Landscape Size to Tablet Portrait (devices and browsers) */
|
||||
@media only screen and (min-width: 480px) and (max-width: 767px) {}
|
||||
|
||||
/* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */
|
||||
@media only screen and (max-width: 479px) {}
|
||||
|
||||
|
||||
/* #Font-Face
|
||||
================================================== */
|
||||
/* This is the proper syntax for an @font-face file
|
||||
Just create a "fonts" folder at the root,
|
||||
copy your FontName into code below and remove
|
||||
comment brackets */
|
||||
|
||||
/* @font-face {
|
||||
font-family: 'FontName';
|
||||
src: url('../fonts/FontName.eot');
|
||||
src: url('../fonts/FontName.eot?iefix') format('eot'),
|
||||
url('../fonts/FontName.woff') format('woff'),
|
||||
url('../fonts/FontName.ttf') format('truetype'),
|
||||
url('../fonts/FontName.svg#webfontZam02nTh') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal; }
|
||||
*/
|
||||
236
spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/skeleton.css
vendored
Executable file
236
spring-data-neo4j-examples/todos/src/main/webapp/stylesheets/skeleton.css
vendored
Executable file
@@ -0,0 +1,236 @@
|
||||
/*
|
||||
* Skeleton V1.1
|
||||
* Copyright 2011, Dave Gamache
|
||||
* www.getskeleton.com
|
||||
* Free to use under the MIT license.
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* 8/17/2011
|
||||
*/
|
||||
|
||||
|
||||
/* Table of Contents
|
||||
==================================================
|
||||
#Base 960 Grid
|
||||
#Tablet (Portrait)
|
||||
#Mobile (Portrait)
|
||||
#Mobile (Landscape)
|
||||
#Clearing */
|
||||
|
||||
|
||||
|
||||
/* #Base 960 Grid
|
||||
================================================== */
|
||||
|
||||
.container { position: relative; width: 960px; margin: 0 auto; padding: 0; }
|
||||
.column, .columns { float: left; display: inline; margin-left: 10px; margin-right: 10px; }
|
||||
.row { margin-bottom: 20px; }
|
||||
|
||||
/* Nested Column Classes */
|
||||
.column.alpha, .columns.alpha { margin-left: 0; }
|
||||
.column.omega, .columns.omega { margin-right: 0; }
|
||||
|
||||
/* Base Grid */
|
||||
.container .one.column { width: 40px; }
|
||||
.container .two.columns { width: 100px; }
|
||||
.container .three.columns { width: 160px; }
|
||||
.container .four.columns { width: 220px; }
|
||||
.container .five.columns { width: 280px; }
|
||||
.container .six.columns { width: 340px; }
|
||||
.container .seven.columns { width: 400px; }
|
||||
.container .eight.columns { width: 460px; }
|
||||
.container .nine.columns { width: 520px; }
|
||||
.container .ten.columns { width: 580px; }
|
||||
.container .eleven.columns { width: 640px; }
|
||||
.container .twelve.columns { width: 700px; }
|
||||
.container .thirteen.columns { width: 760px; }
|
||||
.container .fourteen.columns { width: 820px; }
|
||||
.container .fifteen.columns { width: 880px; }
|
||||
.container .sixteen.columns { width: 940px; }
|
||||
|
||||
.container .one-third.column { width: 300px; }
|
||||
.container .two-thirds.column { width: 620px; }
|
||||
|
||||
/* Offsets */
|
||||
.container .offset-by-one { padding-left: 60px; }
|
||||
.container .offset-by-two { padding-left: 120px; }
|
||||
.container .offset-by-three { padding-left: 180px; }
|
||||
.container .offset-by-four { padding-left: 240px; }
|
||||
.container .offset-by-five { padding-left: 300px; }
|
||||
.container .offset-by-six { padding-left: 360px; }
|
||||
.container .offset-by-seven { padding-left: 420px; }
|
||||
.container .offset-by-eight { padding-left: 480px; }
|
||||
.container .offset-by-nine { padding-left: 540px; }
|
||||
.container .offset-by-ten { padding-left: 600px; }
|
||||
.container .offset-by-eleven { padding-left: 660px; }
|
||||
.container .offset-by-twelve { padding-left: 720px; }
|
||||
.container .offset-by-thirteen { padding-left: 780px; }
|
||||
.container .offset-by-fourteen { padding-left: 840px; }
|
||||
.container .offset-by-fifteen { padding-left: 900px; }
|
||||
|
||||
|
||||
|
||||
/* #Tablet (Portrait)
|
||||
================================================== */
|
||||
|
||||
/* Note: Design for a width of 768px */
|
||||
|
||||
@media only screen and (min-width: 768px) and (max-width: 959px) {
|
||||
.container { width: 768px; }
|
||||
.container .column,
|
||||
.container .columns { margin-left: 10px; margin-right: 10px; }
|
||||
.column.alpha, .columns.alpha { margin-left: 0; margin-right: 10px; }
|
||||
.column.omega, .columns.omega { margin-right: 0; margin-left: 10px; }
|
||||
|
||||
.container .one.column { width: 28px; }
|
||||
.container .two.columns { width: 76px; }
|
||||
.container .three.columns { width: 124px; }
|
||||
.container .four.columns { width: 172px; }
|
||||
.container .five.columns { width: 220px; }
|
||||
.container .six.columns { width: 268px; }
|
||||
.container .seven.columns { width: 316px; }
|
||||
.container .eight.columns { width: 364px; }
|
||||
.container .nine.columns { width: 412px; }
|
||||
.container .ten.columns { width: 460px; }
|
||||
.container .eleven.columns { width: 508px; }
|
||||
.container .twelve.columns { width: 556px; }
|
||||
.container .thirteen.columns { width: 604px; }
|
||||
.container .fourteen.columns { width: 652px; }
|
||||
.container .fifteen.columns { width: 700px; }
|
||||
.container .sixteen.columns { width: 748px; }
|
||||
|
||||
.container .one-third.column { width: 236px; }
|
||||
.container .two-thirds.column { width: 492px; }
|
||||
|
||||
/* Offsets */
|
||||
.container .offset-by-one { padding-left: 48px; }
|
||||
.container .offset-by-two { padding-left: 96px; }
|
||||
.container .offset-by-three { padding-left: 144px; }
|
||||
.container .offset-by-four { padding-left: 192px; }
|
||||
.container .offset-by-five { padding-left: 240px; }
|
||||
.container .offset-by-six { padding-left: 288px; }
|
||||
.container .offset-by-seven { padding-left: 336px; }
|
||||
.container .offset-by-eight { padding-left: 348px; }
|
||||
.container .offset-by-nine { padding-left: 432px; }
|
||||
.container .offset-by-ten { padding-left: 480px; }
|
||||
.container .offset-by-eleven { padding-left: 528px; }
|
||||
.container .offset-by-twelve { padding-left: 576px; }
|
||||
.container .offset-by-thirteen { padding-left: 624px; }
|
||||
.container .offset-by-fourteen { padding-left: 672px; }
|
||||
.container .offset-by-fifteen { padding-left: 720px; }
|
||||
}
|
||||
|
||||
|
||||
/* #Mobile (Portrait)
|
||||
================================================== */
|
||||
|
||||
/* Note: Design for a width of 320px */
|
||||
|
||||
@media only screen and (max-width: 767px) {
|
||||
.container { width: 300px; }
|
||||
.columns, .column { margin: 0; }
|
||||
|
||||
.container .one.column,
|
||||
.container .two.columns,
|
||||
.container .three.columns,
|
||||
.container .four.columns,
|
||||
.container .five.columns,
|
||||
.container .six.columns,
|
||||
.container .seven.columns,
|
||||
.container .eight.columns,
|
||||
.container .nine.columns,
|
||||
.container .ten.columns,
|
||||
.container .eleven.columns,
|
||||
.container .twelve.columns,
|
||||
.container .thirteen.columns,
|
||||
.container .fourteen.columns,
|
||||
.container .fifteen.columns,
|
||||
.container .sixteen.columns,
|
||||
.container .one-third.column,
|
||||
.container .two-thirds.column { width: 300px; }
|
||||
|
||||
/* Offsets */
|
||||
.container .offset-by-one,
|
||||
.container .offset-by-two,
|
||||
.container .offset-by-three,
|
||||
.container .offset-by-four,
|
||||
.container .offset-by-five,
|
||||
.container .offset-by-six,
|
||||
.container .offset-by-seven,
|
||||
.container .offset-by-eight,
|
||||
.container .offset-by-nine,
|
||||
.container .offset-by-ten,
|
||||
.container .offset-by-eleven,
|
||||
.container .offset-by-twelve,
|
||||
.container .offset-by-thirteen,
|
||||
.container .offset-by-fourteen,
|
||||
.container .offset-by-fifteen { padding-left: 0; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* #Mobile (Landscape)
|
||||
================================================== */
|
||||
|
||||
/* Note: Design for a width of 480px */
|
||||
|
||||
@media only screen and (min-width: 480px) and (max-width: 767px) {
|
||||
.container { width: 420px; }
|
||||
.columns, .column { margin: 0; }
|
||||
|
||||
.container .one.column,
|
||||
.container .two.columns,
|
||||
.container .three.columns,
|
||||
.container .four.columns,
|
||||
.container .five.columns,
|
||||
.container .six.columns,
|
||||
.container .seven.columns,
|
||||
.container .eight.columns,
|
||||
.container .nine.columns,
|
||||
.container .ten.columns,
|
||||
.container .eleven.columns,
|
||||
.container .twelve.columns,
|
||||
.container .thirteen.columns,
|
||||
.container .fourteen.columns,
|
||||
.container .fifteen.columns,
|
||||
.container .sixteen.columns,
|
||||
.container .one-third.column,
|
||||
.container .two-thirds.column { width: 420px; }
|
||||
}
|
||||
|
||||
|
||||
/* #Clearing
|
||||
================================================== */
|
||||
|
||||
/* Self Clearing Goodness */
|
||||
.container:after { content: "\0020"; display: block; height: 0; clear: both; visibility: hidden; }
|
||||
|
||||
/* Use clearfix class on parent to clear nested columns,
|
||||
or wrap each row of columns in a <div class="row"> */
|
||||
.clearfix:before,
|
||||
.clearfix:after,
|
||||
.row:before,
|
||||
.row:after {
|
||||
content: '\0020';
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
visibility: hidden;
|
||||
width: 0;
|
||||
height: 0; }
|
||||
.row:after,
|
||||
.clearfix:after {
|
||||
clear: both; }
|
||||
.row,
|
||||
.clearfix {
|
||||
zoom: 1; }
|
||||
|
||||
/* You can also use a <br class="clear" /> to clear columns */
|
||||
.clear {
|
||||
clear: both;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
visibility: hidden;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user